Создание необработанных образов дисков: лучший способ удалить файлы для сжатия?
Я строю сырые образы дисков (например, dd, chroot для установки Linux). В процессе настройки я могу удалять файлы, использовать временные файлы и т. Д.
Каков наилучший способ удалить эти файлы, чтобы изображение было максимально сжимаемым?
Я предполагаю, что если я просто нажму на файл, то просто удаляю записи из FAT, чтобы пометить блоки как доступные. Это оставляет данные на месте, поэтому, когда я gzip или bzip2 изображение, он все равно должен упаковать эти данные. Я предполагаю, что было бы намного труднее, если бы я мог сказать FS писать нули вместо блоков.
Немного подробностей: это установки CentOS 6.4 на ext4, но я ожидаю, что ответ применим к большинству дистрибутивов Linux, использующих большинство файловых систем. Базовая файловая система, которую я генерирую, - это команда типа dd if=/dev/zero of=filesystem.image bs=1M count=10240
, Типичный образ диска объемом 10 ГБ из ванильной установки сжимается примерно до 500 МБ. Бьюсь об заклад, если бы я сделал более агрессивную очистку временных файлов и тому подобное, я мог бы сделать это намного жестче.
Спасибо!
2 ответа
Комментарий Zoredache сделал меня на правильном пути (см. Как обнулить свободное место на виртуальном диске в Windows для лучшего сжатия?).
Насколько я могу судить, нулевой домашней страницей является http://intgat.tigress.co.uk/rmy/uml/index.html. Здесь размещены две вещи: инструмент zerofree и патч для ядра. Патч ядра не работает с ext4, но добавляет возможность установить флаг монтирования для обнуления файлов при удалении. Программа без нуля работает на ext4.
Нет доступных CentOS 6 RPM с нулевым числом оборотов, но я смог скомпилировать его на CentOS6 с использованием CentOS5 srpm.
Вы можете создать файл / файлы, содержащие только нули, чтобы заполнить свободное пространство файловой системы. Блоки, помеченные как свободные, будут перезаписаны нулями. После этого удалите эти файлы.
Обновление: так как этот ответ был отклонен, я решил проверить, действительно ли это правда или мои знания неверны. Пока все выглядит так, будто все работает так, как я ожидал.
Я создал два изображения с той же командой, что и OP, за исключением того, что я сделал его размером 1G, так как он предназначен для тестирования фиктивных элементов:
dd if=/dev/zero of=img1.im bs=1M count=1024
dd if=/dev/zero of=img2.im bs=1M count=1024
Затем я приступил к форматированию файлов изображений как ext4, монтировал их в отдельные каталоги и копировал два каталога, содержащие изображения на обоих изображениях. Один каталог был 71M, а другой - 461M. После этого я удалил каталог 461M с обеих точек монтирования. Пока что все действия были идентичны. Затем я оставил первое изображение в покое и создал нулевой файл, занимающий все свободное место на втором, а затем удалил его:
dd if=/dev/zero of=img2/zerofile bs=1K count=884644
rm img2/zerofile
df
еще раз показал, что файловые системы были заполнены одинаково (системные разделы удалены для ясности):
$ df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/loop0 999320 62248 884644 7% /home/black/temp/img/img1
/dev/loop1 999320 62248 884644 7% /home/black/temp/img/img2
После размонтирования и сжатия обоих изображений с помощью bzip2 вывод ls
говорит само за себя:
$ ls -lh
total 604M
-rw-r--r-- 1 black users 523M apr 19 11:56 fs1.im.bz2
-rw-r--r-- 1 black users 81M apr 19 11:56 fs2.im.bz2
Хотя это может занять больше времени для больших изображений, чем просто обнуление пространства, которое фактически использовалось для файлов, этот метод прост, эффективен и использует только dd
поэтому никаких дополнительных инструментов не требуется.