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

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

 $ 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.

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

3 Solutions collect form web for “Массовое удаление большого каталога на ZFS без его рекурсивного перемещения”

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

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

 d=yourPoolName/BackupRootDir/hostNameYourPc/somesubdir zfs snapshot ${d}@quickdelete && { rm -rf /${d}/certainFolder zfs destroy ${d}@quickdelete & } 

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

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

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

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

 mv directory .DELETING; rm -rf .DELETING & 

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

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

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

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

 t=`mktemp -d` mv certainFolder $t/ rm -rf $t & 
  • Состояние поддержки ZFS xattr во FreeBSD
  • коэффициент дедупликации zfs «низкий»
  • ZFS: попытка удалить диск верхнего уровня из Zpool
  • Поддерживает ли какая-либо ОС ZFS на MIPS?
  • Omnios имеет проблемы с использованием зоны с набором данных NFS NFS
  • Как приостановить MySQL, прежде чем делать снимок LVM / ZFS?
  • Большое медиа-хранилище и ZFS или BTRFS
  • Не удается удалить файл из samba share + Solaris + ZFS
  • установка квоты на zfs не работает
  • Проблемы с zpool mount при загрузке
  • Почему система не реагирует, когда сетевая нагрузка составляет 90-95 Мбит / с?
  • Interesting Posts

    запустите x и getty на той же виртуальной консоли?

    Где хранится список точек доступа?

    linux – отключить все видеовыходы

    Возможно ли создать файл с привилегиями других пользователей?

    Как я могу запустить часть скрипта в качестве другого пользователя?

    Как получать файлы через bluetooth в Fedora 24?

    Ошибка сценария Rsync bash (отправка: команда не найдена)

    Не удается удалить каталог, операция не поддерживается в NTFS

    Невозможно FTP в экземпляр Google Compute Engine с помощью Debian

    GNU Параллельно обрабатывает несколько файлов параллельно в Unix с bash

    идентифицировать недостающие файлы в папке

    Я получаю предупреждение о нехватке дискового пространства после моего последнего обновления

    Предлагаемая настройка для сверхлегкой текстовой среды программирования в Linux

    Обычная доступная файловая система с очень большим ограничением по размеру файла?

    Удаление определенных файлов рекурсивно с помощью rm или что-то простое?

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