Как изменить размер файла img, созданного с помощью dd?

39451
A_Porcupine

У меня есть изображение DD с SD-карты 4 ГБ, которая имеет два раздела, эти два раздела занимают всего около 800 МБ, и поэтому я хочу уменьшить размер IMG-файла.

Кто-нибудь знает способ удаления "свободного места" из файла img?

16
Вы можете добавить желаемый результат. т.е.: изображение обратно на карту, для хранения на CD. Wayne 10 лет назад 0

3 ответа на вопрос

17
Serge Wagner

Using resize2fs is much much easier

resize2fs -M xxx.img 

you will be asked to e2fsck first - so:

e2fsck -f -y xxx.img 

(image must NOT be mounted!)

Note: this will only work if the image is of a single partition, if it's a whole block device with mutiple partitions see above answer...

Просто примечание: для нескольких разделов используйте `losttup --find --partscan xxx.img`, чтобы установить файл изображения в качестве устройства петли. затем запустите `lsblk`, чтобы найти разделы устройства цикла. Yihui Xiong 5 лет назад 0
5
grawity

First make sure the free space is actually empty, and doesn't contain leftovers of deleted files. The easiest way to achieve this is to create a huge file on the disk, containing only null bytes, then delete it.

# 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 

Then compress it with a tool like gzip or xz. Even at lowest compression levels, a long series of zeros will compress well:

# ls -s 4096M foo.img # gzip foo.img # ls -s 11M foo.img.gz 

Note that you must uncompress the image when writing it back to disk. This will uncompress it 'live':

# cat foo.img.gz | gunzip | dd of=/dev/sda 

Note that the output device (sda) must be of sufficient size to fit the original image, otherwise data will be lost or corrupted.


An alternative method, if you want to keep using the image – e.g. with a virtual machine – is to convert the raw image to one of the image formats used by virtualization software; e.g. qcow2 for Qemu, VDI for VirtualBox, or VMDK for VMware.

Note that this still requires you to prepare the image by cleaning the free space using the above method.

# qemu-img convert -f raw -O qcow2 foo.img foo.qcow # qemu-img convert -f raw -O vmdk foo.img foo.vmdk 

But if it's going to be written to a real disk again, you have to convert it back to a raw image.

Как вы можете быть уверены, что все файлы, которые в данный момент хранятся в разделах, физически не разбросаны по диску? Valerio Santinelli 9 лет назад 1
потому что я предполагаю, что файлы не записываются последовательно на диск, и если файл находится в конце хранилища, когда я уменьшу его размер, я потеряю содержимое этого файла. Valerio Santinelli 9 лет назад 0
Потому что ОП спрашивает, как сжать образ диска без потери данных. Если вы обрезаете изображение до определенного размера, вы не можете быть уверены, что данные будут сохранены. Valerio Santinelli 9 лет назад 0
@ValerioSantinelli: где именно я предлагаю обрезать изображение? grawity 9 лет назад 0
Мой плохой, я думал, что часть, где вы делаете кошку foo.img.gz | ружье | dd of = / dev / sda предназначался для обратной записи на устройство хранения меньшего размера. Я, вероятно, неправильно понял. Но моя точка зрения остается неизменной: если я хочу уменьшить размер изображения, чтобы оно поместилось на меньшем устройстве хранения, как я могу это сделать и быть уверенным, что файлы не обрезаются? Valerio Santinelli 9 лет назад 0
@ValerioSantinelli: с помощью соответствующего инструмента изменения размера файловой системы для вашей файловой системы, например, `resize2fs` или` ntfsresize` (в Linux нет инструмента для FAT), прежде чем записать его на устройство меньшего размера, _or_, создав новую файловую систему и скопировав только файлы. grawity 9 лет назад 1
0
Phil Roggenbuck

Я также попробовал это с qemu-img, и это сработало как шарм:

qemu-img resize test.img 2G 

Мы изменяем размеры, test.imgчтобы сделать его 2G (2GB).

Работал безупречно для меня.

Похожие вопросы