Назад | Перейти на главную страницу

Создание необработанных образов дисков: лучший способ удалить файлы для сжатия?

Я создаю необработанные образы дисков (например, dd, chroot для установки Linux). В процессе настройки я могу удалять файлы, использовать временные файлы и т. Д.

Как лучше всего удалить эти файлы, чтобы изображение было максимально сжимаемым?

Я предполагаю, что если я просто rm файл, он просто удалит записи из FAT, чтобы пометить блоки как доступные. Это оставляет данные на месте, поэтому, когда я использую gzip или bzip2 изображение, он все равно должен упаковать эти данные. Я предполагаю, что все было бы намного труднее, если бы я мог сказать FS вместо этого записывать нули в блоки.

Немного подробностей: это установки CentOS 6.4 на ext4, но я ожидаю, что ответ применим к большинству дистрибутивов Linux, использующих большинство файловых систем. Базовая файловая система, которую я генерирую, создается с помощью команды вроде dd if=/dev/zero of=filesystem.image bs=1M count=10240. Типичный образ диска размером 10 ГБ из обычной установки сжимается примерно до 500 МБ. Бьюсь об заклад, если я сделаю более агрессивную очистку временных файлов и тому подобного, я смогу сделать это намного труднее.

Спасибо!

Комментарий Зоредэша направил меня на верный путь (см. Как обнулить свободное место виртуального диска в Windows для лучшего сжатия?).

Насколько я могу судить, домашняя страница zerofree http://intgat.tigress.co.uk/rmy/uml/index.html. Здесь размещены две вещи: инструмент zerofree и патч ядра. Патч ядра не работает с ext4, но добавляет возможность установить флаг монтирования для обнуления файлов при удалении. Программа zerofree действительно работает на ext4.

Нет доступных RPM CentOS 6 без нулевого уровня, но я смог скомпилировать его на CentOS6, используя CentOS5 srpm.

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

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

Я создал два изображения с той же командой, что и OP, за исключением того, что я сделал их размером 1 Гб, поскольку они предназначены для тестирования целей:

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 поэтому никаких дополнительных инструментов не требуется.