web-dev-qa-db-ja.com

空き容量のないディスクイメージ

起動可能な16GBSDカードのイメージがあります。私は次のように画像を作成しました:

cat /dev/sdd | gzip >sdcard.img.gz

そして私は幸せだったので

$ du -h sdcard.img.gz
482M    sdcard.img.gz

16GBではなく482MB、イェーイ!

(非圧縮)画像の詳細は次のとおりです。

$ du -h sdcard.img
15G     sdcard.img
$ partx -s sdcard.img
NR START     END SECTORS SIZE NAME UUID
 1 16384   81919   65536  32M      6e1be81b-01
 2 81920 3588095 3506176 1.7G      6e1be81b-02

ただし、この画像をSDカードに書き戻す必要がありますが、14GBの後続ゼロ/ジャンクを書きたくありません。それには時間がかかります。

  1. 最後のパーティションの後のものをコピーせずにイメージを作成するにはどうすればよいですか?
  2. SDカード全体のイメージをすでに作成している場合、無駄なジャンクを含まないように切り捨てるにはどうすればよいですか?

重要なのは、バックアップで画像が取るサイズは気にしないが、SDカードへのコピーは遅く、14GBの無駄なデータをコピーするのは無意味なので、SDカードに転送されるサイズは気にする。 したがって、インターネット上の他の回答が示唆しているように、ディスクイメージを圧縮するか、スパースアウェアファイルシステムにコピーすることは、私が探しているものではありません。

1
woky

最初の質問に答える:そこにMBRがある場合、元のドライブ(ブートレコードと場合によってはブートローダーを含む)の最初のメガバイトをdd 'してから、反復することをお勧めします。そこに含まれるパーティション:dev=/dev/sda fdisk -l "$dev" | sed -ne '/^\//s,\(^[^ ]*\) .*,\1,p' | while read part do dd "if=$part" "of=$(basename "$part")" doneそして、最初のメガバイトをターゲットドライブに記録した後、カーネルにpartprobeまたはkpartxでパーティションテーブルを読み取るように依頼します。この後、対応するイメージの内容を新しいパーティションにddできるようになります。

1
L29Ah

最後のパーティションの最後に書き込みます(さらに少し、たとえばこの場合は合計2G(ギビバイト))。

この目的のためにddを使用できます。 チェックとダブルチェックddは問題なく指示どおりに実行するため、Enterキーを押す前に正しいSDカード(別のドライブではなく)に書き込みます。

このコマンドラインは、非圧縮の画像ファイルから機能します

$ Sudo dd if=sdcard.img of=/dev/sdx bs=1M count=2K

ここで、xはドライブ文字です。

ただし、この場合、圧縮された画像ファイルがあります。 rootとして実行します(たとえば、Sudo -sおよび対応するコマンドラインは次のようになります。ここで、zcatgzip圧縮ファイルから抽出します。

# < sdcard.img.gz zcat | dd of=/dev/sdx bs=4096 count=524288
524288+0 records in
524288+0 records out
2147483648 bytes (2,1 GB, 2,0 GiB) copied, 56,6886 s, 37,9 MB/s
1
sudodus