Массовое удаление большого каталога в ZFS без рекурсивного обхода

9

Я хочу удалить каталог с большими объемами данных. Это мой резервный массив, который представляет собой файловую систему ZFS с линейным диапазоном и одним пулом под названием «san». Сан установлен, /san поэтому я хочу массово удалить / san / thispc / sureFolder

$ du -h -d 1 certainFolder/
1.2T    certainFolder/

Вместо того, чтобы ждать, rm -rf certainFolder/не могу ли я просто уничтожить дескриптор этого каталога, чтобы он мог перезаписываться (даже с тем же именем dir, если я решил воссоздать его) ??

Так, например, если вы не знаете много о zfs fs internal mgmnt, в частности, о том, как он отображает каталоги, но если я обнаружу, что карта скажет, например, например, и удалила правильные записи, например, каталог больше не будет отображаться, и то пространство, которое ранее содержал каталог должен быть удален из некоторого вида аудита.

Есть ли простой способ сделать это, даже если на ext3 fs, или это уже то, что команда рекурсивного удаления должна делать в первую очередь, то есть воровать и редактировать журналы?

Я просто надеюсь сделать что-то вроде того, kill thisDirгде он просто удаляет какой-то идентификатор, и poof каталог больше не отображается, ls -laа данные все еще остаются на диске, но пространство теперь будет использоваться повторно ( перезаписано), потому что ZFS это просто круто?

Я имею в виду, я думаю, что ZFS действительно круто, как мы можем это сделать? Идеально? потирая руки вместе :-)

Мой конкретный вариант использования (помимо моей любви к zfs) - это управление моим резервным архивом. Эта папка для резервного копирования отправляется через freefilesync (AWESOME PROG) на моем компьютере с Windows на общий файловый ресурс smb, но также имеет каталог версий, куда идут старые файлы. Я удаляю каталоги верхнего уровня, которые находятся в основной резервной копии, которые были скопированы в версию - например /san/version/someStuff, как очистка rm -rf /san/version/someStuff/*терминала из замазки два раза в месяц , теперь я должен открыть другой терминал; Я не хочу делать это каждый раз, мне надоело бесполезно контролировать rm -rf.

Я имею в виду, может быть, я должен установить команду, чтобы просто освободить дескриптор, а затем вывести на стандартный вывод, что может быть хорошо. Более реалистично , воссоздать набор данных через несколько секунд zfs destroy san/version; zfs create -p -o compression=on san/versionпосле мыслей из ответа @Gilles.

Брайан Томас
источник
К вашему сведению, я выполнил эту команду, чтобы создать наборы данных, которые я сейчас использую .. `zfs create dataset -p -o compression=on yourPoolName/BackupRootDir/hostNameYourPc/somesubdir
Брайан Томас
Пожалуйста, примите ответ, если решена проблема, описанная в исходном вопросе. Проблема, которую вы просто добавляете в свой вопрос, выглядит совершенно по-другому, поэтому ее следует задать в новом вопросе.
Jlliagre

Ответы:

12

Отслеживание освобожденных блоков неизбежно в любой достойной файловой системе, и ZFS не является исключением . Однако в ZFS существует простой способ почти мгновенного удаления каталогов путем «отсрочки» очистки. Технически это очень похоже на предложение Жиля, но по своей сути надежно, не требуя дополнительного кода.

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

d=yourPoolName/BackupRootDir/hostNameYourPc/somesubdir
zfs snapshot ${d}@quickdelete && { 
    rm -rf /${d}/certainFolder
    zfs destroy ${d}@quickdelete & 
}
jlliagre
источник
хорошо, я был незнаком со снимками. это может помочь мне. Я удаляю / перемещаю весь день еще. Я создал наборы данных не только для основного каталога резервных копий, но и для каталогов верхнего уровня внутри, каждый из которых начинается с имени хоста, и нескольких верхних уровней ..., поэтому у меня есть немного гибкости, чтобы просто уничтожить и воссоздать пул, но это не идеально Потому что я не всегда хочу удалять все эти каталоги из пула, мне нужно было бы создать еще больше, и это очень много для создания набора данных, поэтому мне нравится ваше предложение по этой причине!
Брайан Томас
4
Если доступно, feature@async_destroyможет также помочь ускорить это (с точки зрения пользователя или администратора), если включено; см zpool get all $pool. Обратите внимание, что, по крайней мере, последний раз, когда я смотрел, если при импорте из пула происходит незавершенное уничтожение , то это уничтожение становится синхронным, и импорт из пула не завершится, пока не завершится уничтожение. Остерегайтесь, если вам нужно перезагрузить компьютер!
CVn
У меня есть клиент с freenas, который потерял соединение SMB при большом удалении. После включения периодических снимков (и автоматического удаления) проблема «исчезла». освобождение места занимает больше времени в фоновом режиме, но SMB-Share остается доступным все время.
Мартин Сейтл
6

То, что вы просите, невозможно. Или, точнее, стоит заплатить за удаление каталога и его файлов; если вы не заплатите в момент удаления, вам придется заплатить в другом месте.

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

Вы можете отложить стоимость маркировки ресурсов как бесплатных. Например, существуют сборочные файлы, где вы можете удалить каталог, не удаляя содержащиеся в нем файлы. Запуск сборщика мусора обнаружит файлы, недоступные через структуру каталогов, и пометит их как свободные. Работа rm -f directory; garbage-collectс файловой системой, собираемой мусором, делает то же самое, что иrm -rfв традиционной файловой системе с разными триггерами. Файловых систем, собираемых мусором, немного, потому что сборщик мусора представляет собой дополнительную сложность, которая редко требуется. Время GC может наступить в любой момент, когда файловой системе нужны какие-то свободные блоки и они не найдены, поэтому производительность операции будет зависеть от прошлой истории, а не только от операции, которая обычно нежелательна. Вам нужно запустить сборщик мусора, чтобы получить фактическое количество свободного места.

Если вы хотите смоделировать поведение GC на нормальной файловой системе, вы можете сделать это:

mv directory .DELETING; rm -rf .DELETING &

(Я пропустил много важных деталей, таких как проверка ошибок, устойчивость к потере питания и т. Д.). Имя каталога сразу же становится несуществующим; пространство восстанавливается постепенно.

Другой подход, позволяющий избежать оплаты стоимости при удалении без GC, состоит в том, чтобы оплачивать ее во время распределения. Отметьте дерево каталогов как удаленное и просматривайте удаленные каталоги при распределении блоков. Это было бы трудно согласовать с жесткими ссылками, но в файловой системе без жестких ссылок это можно сделать с O (1) увеличением затрат на распределение. Однако это сделало бы очень распространенную операцию (создание или увеличение файла) более дорогой, с единственным преимуществом - относительно редкая операция (удаление большого дерева каталогов) дешевле.

Вы можете массово удалить дерево каталогов, если это дерево хранится как его собственный пул блоков. (Примечание: я использую слово «пул» в значении, отличном от «пула хранения» ZFS. Я не знаю, какова правильная терминология.) Это может быть очень быстро. Но что вы делаете со свободным пространством? Если вы переназначаете его в другой пул, это будет стоить, хотя и намного меньше, чем удаление файлов по отдельности. Если вы оставите пространство как неиспользованное резервное пространство, вы не сможете немедленно его вернуть. Наличие отдельного пула для дерева каталогов означает дополнительные затраты на увеличение или уменьшение размера этого пула (на лету или явно). Создание дерева как своего собственного пула хранения также увеличивает стоимость перемещения файлов в дерево и из дерева.

Жиль "ТАК - перестань быть злым"
источник
Хорошо, отличный ответ! Первая половина которого вполне выполнима на нормальной системе. У ZFS есть некоторые хитрости, например, нет необходимости форматировать его, поэтому, если я уничтожу пул, то, что я собираюсь сделать в следующий раз, просто сделаю пул (множественное число), как я должен, тогда ti исчезнет радар мгновенно, и это пространство сразу же доступно. Я предполагаю, что я пытаюсь воссоздать это в zfs, в каталоге внутри пула, и я думаю, что, поскольку это не сам пул, его природа становится более стандартной, и метод, который вы упомянули, кажется, применим в этом случае. интересно.
Брайан Томас
Я думаю, что там, где я сделал свою ошибку, я прочитал статью вчера вечером, не знаю, смогу ли я найти ее, которая демонстрирует, что пулы должны использоваться как директории, ограниченные ~ 18 446 744 триллионами пулов на FS. если я создаю свои верхние каталоги резервных копий как пулы каждый, когда резервная копия отправляется на запись в них, каталог уже будет в такте, который является легко удаляемым пулом. Если пул не существует, резервная копия просто создаст каталог, и бассейн не будет видно в zfs list. До тех пор, надеясь, что кто-то еще получит информацию о том, как выполнить массовое деление на ZFS в подкаталоге пула. :-)
Брайан Томас
Кроме того, когда я прочитал ваш первый ответ, моей первой мыслью было: «ПРАВО!», «Стоимость»! это то, к чему я прикасался, когда говорил об удалении записей журнала. так как я и подозревал. штопать! Тем не менее, вы на правильном пути. Давайте придумаем что-то здесь, так что мы можем собрать сценарий, который, возможно, сделает это ... мысль :-)
Брайан Томас
Брайан, будь осторожен, чтобы не перепутать zpools и наборы данных. Хотя на самом деле не существует достижимого жестко заданного ограничения на количество создаваемых zpools, вы быстро будете ограничены количеством базовых устройств (например, разделов), доступных на вашем компьютере. Более того, наличие пулов, выделенных для отдельных каталогов, лишит некоторые ценные функции zfs и значительно замедлит операции перемещения.
июля
на этот комментарий вы сделали здесь @Gilles "Но что вы делаете со свободным пространством? Если вы переназначаете его в другой пул, это будет стоить, хотя и намного меньше, чем удаление файлов по отдельности", я не уверен, но я не думаю, что там Это штраф за создание нового пула, я думаю, что я имею дело с ним только во время записи. никогда не нужно разбивать на части по той же причине .. я считаю, что это тот же механизм ..
Брайан Томас
1

Если это должно быть быстро, я создаю новый временный каталог, mvкаталог под ним, а затем рекурсивно удаляю временный каталог :

t=`mktemp -d`
mv certainFolder $t/
rm -rf $t &
Саймон Рихтер
источник
а & удалить ручку или ошибки сквоша?
Брайан Томас
1
Это на самом деле не отличается от предложения Жиля и имеет тот же недостаток. Если ОС перезагружается или rmкоманда не завершается по какой-либо другой причине, каталог-фантом остается не восстановленным.
июля
да, но для меня это новость, это часть головоломки ... я хотел избавиться от ручки. однако да, ваше право, не хочу мусора, если есть проблема ..
Брайан Томас
@BrianThomas &просто создает фон для процесса, поэтому вы можете продолжать выполнять другие действия в той же оболочке, пока выполняется удаление (с учетом любых соответствующих ограничений производительности).
CVn