Очистить неиспользуемое пространство с нулями (btrfs)

10

Как очистить неиспользуемое пространство нулями? (Я прошу инструмент для файловой системы btrfs )

Я ищу что-то умнее, чем

cat /dev/zero > /mnt/X/big_zero ; sync; rm /mnt/X/big_zero

Вроде FSArchiver ищет «использованное пространство» и игнорирует неиспользуемый, но противоположный сайт.

Цель: я бы хотел сжать образы разделов, поэтому настоятельно рекомендуется заполнять неиспользуемое пространство нулями.

Btw. Для ext3, ext4: Очистить неиспользуемое пространство с нулями (ext3, ext4) . Здесь я прошу btrfs

Разъяснение «более умного алгоритма». Поскольку я вижу, что «более умный алгоритм» приводит к путанице, здесь я, наконец, решил добавить строку об этом. Уважаемый читатель, пожалуйста, подумайте о файловой системе как о структуре данных. Для упрощения, давайте представим самобалансирующуюся карту, содержащую красно-черное дерево, которая используется в качестве массива ключа ассоциации> значения, где значения являются целыми числами. Цель состоит в том, чтобы очистить все отрицательные значения с нулями. «неумный» алгоритм будет перебирать его и добавлять пары ключ: значение на новую карту (с возможным изменением отрицательного значения на ноль). Умный алгоритм просто обнаружит места, где хранятся отрицательные значения, и очистит их на месте .

Гжегож Вежовецкий
источник
2
Вы пробовали sfillпредложение ? Похоже, это не требует ExtX.
Кевин
1. Я знаю, что вы можете заполнить существующие файлы нулями с помощью крошки, но это, вероятно, не так, верно? 2. Как вы делаете эти изображения? Может быть, вы можете сделать там усечение?
Златко
@kevin: вот почему я разместил ответ sfill в оригинальном вопросе. Я редко использую файловые системы ext2,3,4, поэтому утилиты, работающие только на ext *, бесполезны.
Cas
Мне нужно что-то «умное». Что-то, что только заполняет пустое пространство нулями, не касаясь других мест - я имею в виду, не затрагивая внутренние структуры данных, такие как B-деревья (Если вам интересно, я написал вопрос «сжатие», но мне это нужно и для других целей, как дедупликация, анализ и исследование изображений fs)
Grzegorz Wierzowiecki
просто используйте truncateи / илиfallocate
mikeserv

Ответы:

4

Вот измененный и значительно расширенный репост моего ответа на ваш предыдущий вопрос:

sfillиз secure-deleteпакета можно делать что хочешь.

В отличие от zerofree (который работает только с файловыми системами ext2, ext3 и ext4), sfill будет работать с любой файловой системой.

например

sfill -l -l -z /mnt/X

Кажется, что домашняя страница sfill / secure-delete исчезла, но она упакована для Debian и Ubuntu. вероятно, другие дистрибутивы тоже. если вам нужен исходный код, его можно найти в архивах Debian, если вы не можете найти его где-либо еще.

ПРИМЕЧАНИЕ: sfill работает только на смонтированной файловой системе. Если вы заполняете файлы образов с нуля не из виртуальной машины, а из хост-системы, вам необходимо смонтировать образ fs на хосте. Точный метод зависит от типа файла изображения (например, qcow2 или raw).

Монтировать «сырые» изображения легко и просто. Просто используйте kpartxфайл образа для создания петлевого устройства, и / dev / mapper / записи для каждого раздела можно монтировать отдельно.

Вот частичный сценарий, модифицированный из фрагмента сценария, который я использую для монтирования образов жесткого диска с загрузкой по сети (используется для обновлений BIOS на компьютерах, где flashrom не работает):

image="myrawimagefile.img"

# use kpartx to build /dev/mapper device nodes
KP=$(kpartx -a -v "$image")

# now mount each partition under ./hd/
for p in $(echo "$KP" | awk '/^add map/ {print $3}') ; do
  dm="/dev/mapper/$p"
  fp=$(echo "$p" | sed -r -e 's/^loop[0-9]+//')
  mkdir -p "./hd/$fp"
  mount "$dm" "./hd/$fp"
  sfill -l -l -v "./hd/$fp"
  umount "$dm"
done

# now remove the loopback device and /dev/mapper entries
kpartx -d "$image"

ПРИМЕЧАНИЕ: предполагается, что каждый раздел на изображении является монтируемым. Истинно в моем случае использования (образ Freedos HD с одним разделом). Неверно, если один из разделов - это, скажем, пространство подкачки. Обнаружение таких разделов и использование dd для обнуления раздела подкачки оставлено в качестве упражнения для читателя :)

Этот метод или его вариант должен работать и для томов LVM.

Если ваши изображения qcow, вы можете использовать qemu-nbdинструмент из qemu-utilsпакета, который представит файл изображения и его разделы в качестве сетевых блочных устройств - например, / dev / nbd0 / dev / ndb0p1 - который можно использовать аналогично / устройства dev / mapper выше.

Возможно, проще и менее хлопотно (но более трудоемко) использовать qemu-imgдля преобразования из qcow в raw, использовать метод для raw выше, а затем преобразовать измененный необработанный образ обратно в сжатый qcow2. Это, вероятно, приведет к получению изображений немного меньшего размера, чем при использовании qemu-nbd, поскольку вы будете сжимать новое изображение qcow2 по мере его создания.

саз
источник
1
Я имею в виду, что это не считается «умным» способом заполнения неиспользуемого пространства нулями. Это наиболее очевидный, типичный способ сделать это. Я не спрашиваю о таких вещах.
Гжегож Вежовецкий
1
Пожалуйста, опишите «умный» алгоритм, который не специфичен для конкретного семейства файловых систем (например, zerofill для ext2 / 3/4). Вы хотели программу, которая могла бы сделать работу. Вы не сказали, что это должно быть волшебно.
Cas
1
и действительно, если файловая система не используется (потому что, например, она смонтирована на хосте для нулевого заполнения), какое это имеет значение, насколько умным является алгоритм? Просматривать метаданные fs в поисках пустых секторов не будет быстрее или лучше, чем просто написать огромное заполнение, полное NUL ... сама файловая система уже достаточно умна, чтобы выяснить, где пустое пространство.
Cas
2
С одной стороны, для ваших нужд этого достаточно - поэтому мой вопрос уже содержит фрагмент кода с этим решением - поэтому ваш ответ не дает ничего нового. С другой стороны, мои потребности требуют того, что я указываю, потому что я хочу стереть неиспользуемое пространство с нулями без изменения внутренних структур (например, перебалансировать «Танцующие B-деревья» или другую структуру данных (например, для анализа и дедупликации). цели)
Grzegorz Wierzowiecki
2
@cas - я думаю, что вы упускаете тот факт, что заполнение нулями является важным шагом перед компактированием виртуальных жестких дисков в виртуальных машинах. Если у вас есть расширяемый диск объемом 500 ГБ, 10 ГБ файлов и 10 ГБ «пустого» пространства (то есть удаленных файлов), запуск наивного подхода «гигантский нулевой файл» займет гораздо больше времени и потребует увеличения виртуального жесткого диска до полные 500 гб. Могу поспорить, что ОП предполагает, что утилита тоже должна быть специфичной для ФС.
Поддельное имя
3

Правильный и «умный» способ освободить свободное место - использовать:

fstrim /mountpoint

Используйте это на смонтированной файловой системе.

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

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

DustWolf
источник