Как дефрагментировать каталог на ext3?

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

Однако каталог остается большим; «лс-дх». возвращает размер 5,6M. Как я могу «дефрагментировать» этот каталог? Я уже понял, что переименование этого каталога и создание нового с тем же именем и разрешениями решает проблему. Однако, поскольку файлы записываются туда в любое время, кажется, что нет безопасного способа переименовать каталог и создать новый, поскольку на данный момент целевой каталог не существует.

Итак, а) есть ли способ/программа (оболочка), которая может дефрагментировать каталоги в файловой системе ext3? или б) есть ли способ создать блокировку каталога, чтобы попытка записи файлов блокировалась до завершения переименования/создания?


person Bada    schedule 29.11.2010    source источник
comment
Кстати. очевидно, вы можете использовать команду filefrag, чтобы проверить, фрагментирован ли каталог.   -  person oliver    schedule 27.04.2015
comment


Ответы (3)


«Оптимизировать каталоги в файловой системе. Этот параметр заставляет e2fsck пытаться оптимизировать все каталоги либо путем их переиндексации, если файловая система поддерживает индексирование каталогов, либо путем сортировки и сжатия каталогов для небольших каталогов или для файловых систем, использующих традиционные линейные каталоги». -- fsck.ext3 -D

Конечно, это не следует делать на смонтированной файловой системе.

person Shi    schedule 04.12.2010

Не совсем применимо для Ext3, но может быть полезно для пользователей других файловых систем:

  • согласно https://wiki.archlinux.org/index.php/Btrfs#Defragmentation, с помощью Btrfs возможно дефрагментировать метаданные каталога: btrfs filesystem defragment / дефрагментирует метаданные корневой папки. При этом используется онлайн-дефрагментация Btrfs.

  • в то время как Ext4 поддерживает онлайн-дефрагментацию (с e4defrag), похоже, это не относится к метаданным каталога (согласно http://sourceforge.net/p/e2fsprogs/bugs/326/).

Однако я не пробовал ни одно из этих решений.

person oliver    schedule 27.04.2015

Я не знаю, как освободить свободное место из каталога.

5 МБ — это не так много места, поэтому проще всего просто игнорировать его. Если эта проблема (файлы накапливаются в каталоге) возникает регулярно, то это пространство будет повторно использоваться каждый раз, когда каталог снова заполняется.

Если вам отчаянно нужна возможность сжать каталог, вот (уродливый) хак, который может сработать.

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

[Отредактировано для добавления: Оказывается, это не работает. Как указывает Бада в комментариях, вы не можете атомарно изменить символическую ссылку так, как я предложил. Это оставляет меня с моей первоначальной точкой зрения. Файловые системы, с которыми я знаком, не предоставляют механизма для освобождения свободного места в блоках каталогов.]

person Keith Smith    schedule 29.11.2010
comment
Как можно изменить симлинк? Если цель уже существует, символическая ссылка создается внутри цели, указывающей на себя, попробуйте mkdir haha ​​hehe && ln -vs haha ​​hoi && ln -vs hehe hoi. И согласно symlink(2), он возвращает EEXIST, если цель уже существует. Я еще не вижу, что это атомарно. - person Bada; 29.11.2010
comment
@бада: ты прав. Я неправильно запомнил, как создаются символические ссылки. Так что мой хак и уродлив, и неправ! Извини за это. Боюсь, это оставляет меня без каких-либо предложений о том, как решить вашу проблему... - person Keith Smith; 30.11.2010
comment
На самом деле переименование атомарно. Поэтому создайте новую ссылку, а затем переместите ее на место либо с помощью вызова операционной системы rename (python os.rename), либо с помощью команды mv -f -T newlink oldlink. -T говорит не помещать в каталог, а вместо этого заменить ссылку. - person Mathieu Longtin; 20.01.2017