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


73

Как очистить неиспользуемое пространство нулями? (Ext3, ext4)

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

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

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

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

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


4
Проверьте это: superuser.com/questions/19326/…
Мат

1
Возможны два разных варианта ответа. Чего ты пытаешься достичь? Либо 1) безопасность, запретив кому-либо читать эти данные, либо 2) оптимизация сжатия всего раздела или [производительность SSD] ( en.wikipedia.org/wiki/Trim_(computing) ?
Totor

Ответы:


77

Такая утилита есть zerofree.

Из его описания:

Zerofree находит нераспределенные ненулевые блоки в файловой системе ext2 или ext3 и заполняет их нулями. Это полезно, если устройство, на котором находится эта файловая система, является образом диска. В этом случае, в зависимости от типа образа диска, вторичная утилита может уменьшить размер образа диска после того, как zerofree был запущен. Zerofree требует, чтобы файловая система была размонтирована или смонтирована только для чтения.

Обычный способ достижения того же результата (обнуление неиспользуемых блоков) состоит в том, чтобы запустить «dd» и создать файл, полный нулей, который занимает все свободное место на диске, а затем удалить этот файл. У этого есть много недостатков, которые смягчают ноль:

  • это медленно
  • это делает образ диска (временно) максимально увеличенным
  • он (временно) использует все свободное место на диске, поэтому другие одновременные действия записи могут завершиться неудачно.

Zerofree был написан для запуска из систем GNU / Linux, установленных в качестве гостевых ОС внутри виртуальной машины. Если это не ваш случай, вам почти наверняка не нужен этот пакет.

ОБНОВЛЕНИЕ № 1

Описание пакета .deb содержит следующий абзац, что подразумевает, что это будет работать и с ext4.

Описание: нулевые свободные блоки из файловых систем ext2, ext3 и ext4 Zerofree находит нераспределенные блоки с ненулевым содержимым в файловой системе ext2, ext3 или ext4 и заполняет их нулями ...

Другое использование

Еще одно приложение этой утилиты для сжатия образов дисков, которые являются резервной копией реального диска. Типичным примером этого является дамп SD-карты в BeagleBone или Raspberry Pi. После обнуления пустых пространств резервные образы можно сжимать более эффективно.


1
Это официальная страница инструмента intgat.tigress.co.uk/rmy/uml/index.html ? Как вы думаете, безопасно ли использовать ext4?
Гжегож Вежовецкий

2
@GrzegorzWierzowiecki: да, это страница, но для Debian и друзей она уже есть в репозиториях. Я использовал раздел ext4 на виртуальном диске для последовательного сжатия образа файла диска, и у меня не было проблем.
энзотиб

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

Страница zerofree рассказывает о патче, который позволяет сделать «файловая система смонтирована с опцией zerofree», так что она всегда обнуляет удаленные файлы непрерывно. тогда нужно ли перекомпилировать ядро? Есть ли более простой способ сделать то же самое?
эндолит

2
Будьте осторожны - я потерял файловую систему ext4, использующуюся zerofreeна Astralinux (на основе Debian)…
Hubbitus

33

Краткое описание методов (как упоминалось в этом и других местах) для очистки неиспользуемого пространства в ext2 / ext3 / ext4:

Обнуление неиспользуемого пространства

Файловая система не смонтирована

  • Если «диск», на котором находится ваша файловая система, недостаточно подготовлен (например, современный твердотельный накопитель, поддерживающий TRIM, файл виртуальной машины, формат которого поддерживает разреженность и т. Д.), И ваше ядро ​​говорит, что блочное устройство понимает его, вы можете использовать e2fsck -E discard src_fsдля удаления неиспользуемого пространства (требуется e2fsprogs) 1.42.2 или выше).
  • Использование нулей (например zerofree src_fs) для явной записи нулей в неиспользуемые блоки.
  • Используется e2image -rap src_fs dest_fsдля копирования только используемых блоков (новая файловая система должна находиться на обнуляемом в противном случае «диске», требуется e2fsprogs 1.42.9 или выше).

Файловая система смонтирована

  • Если «диск», на котором находится ваша файловая система, недостаточно подготовлен (например, современный твердотельный накопитель, поддерживающий TRIM, файл виртуальной машины, формат которого поддерживает разреженность и т. Д.), Ваше ядро ​​говорит, что блочное устройство понимает его, и, наконец, драйвер файловой системы ext поддерживает его, который вы можете использовать. fstrim /mnt/fs/попросить файловую систему выбросить неиспользуемое пространство.
  • Использование cat /dev/zero > /mnt/fs/zeros; sync; rm /mnt/fs/zeros( sfillиз безопасного удаления использует эту технику). Этот метод неэффективен, не рекомендуется Тедом Цо (автором ext4), может не обнулять определенные вещи и может замедлять будущие fscks.

Отключение файловой системы даст лучшие результаты, чем ее монтирование. Отбрасывание, как правило, является самым быстрым методом, когда необходимо обнулить много ранее использованного пространства, но использование zerofreeпосле процесса сброса может иногда обнулять немного больше (в зависимости от того, как сброс реализован на «диске»).

Уменьшение размера файла изображения

Изображение в выделенном формате VM

Вам нужно будет использовать соответствующий инструмент для создания образа диска (например, qemu-img convert src_image dst_image), чтобы активировать обнуленное пространство и уменьшить размер файла, представляющего изображение.

Изображение является необработанным файлом

Один из следующих методов может быть использован, чтобы сделать файл разреженным (поэтому прогоны с нулевой остановкой занимают место):

  • cp --sparse=always src_image dst_image,
  • fallocate -d src_image (требуется util-linux v2.25 или выше).

В наши дни может быть проще использовать такой инструмент, как virt-sparsify, чтобы выполнить эти шаги, и даже больше за один раз.

 источники


15

sfillИз безопасного удаления можно сделать это и несколько других связанных заданий.

например

sfill -l -l -z /mnt/X

ОБНОВЛЕНИЕ № 1

Существует дерево исходного кода, которое, по-видимому, используется проектом ArchLinux на github и содержит источник, для sfillкоторого есть инструмент, включенный в пакет Secure-Delete.

Также копия sfillman-страницы здесь:


этот URL устарел. Я не знаю, где сейчас находится его домашняя страница (или даже если она есть), но она упакована для Debian и Ubuntu. вероятно, другие дистрибутивы тоже. если вам нужен исходный код, его можно найти в архивах Debian, если вы не можете найти его где-либо еще.
CAS

Устаревший URL-адрес man-страницы теперь исправлен. Похоже, "Диппедия" больше не вещь.
mwfearnley

8

Если у вас e2fsprogs 1.42.9, то вы можете использовать его e2imageдля создания образа раздела без свободного места, поэтому вы можете пропустить шаг обнуления.


Я не смог (легко) найти в Интернете какую-либо информацию об этих параметрах, но они действительно приведены в примечаниях к выпуску 1.42.9: e2fsprogs.sf.net/e2fsprogs-release.html#1.42.9
mwfearnley

1
Это ценный инструмент! Тем не менее, ваш ответ будет лучше, если он также объяснит, как его использовать. Это e2image -ar /dev/foo1 | gzip > fs.img.gzили какой-то другой вариант. Включите, -fчтобы использовать его на смонтированном фс.
марта

0

Вы можете использовать sfill. Это лучшее решение для тонких объемов.


Если вы хотите прокомментировать ответ, подождите, пока у вас не будет достаточно репутации, чтобы сделать это.
Anthon

1
Я думаю, что ответ относится к manpages.ubuntu.com/manpages/lucid/man1/sfill.1.html ... который является по крайней мере попыткой ответить. («онлайн» в данном случае означает «с подключенной файловой системой», а не «в сети»).
Дероберт

0

если вы не хотите прибегать к дополнительным инструментам, этот метод должен быть быстрее, чем cat /dev/zero > /mnt/fs/zeros:

dd if=/dev/zero of="/mnt/fs/filler" bs=10485760
dd if=/dev/zero of="/mnt/fs/filler1" bs=1
rm /mnt/fs/filler
rm /mnt/fs/filler1

Почему это будет быстрее, чем cat? (Нет, аргумент размера блока ddне помогает)
marcelm


2
Да, но это не делает ddбыстрее. На самом деле, это, вероятно, делает catбыстрее. Размер блока важен только для минимизации накладных расходов на системные вызовы и оптимизации использования кэша ЦП. С системным вызовом вы попадаете в область убывающей отдачи. Кеш начинает болеть выше, скажем, 1MiB. А при работе на реальных дисках, вы I / O связаны так или иначе , и точка в основном спорно. Попробуйте сами сравнить.
марта
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.