
Я хочувсемои файлы в файловой системе ext4 не фрагментированы по ряду причин. К сожалению e4defrag
(советуют здесь:Как дефрагментировать файловую систему ext4) не удается дефрагментировать несколько файлов. Какие у меня есть альтернативы?
Файловая система уже содержит все файлы (они не должны изменяться каким-либо образом) и почти заполнена. Есть несколько свободных блоков (согласно df -h
: 434M доступно из 85G и 80G используется), которые можно использовать в качестве буфера. Мне не нужна монтированная файловая система во время дефрагментации. Более того, у меня есть другая файловая система с достаточным пространством для использования в качестве буфера.
Одна из идей, которая у меня возникла, — переместить файлы в другую файловую систему, а затем скопировать их обратно, каким-то образом указав файловой системе хранить их непрерывно.
[РЕДАКТИРОВАТЬ]
Я только что обнаружил, что не могу полагаться на e4defrag
вывод. Он считает файлы с более чем одним экстентом фрагментированными, хотя знает, что экстенты являются смежными:
$ sudo filefrag file.file
file.file: 1 extent found
$ sudo e4defrag -vc file.file
e4defrag 1.45.5 (07-Jan-2020)
<File>
[ext 1]: start 22388736: logical 0: len 32768
[ext 2]: start 22421504: logical 32768: len 32768
[ext 3]: start 22454272: logical 65536: len 32768
[ext 4]: start 22487040: logical 98304: len 27962
Total/best extents 4/1
Average size per extent 126266 KB
Fragmentation score 0
[0-30 no problem: 31-55 a little bit fragmented: 56- needs defrag]
This file (file.file) does not need defragmentation.
Done.
решение1
Я хочу, чтобы все мои файлы в файловой системе ext4 не были фрагментированы по каким-то причинам.
Хотя существуют законные причины для дефрагментации, ни одна из них не требуеткаждыйфайл должен быть дефрагментирован и непрерывен. Основные причины, по которым кто-то может захотеть дефрагментировать каждый файл, связаны с OCPD, что является пустой тратой времени, поскольку файловая система снова станет «фрагментированной» вскоре после монтирования rw.
Файловая система... почти заполнена...
В этом случае вы, вероятно, не сможете дефрагментировать каждый файл, поскольку программы дефрагментации Linux, как правило, работают на уровне файлов, а у вас не обязательно достаточно свободного непрерывного пространства для дефрагментации каждого файла.
У меня есть одна идея — переместить файлы в другую файловую систему, а затем скопировать их обратно...
Это наиболее приемлемый вариант. Однако конкретное размещение файлов определяется драйвером файловой системы.
Для переупорядочивания блоков достаточно иметь один свободный блок в качестве буфера.
Разработчики файловой системы Linux не дали дефрагментации такого же приоритета, как разработчики Windows. Так что проблема не в том, что это технически невозможно, а в том, что никто не удосужился написать какие-либо программы для этого.
После дефрагментации файловая система может быть установлена в положение ro.
Затем используйте файловую систему, предназначенную для использования в режиме ro, например squashfs. Все файлы будут дефрагментированы, непрерывны и даже сжаты.
решение2
Если некоторые из ваших файлов большие, может быть технически невозможно дефрагментировать их все без переформатирования файловой системы.
Любойфайловая система ext4состоит из последовательности групп блоков. По умолчанию каждая группа блоков имеет длину 128 МБ.
Каждая группа блоков начинается с набора метаданных файловой системы (суперблок, дескриптор группы, битовые карты распределения и таблицы инодов), за которыми следуют фактические блоки данных, используемые файлами, принадлежащими этой группе блоков. Это означает, что метаданные файловой системы в основном равномерно распределены по всему устройству.
Однако благодаря дополнительной flex_bg
функции несколько групп блоков могут быть объединены в одну большую. mke2fs
создает файловые системы по умолчанию с 16 группами блоков, упакованными вместе, начиная с 2008 года. Если вы не изменили это при создании файловой системы с помощью опции -G
mkfs, ваша файловая система, скорее всего, разделена на 2-гигабайтные гибкие группы.
Если только все ваши файлы не будут значительно меньше 2 GiB, вы неизбежно столкнетесь с ситуацией, когда следующий файл для сохранения придется фрагментировать по двум или более (flex) группам блоков. Конечно, это гарантированно произойдет, если любой из ваших файлов больше, чем используемые блоки данных в (flex) группе блоков.
Чтобы достичь своей цели, вам, скорее всего, придется переформатировать файловую систему, установив гораздо более высокое значение параметра, -G
чем значение по умолчанию 16, чтобы файловая система использовала действительно большие группы гибких блоков.
решение3
До DOS 6 обычным советом по дефрагментации раздела FAT было:
- Скопируйте файлы с раздела на другой диск;
- Очистите раздел;
- Пересоздайте структуру каталогов на пустом разделе; и
- Скопируйте файлы обратно.
Я никогда не пробовал этого делать, поскольку MS-DOS 6 (с встроенной утилитой дефрагментации) вышла еще до того, как дефрагментация стала для меня проблемой.