У меня есть изображение DD с SD-карты 4 ГБ, которая имеет два раздела, эти два раздела занимают всего около 800 МБ, и поэтому я хочу уменьшить размер img fie.
Кто-нибудь знает способ удаления "свободного места" из файла img?
У меня есть изображение DD с SD-карты 4 ГБ, которая имеет два раздела, эти два раздела занимают всего около 800 МБ, и поэтому я хочу уменьшить размер img fie.
Кто-нибудь знает способ удаления "свободного места" из файла img?
Ответы:
Сначала убедитесь, что свободное место на самом деле пусто и не содержит остатков удаленных файлов. Самый простой способ добиться этого - создать на диске огромный файл, содержащий только нулевые байты, а затем удалить его.
# losetup --find --partscan foo.img
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0 7:0 0 4096M 0 loop
├─loop0p1 259:0 0 2048M 0 loop
└─loop0p2 259:1 0 2048M 0 loop
# for part in /dev/loop0p*; do
mount $part /mnt
dd if=/dev/zero of=/mnt/filler conv=fsync bs=1M
rm /mnt/filler
umount /mnt
done
dd: error writing ‘/mnt/filler’: No space left on device
dd: error writing ‘/mnt/filler’: No space left on device
# losetup --detach /dev/loop0
Затем сожмите его с помощью инструмента, как gzip
или xz
. Даже при самых низких уровнях сжатия длинная серия нулей будет хорошо сжиматься:
# ls -s
4096M foo.img
# gzip foo.img
# ls -s
11M foo.img.gz
Обратите внимание, что вы должны распаковать изображение при записи его обратно на диск. Это распакует его «вживую»:
# cat foo.img.gz | gunzip | dd of=/dev/sda
Обратите внимание, что выходное устройство (sda) должно быть достаточного размера, чтобы соответствовать исходному изображению, в противном случае данные будут потеряны или повреждены.
Альтернативный метод, если вы хотите продолжать использовать образ - например, с виртуальной машиной - это преобразовать необработанный образ в один из форматов изображений, используемых программным обеспечением для виртуализации; например, qcow2 для Qemu, VDI для VirtualBox или VMDK для VMware.
Обратите внимание, что для этого по- прежнему требуется подготовить изображение, очистив свободное место, используя вышеуказанный метод.
# qemu-img convert -f raw -O qcow2 foo.img foo.qcow
# qemu-img convert -f raw -O vmdk foo.img foo.vmdk
Но если он снова будет записан на реальный диск, вам придется преобразовать его обратно в необработанный образ.
resize2fs
или ntfsresize
(в Linux нет инструмента для FAT), перед записью его на маленькое устройство или созданием новой файловой системы и копированием только файлов.
Использовать resize2fs
намного проще
resize2fs -M xxx.img
Сначала вас попросят e2fsck - так:
e2fsck -f -y xxx.img
(изображение НЕ должно быть смонтировано!)
Примечание: это будет работать, только если изображение состоит из одного раздела, если это целое блочное устройство с несколькими разделами, см. Ответ выше ...
losetup --find --partscan xxx.img
для настройки файла изображения в качестве устройства петли. затем запустите, lsblk
чтобы найти разделы устройства цикла.
resize2fs
только для extN
разделов типа. Другие типы перегородок потребуют других инструментов.
Я также попробовал это с qemu-img , и это сработало как шарм:
qemu-img resize test.img 2G
Мы изменяем размеры, test.img
чтобы сделать его 2G (2GB).
Работал безупречно для меня.
df -h
показывает оригинальный размер. Как это возможно?
Я использовал подход gparted с моим компьютером Ubuntu 16.10:
1) Сопоставьте файл img со следующим доступным разделом цикла с помощью losetup
, как описано в предыдущих сообщениях, как указано выше.
2) Проверьте, с lsblk
каким контурным диском связан ваш файл изображения, например,/dev/loop0
3) Выполнить sudo gparted /dev/loop0
4) Сократите раздел (ы) петли, если считаете это необходимым; Пожалуйста, убедитесь, что эти разделы отключены.
5) Выполните fdisk /dev/loop0
, затем введите p
, это покажет вам размер блока и номер конечного блока различных разделов.
6) Выполнить dd if=/dev/loop0 of=shrunk_image_file.img
, применить к этой команде параметров bs=[BlockSize]
и , count=[EndBlockNumberOfLastLoopPartition+1]
и вы будете иметь сжался и rightsized файл изображения.