Уменьшить время сжатия файловой системы 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]}' 

One Solution collect form web for “Уменьшить время сжатия файловой системы ext4”

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

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

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

  • Изменение размера раздела в CentOS 7
  • Как увеличить размер файловой системы для соответствия раздела
  • Как определить, была ли сжата файловая система?
  • Как создать раздел / opt на существующей установке без потери данных?
  • Изменение размеров каталогов
  • Что делает команда resize2fs в Linux
  • Как изменить размер LVM-диска в Debian 8.6 без потери данных
  • Как определить новый размер для resize2fs?
  • Увеличьте корневой раздел, уменьшив / home
  • Есть ли проблема с resize2fs слишком часто?
  • resize2fs: недостаточно зарезервированных блоков gdt для изменения размера
  • Interesting Posts

    Передача содержимого файла в командной строке

    Редактирование вывода команды как новой команды

    Почему размер / bin / true 27168 байт?

    Как перезагрузить ~ / .dir_colors?

    Как поймать возврат каретки / строку в заявлении case

    Меню XFCE отменяет сочетания клавиш

    APT фиксирует или подделывает номер версии моего собственного пакета?

    Как автоматизировать разрешение файлов на файлы, переданные из Windows в AIX, для наследования разрешений для каталогов AIX

    Узнайте, что вызывает случайные перезагрузки, если / var / log / syslog пуст

    После небольшого изменения кода «awk» печатает заголовок и пустые строки (не повторяется заголовок)

    служба systemd-path не работает

    Отключить автоподстройку в Ubuntu 16.04

    Выделение VLAN для разделения

    Как печатать из заданного диапазона ip-адресов каждый класс-c с последним октетом, замененным звездочкой

    Midnight Commander, используя дату в меню пользователя

    Linux и Unix - лучшая ОС в мире.