Уменьшение времени сжатия файловой системы ext4

Уменьшение времени сжатия файловой системы ext4

Мне нужно сжать большой том ext4, и я хотел бы сделать это с минимальным временем простоя. С учетом проведенного мной тестирования, похоже, что его можно будет размонтировать для изменения размера в течение недели. Есть ли способ дефрагментировать файловую систему онлайн заранее, чтобы resizefs не пришлось перемещать так много блоков?

Обновлять: Потребовалось некоторое время, чтобы дойти до этого момента, переместил довольно много ТБ данных в ходе подготовки к сжатию, и я экспериментировал, используя информацию в ответе ниже. Я, наконец, придумал следующую командную строку, которая может быть полезна другим в похожей ситуации с небольшими изменениями. Также обратите внимание, что ее следует запускать как root, чтобы команды filefrag и e4defrag работали правильно — это не повлияет на владельца файла. Она также работает правильно с файлами с несколькими жесткими ссылками, которых у меня много.

find -type f -print0 | xargs -0 filefrag -v | grep '\.\.[34][0-9]\{9\}.*eof' -A 1 | awk '/extents found/ {match($0, /^(.*): [0-9]+ extents found/, res); print res[1]}' | xargs -n 1 -d '\n' e4defrag

Краткое пояснение, чтобы другим было проще вносить изменения/использовать:

Первая команда 'find' создает список файлов для работы. Возможно, сейчас это излишне или можно было бы сделать лучше, но во время тестирования у меня там были другие фильтры, и я оставил это как удобное место для изменения области действия остальной части команды.

Затем пропустите каждый файл через «filefrag -v», чтобы получить список всех физических блоков, используемых каждым файлом.

grep ищет последний блок, используемый каждым файлом (строка, заканчивающаяся на 'eof'), и где этот блок представляет собой 10-значное число, начинающееся с 3 или 4. В моем случае размер моей новой файловой системы будет составлять 2980024320 блоков, так что этого достаточно для работы только с файлами, которые находятся в области диска, подлежащей удалению. Если grep также включит следующую строку ('-A 1'), то в вывод для следующего раздела также будет включено имя файла. Это то место, где любой другой, кто сделает это, должен будет изменить команду в зависимости от размера своей файловой системы. Вероятно, это можно было бы сделать гораздо лучше, но это работает для меня сейчас, а я ленивый.

awk извлекает только имена файлов из всего остального мусора, который grep оставил в выводе filefrag.

И наконец, вызывается e4defrag — мне не важно фактическое количество фрагментов, но у него есть побочный эффект в виде перемещения физических блоков (надеюсь, в раннюю часть диска), и он работает с файлами с несколькими жесткими ссылками без дополнительных усилий.

Если вы хотите узнать только, какие файлы будут дефрагментированы, не перемещая при этом никаких данных, просто оставьте последнюю часть команды отключенной.

find -type f -print0 | xargs -0 filefrag -v | grep '\.\.[34][0-9]\{9\}.*eof' -A 1 | awk '/extents found/ {match($0, /^(.*): [0-9]+ extents found/, res); print res[1]}'

решение1

Насколько я могу судить,ext4fs поддерживает онлайн-дефрагментацию(он указан в списке «выполнено», но поле статуса пустое;оригинальный патчс конца 2006 г.) поe4defrag в e2fsprogs 1.42 или новее, который при работе на Linux 2.6.28 или новеепозволяет запрашивать состояние каталогов или, возможно, файловых систем, и, по крайней мере, дефрагментировать отдельные файлы.e2fsprogsна сегодняшний день это версия 1.42.8.

Я не уверен, поможет ли это вам или нет, так как то, что вы хотите сделать, кажется не таким уж и важным.дефрагментироватьданные какконсолидироватьданные на диске. Эти две операции часто выполняются вместе, но это совершенно разные операции.

Простой способ консолидации данных, которыймощьработа, предполагающая, что у вас есть разумное количество свободного места, заключается в копировании каждого файла в какую-то другую логическую логику в той же файловой системе, а затем использовании mv для замены данных, на которые указывает inode, новой копией. Это будет сильно зависеть от того, как именно работает распределитель ext4 в деталях, но это может стоить попытки, и это должно быть довольно легко для скрипта. Просто следите за файлами, которые жестко связаны из более чем одного места (при такой схеме может быть проще просто игнорировать любые файлы с количеством ссылок > 1 и позволить resizefs разобраться с ними).

Связанный контент