web-dev-qa-db-ja.com

空き領域を含めずにディスク(SDカード)の.IMGイメージを作成する方法は?

Linuxでは、次のことができます

dd if=/dev/sdb of=bckup.img

ただし、ディスクが32GBで4GBしか使用されていない場合、32GBのイメージファイルは時空の無駄です。有効なデータのみで画像を作成する方法やツールはありますか?

29
Necktwi

最善のことは

  1. メタデータを保持するすべてのパーティションからすべてのファイルをコピーします

    mkdir -p myimage/partition1

    mkdir myimage/partition2

    Sudo cp -Rrf --preserve=all /media/mount_point_partition1/* myimage/partition1/

    Sudo cp -Rrf --preserve=all /media/mount_point_partition2/* myimage/partition2/

  2. MBRを抽出する

    Sudo dd if=/dev/sdX of=myimage/mbr.img bs=446 count=1

    置換/dev/sdX対応するデバイス。

  3. コピー先のディスクを、コピーされたデータよりも大きいサイズのパーティションにパーティション分割し、gpartedを使用して同じフォーマットと同じフラグにする必要があります。 Googleがディスクをパーティション分割する方法。

  4. 新しくフォーマットおよびパーティション化されたディスクをマウントします。ほとんどのコンピューターでは、ディスクを接続するだけで、マウントされたパーティションを/mediaフォルダー。

  5. 次のコマンドを使用して、以前にコピーしたデータを宛先パーティションにコピーします

    Sudo cp -Rrf --preserve=all myimage/partition1/* /media/mount_point_partition1/Sudo cp -Rrf --preserve=all myimage/partition2/* /media/mount_point_partition2/

  6. MBRをコピーして戻す

    Sudo dd if=myimage/mbr.img of=/dev/sdX bs=446 count=1

今、新しいディスクをお楽しみください!

7
Necktwi

これに対処するための非常に優れたシンプルな方法は、次のようなgzipを介してパイプするだけです。

# dd if=/dev/sdb | gzip > backup.img.gz

これにより、画像が圧縮され、ほとんどの場合、未使用のスペースはほとんどゼロに圧縮されます。

これを使用して、そのようなイメージを復元します。

# cat backup.img.gz | gunzip | dd of=/dev/sdb

注:最近削除されたファイルが多数ある場合、イメージサイズは依然として大きい可能性があります(ファイルを削除しても、基礎となるセクターがゼロになるとは限りません)。ゼロを含む大きなファイルを作成してすぐに削除することにより、空き領域を消去できます。

# cd /media/flashdrive
# dd if=/dev/zero of=bigfile bs=1M     # let it run and quit by disk full error
# rm bigfile
32
mvp

ddの-​​bsおよびcountパラメーターを使用すると、 のステップ2に示すように、イメージのサイズを制限できます。 1665017 と答えます。

作成する画像のサイズはすでにわかっているかもしれません。そうでない場合は、dfから良いアイデアを得ることができます。

df -H --total /

代替/ディスクパーティションに関連するすべてのマウントポイントのスペース区切りリスト。

より正確な方法は、fdiskまたは好みのパーティションエディターを使用して、計算機で忙しくすることです。

$ fdisk -l /dev/mmcblk0

Disk /dev/mmcblk0: 7.4 GiB, 7948206080 bytes, 15523840 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00057540

Device         Boot  Start     End Sectors  Size Id Type
/dev/mmcblk0p1        2048  186367  184320   90M  c W95 FAT32 (LBA)
/dev/mmcblk0p2      186368 3667967 3481600  1.7G  5 Extended
/dev/mmcblk0p5      188416 3667967 3479552  1.7G 83 Linux

合計使用バイト数=最後のパーティションの終了セクターXセクターサイズ(ここでは3667967 x 512)。

GB単位の合計使用スペース=バイト単位の合計使用スペース/ 10243 (ここでは1.749023 GBです)。

たとえば、イメージを正確に2 GBにする必要があると判断した場合、次のコマンドを実行します。

dd if=/dev/mmcblk0 of=/path/to/pi_updated.img bs=1M count=2048

結果の画像には、最後のパーティションの最大範囲を超えるランダムノイズも含まれます。

アカウントにまだ十分な権限がない場合は、上記のコマンドをSudoすることを忘れないでください。

私の目的では、データの最後のビットまで完全にトリミングされた画像は必要ないので、実際のサイズが1.75 GBの場合、2 GBの画像で十分です。これにより、他の6 GB(または30 GBまたはデバイスにスペアがあるもの)の未使用スペースがカットされます。

私は多くの場所でddがマウントされたパーティションでnot実行されるべきであるというアドバイスを見てきました。むしろ、自分がスケッチを鏡に描いてスケッチを作成しようとしているように見えます。それは少し大ざっぱです。

3
Crumeniferus

16 GB、32 GBなどの大きなSDカードを持っているが、バックアップでスペースを節約したい場合は、次を使用できます。

Sudo apt-get install gnome-disk-utility

あなたのUSBドライブが実際に持っている魔女の手紙を確認するためにディスクユーティリティを開きます:

gnome-disks

私の場合、Raspbianイメージを含む32GB SDカードは/ dev/sdeとして認識されます

だから私は/dev/sdeで実行します:

Sudo dd bs=4M status=progress if=/dev/sde | gzip > \
/you-selected-full-path-here/raspberry-images/`date +%Y%m%d`_rpi_image_backup.gz
status=progress gives you progress bar indication
| gzip > compresses the 32 GB total size and not writing the empty space from the 32 GB
`date +%Y%m%d` writes today date in the filename

出力:20190529_rpi_image_backup.gz

また、サイズはわずか3.5GBです。この画像を新しいSDカードに書き込む場合は、次を使用します。

https://www.balena.io/etcher/

また、32 GBから作成されたこのイメージを16 GBまたは8 GBのディスクに書き込むこともできますが、これはイメージが大きすぎると文句を言うことはありません。

1
jturi