ディスク全体でdd、ただし空の部分は不要


33

/ 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

製造中の他のデバイスのフラッシュに使用するために、ファイルサーバーに保存するイメージを作成する必要があるので、使用済みスペース(約4GB)のみが必要です。このデバイスは、コピーが終了するとすぐに起動可能になるはずなので、mbrなどを保持したいです。

何か案は?以前はを使用dd if=/dev/sda of=[//fileserver/file]していましたが、その時点で、マスターコピーは4GBのフラッシュideにありました。


2
以下の回答はすべて、@ sudoerを除いて間違っています。正解はを使用することdd conv=sparseです。
バハマ

@bahamat、いいえ、gzipはデータを圧縮するため、より優れています。
プーシ

1
それはスパースと同じものではありません。
バハマ

@bahamat、質問はスプラーゼを特に求めているのではありません。画像のスペースを取りません。
psusi

回答:


37

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

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

デバイスのすべての空き領域にゼロを書き込みました。

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

おそらくあまりうまくスケーリングせず、実際にディスクに書き込む必要がある場合に問題を引き起こす可能性がありますが、ちょっと。

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

注:SSDにとって危険な場合があるため、ユーザーはこの操作をコミット前に検討する必要があります。


gzipで実行する場合、使用する前に解凍する必要がありますか?そして、gzipで実行することで、ddプロセス中にパイプするだけですか?
ジョナサンヘンソン

3
はい。 dd if=sda2.gz | gunzip > /dev/sda2そしてdd if=/dev/sda2 | gzip > sda2.gz
ロブ・ボス

3
「デバイスのすべての空き領域にゼロを書き込んだところです」。デバイスではなくパーティションを意味します。したがってof、各パーティションのパスを指定してそのコマンドを実行する必要があります。
ジグガンジャー

物理メディアがSSDである場合、デバイス上のすべてのセクターが使用されたと見なされる場合があります。これにより、SSDで使用するスペアセクターが少なくなり、結果としてパフォーマンスが低下する可能性があります。ドライバーとファームウェアがTRIMをサポートしている場合、その条件はファイルを再度削除するまで適用されます。イメージの作成中にファイルを保持した場合、イメージを復元した後、ファイルを再度削除する必要があります。これは、イメージがSSDに復元される場合に役立ちます。
カスペルド

留意すべき追加の懸念事項がいくつかあります。この方法では、ファイルシステムを読み書き可能にマウントする必要があるため、コピーの進行中に基礎となるファイルシステムを変更すると、イメージの一貫性が失われるリスクがあります。ある時、コピーの不整合を修復しようとするとfsckが実際にセグメンテーション違反を起こす結果のコピーが非常に矛盾しているのを見てきました。また、デバイスがいっぱいになると、メディアへの書き込みが必要な他のプロセスが失敗する可能性があります。
カスペルド

17

あなたがに保存/dev/sdXN/tgtfs/image.raw、あなたがルートであると仮定します:

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

  2. zerofillまたはjust: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)ではお勧めできません。


5
これは正解です。を使用しdd conv=sparseます。
バハマ

1
フラッシュストレージでこれを行うことの何が問題になっていますか?
ダン

2
@Dan(ハードウェアとソフトウェアの設計と構成によって異なります)は、SSDへの大量の書き込みを引き起こし、SSDの寿命を縮める可能性があります。過度に、古いディスクから新しいディスクにデータを移動しても問題ありません(またはOPが望んだことです)が、ディスク/パーティションレベルのバックアップは、HDDであっても定期的なバックアップと復元に適したソリューションではありません。ファイルレベルのバックアップ(つまり、あるファイルシステムから別のファイルシステムにファイルをコピーする)、またはファイルシステムレベルのバックアップ(BTRFSなどのファイルシステムbtrfs snapshotおよびbtrfs sendツールを使用)は、より良いソリューションです。
-Sudoer

ヒント:持っgzていない場合PATH(GParted Liveで持っていなかったように)、gzip -c代わりに使用できます。
XtraSimplicity

11

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 [units] * 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インクリメントします)。


fdisk -l -u=cylinders /dev/sda
参考までに

3
なぜこれが受け入れられた答えではないのですか?ソースを変更しないため、最も邪魔にならないようです。
user33326

@ user33326この回答は、パーティション内の未使用のスペースではなく、ドライブ上のパーティション化されていないスペースをコピーしないのに適しているためです。
GDorn

8

一方で/dev/zero、フリーディスクスペースと使用をINGのdd conv=sparse/ gz -c空きスペースは、GB単位の数百に実行されていると巨大なディスク上に、可能である/dev/zero痛々しいほど遅いINGのさ-他の答えが述べたように、それを言及しないように/dev/zeroEOFまでSDDをする。

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

  • 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/のseekオプションdd、それぞれ)必要に応じて必要になります。


1
これは単に使用、本当の答えであるcountパラメータ
ゴーディ

7

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

一方、空のスペースは非常にうまく圧縮されるため、書き込み時間などではなく、ストレージスペースのみが必要な場合は、gzipを介してパイプするだけです。


7
空き領域が以前に使用されていないと仮定します。圧縮が期待どおりに機能するように、最初に空き領域をゼロで埋めることができます。
Sirex

1
本当です。また、プロセスが複雑になるだけでなく、さらに時間がかかります。
c2h5oh

6

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

partimageclonezilla、または他のLinuxクローニングツールのようなツールを使用する場合、これらのツールのほとんどは自動的に処理されます。


PartimageのとClonezillaを、実際にスキップするスマート十分で読んではなく、それにゼロを書き込み、その後、DDまたはgzipのドロップを持っているか、それらを読んだ後にゼロを圧縮するためにあなたに頼るよりも、空きスペースを。
psusi

2

受け入れられた答えは正しくありません。上記のコメントに同意します。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"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.