回答:
最初に、空き領域が実際に空であり、削除されたファイルの残りが含まれていないことを確認します。これを実現する最も簡単な方法は、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
次に、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)は、元の画像に合わせて十分なサイズでなければなりません。そうしないと、データが失われたり破損したりします。
イメージを引き続き使用する場合(仮想マシンなど)の代替方法は、生のイメージを仮想化ソフトウェアで使用されるイメージ形式のいずれかに変換することです。たとえば、Qemuのqcow2、VirtualBoxのVDI、またはVMwareのVMDK。
このことに注意してくださいまだ、上記の方法を使用して空き領域を洗浄することにより、画像を準備する必要があります。
# 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
すると元のサイズが表示されます。これはどのように可能ですか?
Ubuntu 16.10コンピューターでgpartedアプローチを使用しました。
1)losetup
上記の前の投稿で説明したように、imgファイルを次に使用可能なループパーティションにマップします。
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]
、縮小されて権限のあるイメージファイルが作成されます。