web-dev-qa-db-ja.com

ディスク全体で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]を使用していましたが、そのときのマスターコピーは4GBのフラッシュIDEでした。

41
Jonathan Henson

昔、組み込みLinuxディストリビューションで同様の問題に遭遇しました。イメージを圧縮する前に、すべてのジャンクを取り除いてください。

dd if=/dev/zero of=asdf.txt。死ぬまで待ちなさい。 asdf.txtを削除します。

デバイスのすべての空き領域にゼロを書き込んだところです。

次に、ディスクイメージを取得して、gzipで実行します。ほら、まばらな画像。

おそらく、十分に拡張できず、実際にディスクに書き込む必要がある場合に問題が発生する可能性がありますが、ちょっと。

ディスクのrsyncスナップショットを別のボリュームに取得し、それをゼロにしてから、そのディスクイメージを取得できます。

注:SSDには危険が伴う可能性があるため、ユーザーはコミット前にこの操作を検討する必要があります。

39
Rob Bos

保存することを想定している/dev/sdXN/tgtfs/image.rawそしてあなたはrootです:

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

  2. zerofillを使用するか、単に:
    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に接続し、寿命を縮めます。 (ただし、データの不定期の転送には問題ありません)

21

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はコピーするユニットの数です(注最後のブロックをキャプチャするために、カウントを1ずつ増やします)。

14
Tom Looby

空きディスク領域を/dev/zeroingしてdd conv=sparse/gz -cを使用することは可能ですが、空の領域が数百GBで実行されている巨大なディスクでは、/dev/zeroingは非常に遅くなります-ない他の回答が述べたように、EOFまでSDDを/dev/zeroingすることを言及します。

この状況に遭遇したときに私がしたことは次のとおりです。

  • LubuntuライブCDでは、gpartedを使用してディスクを可能な最小サイズに「縮小」し、残りのスペースを未割り当てのままにしました

  • 中古
    dd bs=1M count=<size_in_MBs> if=/dev/sdX | gzip -c --fast| dd of=/path/to/image.gzを使用して高速圧縮画像を作成します(言うまでもなく、生データを保存するのに十分なスペースがある場合(または、CPUの負荷を減らす傾向がある場合)は、圧縮をスキップすることもできます)

  • 中古
    dd if=/path/to/image.gz | gunzip -c | dd bs=1M of=/dev/sdYは、データを別のディスクにコピーして戻します
  • 再度gpartedを使用してパーティションを「拡張」しました

私は複数のパーティションで試したことはありませんが、先のディスクのパーティションテーブルが最初に作成され、パーティションに含まれるデータのみがddを介してコピーされる場合、上記のプロセスは「パーティション」をコピーするように適合できると思います-必要に応じて、オフセットの読み取り/書き込み(skip/seekddオプション)が必要になります。

10
Ashish Chopra

できません。 ddは非常に低レベルのツールであり、ファイルと空のスペースを区別する手段がありません。

一方、空のスペースは非常にうまく圧縮されるので、たとえば書き込み時間などではなく、ストレージスペースのみに関心がある場合は、gzipにパイプするだけです。

8
c2h5oh

ドライブの残りが空(すべてゼロ)であると想定すると、gzipを介してDDをパイプすることができます。これにより、空のスペースが非常にうまく圧縮されます。 zerofree のようなツールを使用して、空のスペースが実際に空白であることを確認し、適切に圧縮することができます。

partimageclonezilla などのツールや他のLinuxクローンツールを使用すると、これらのほとんどが自動的に処理されます。

7
Zoredache

受け入れられた答えは正しくありません。上記のコメントに同意します。 ddcountパラメータと共に使用して、定期的にディスクをバックアップします。 BACKUP_FOLDERとデバイスの文字を「X」に置き換えるだけです。

ディスクの最後に使用されたブロックを定義します。

ct=$(fdisk -l | awk '$1 == "/dev/sdX" { print $3 }')

次に、ディスクのクローンを作成します(空のスペースを除く)。

dd if=/dev/sdX bs=512 count=$ct | gzip > BACKUP_FOLDER/sdX_$(date +"%Y-%m-%d").img.gz >>"$LOG"
4
Aloha D