ディスク全体にddを実行するが、空き部分は不要

ディスク全体にddを実行するが、空き部分は不要

/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 であると仮定します。

  1. mkdir /srcfs && mount /dev/sdXN /srcfs

  2. zerofillzerofreeまたは単に :を使用し
    dd if=/dev/zero of=/srcfs/tmpzero.txt
    て未使用のブロックをゼロで埋め、ファイル システムが完全にいっぱいになるまで待ってから、次のようにします。
    rm /srcfs/tmpzero.txt

  3. 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 を介してパイプするだけです。

関連情報