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