web-dev-qa-db-ja.com

ddで作成した画像ファイルのサイズを変更する方法は?

2つのパーティションを持つ4GB SDカードからのDDイメージがあります。これらの2つのパーティションは約800 MBしか使用していないため、imgファイルのサイズを小さくしたいと考えています。

Imgファイルから「空き領域」を削除する方法を知っている人はいますか?

20
A_Porcupine

まず、空き領域が実際に空であり、削除されたファイルの残りが含まれていないことを確認します。これを達成する最も簡単な方法は、ディスク上にnullバイトのみを含む巨大なファイルを作成し、それを削除することです。

# 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

次に、gzipxzなどのツールで圧縮します。最低の圧縮レベルでも、一連の長いゼロは十分に圧縮されます。

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

イメージをディスクに書き戻すときは、解凍する必要があることに注意してください。これにより、「ライブ」で解凍されます。

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

出力デバイス(sda)mustoriginalイメージに適合するのに十分なサイズであることに注意してください。そうしないと、データが失われたり破損したりします。


画像を使い続けたい場合の別の方法–例仮想マシンで–生のイメージを仮想化ソフトウェアで使用されるイメージ形式の1つに変換します。例えばQemuの場合はqcow2、VirtualBoxの場合はVDI、VMwareの場合はVMDK。

このstillでは、上記の方法を使用して空き領域をクリーンアップしてイメージを準備する必要があることに注意してください。

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

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

しかし、それが実際のディスクに再度書き込まれる場合は、生のイメージに変換し直す必要があります。

8
user1686

resize2fsの使用ははるかに簡単です

resize2fs -M xxx.img

最初にe2fsckを要求されます-そのため:

e2fsck -f -y xxx.img

(画像はマウントしないでください!)

注:これは、イメージが単一のパーティションである場合にのみ機能します。複数のパーティションを持つブロック全体のデバイスである場合は、上記の回答を参照してください...

22
Serge Wagner

私もqemu-imgで試してみましたが、それは魅力のように機能しました:

qemu-img resize test.img 2G

test.imgのサイズを変更して2G(2GB)にします。

私にとって完璧に働いた。

2
Phil Roggenbuck

私はUbuntu 16.10コンピューターでgpartedアプローチを使用しました。

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]すると、縮小されて権限が付与された画像ファイルが作成されます。

1
VeryNoob