
/dev/sda というディスクがあります。
fdisk -l は次のとおりです:
Disk /dev/sda: 64.0 GB, 64023257088 bytes
255 heads, 63 sectors/track, 7783 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0000e4b5
Device Boot Start End Blocks Id System
/dev/sda1 * 1 27 209920 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 27 525 4000768 5 Extended
Partition 2 does not end on cylinder boundary.
/dev/sda5 27 353 2621440 83 Linux
/dev/sda6 353 405 416768 83 Linux
/dev/sda7 405 490 675840 83 Linux
/dev/sda8 490 525 282624 83 Linux
製造中の他のデバイスをフラッシュするためにファイル サーバーに保存するイメージを作成する必要があるため、使用済み領域 (約 4 GB のみ) のみが必要です。コピーが完了するとすぐにこのデバイスが起動可能になるはずなので、MBR などを保持したいと思います。
何かアイデアはありますか? 以前は を使っていましたdd if=/dev/sda of=[//fileserver/file]
が、そのときのマスター コピーは 4 GB のフラッシュ IDE 上にありました。
答え1
昔、組み込み Linux ディストリビューションで、イメージを圧縮する前に不要な部分をすべて取り除くという同様の問題に遭遇しました。
dd if=/dev/zero of=asdf.txt
終了するまで待ちます。asdf.txt を削除します。
デバイス上のすべての空き領域にゼロが書き込まれました。
次に、ディスク イメージを取得して gzip で圧縮します。これでスパース イメージが完成です。
おそらくあまり拡張性がなく、実際にディスクに書き込む必要がある場合に問題が発生する可能性がありますが、まあ。
ディスクの rsync スナップショットを別のボリュームに作成し、それをゼロにして、そのディスク イメージを作成することができます。
注意: SSD にとって危険な可能性があるため、ユーザーはコミットする前にこの操作を検討する必要があります。
答え2
/dev/sdXN
保存したい場所/tgtfs/image.raw
が root であると仮定します。
mkdir /srcfs && mount /dev/sdXN /srcfs
zerofill
、zerofree
または単に :を使用し
dd if=/dev/zero of=/srcfs/tmpzero.txt
て未使用のブロックをゼロで埋め、ファイル システムが完全にいっぱいになるまで待ってから、次のようにします。
rm /srcfs/tmpzero.txt
dd を使用してイメージを取得し、conv=sparse を使用してオンザフライでゼロをパンチします。
dd conv=sparse if=/dev/sdxn of=/tgtfs/image.raw
圧縮を使用する場合、ゼロ ブロックは圧縮率が高いため、dd でゼロを打ち消す必要はありません。
dd if=/dev/sdxn | gz -c | dd of=/tgtfs/image.raw
PS: フラッシュ メモリ ベースのストレージ メディア (つまり、ソース ファイル システムが SSD) でこれを (ファイル システムをゼロで埋める) 定期的に実行するのは、SSD への大量の書き込みが発生し、SSD の寿命が短くなるため、お勧めできません。(ただし、ときどきデータを転送する場合は問題ありません)
答え3
count オプションを指定して dd を使用します。
あなたの場合は fdisk を使用していたので、その方法を採用します。「sudo fdisk -l」の結果は次のようになりました:
Disk /dev/sda: 64.0 GB, 64023257088 bytes
255 heads, 63 sectors/track, 7783 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0000e4b5
Device Boot Start End Blocks Id System
/dev/sda1 * 1 27 209920 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 27 525 4000768 5 Extended
Partition 2 does not end on cylinder boundary.
/dev/sda5 27 353 2621440 83 Linux
/dev/sda6 353 405 416768 83 Linux
/dev/sda7 405 490 675840 83 Linux
/dev/sda8 490 525 282624 83 Linux
注目すべき 2 つの点は、1) ユニット サイズと 2) 「終了」列です。この場合、シリンダーは 8225280 バイトに相当します。「終了」列では、sda8 は 525 で終了します (525[ユニット]*16065*512 = ~4.3GB)
dd は、オフセット後に開始したり、特定の数のブロック後に停止するなど、さまざまな操作を実行できます。後者は、dd の count オプションを使用して実行します。コマンドは次のようになります。
sudo dd if=/dev/sda of=/your_directory/image_name.iso bs=8225280 count=526
ここで、-bs はブロック サイズです (fdisk が使用する単位を使用するのが最も簡単ですが、count オプションがこれらの単位で宣言されている限り、どの単位でも使用できます)。count はコピーする単位の数です (最後のブロックをキャプチャするには、count を 1 増やすことに注意してください)。
答え4
できません。dd
非常に低レベルのツールであり、ファイルと空き領域を区別する手段がありません。
一方、空きスペースは非常にうまく圧縮されるため、書き込み時間などではなく、ストレージ スペースのみを気にする場合は、gzip を介してパイプするだけです。