/ 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でした。
昔、組み込みLinuxディストリビューションで同様の問題に遭遇しました。イメージを圧縮する前に、すべてのジャンクを取り除いてください。
dd if=/dev/zero of=asdf.txt
。死ぬまで待ちなさい。 asdf.txtを削除します。
デバイスのすべての空き領域にゼロを書き込んだところです。
次に、ディスクイメージを取得して、gzipで実行します。ほら、まばらな画像。
おそらく、十分に拡張できず、実際にディスクに書き込む必要がある場合に問題が発生する可能性がありますが、ちょっと。
ディスクのrsyncスナップショットを別のボリュームに取得し、それをゼロにしてから、そのディスクイメージを取得できます。
注:SSDには危険が伴う可能性があるため、ユーザーはコミット前にこの操作を検討する必要があります。
保存することを想定している/dev/sdXN
〜/tgtfs/image.raw
そしてあなたはrootです:
mkdir /srcfs && mount /dev/sdXN /srcfs
zerofill
を使用するか、単に: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に接続し、寿命を縮めます。 (ただし、データの不定期の転送には問題ありません)
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ずつ増やします)。
空きディスク領域を/dev/zero
ingしてdd conv=sparse
/gz -c
を使用することは可能ですが、空の領域が数百GBで実行されている巨大なディスクでは、/dev/zero
ingは非常に遅くなります-ない他の回答が述べたように、EOFまでSDDを/dev/zero
ingすることを言及します。
この状況に遭遇したときに私がしたことは次のとおりです。
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
オプション)が必要になります。
できません。 dd
は非常に低レベルのツールであり、ファイルと空のスペースを区別する手段がありません。
一方、空のスペースは非常にうまく圧縮されるので、たとえば書き込み時間などではなく、ストレージスペースのみに関心がある場合は、gzipにパイプするだけです。
ドライブの残りが空(すべてゼロ)であると想定すると、gzipを介してDDをパイプすることができます。これにより、空のスペースが非常にうまく圧縮されます。 zerofree のようなツールを使用して、空のスペースが実際に空白であることを確認し、適切に圧縮することができます。
partimage 、 clonezilla などのツールや他のLinuxクローンツールを使用すると、これらのほとんどが自動的に処理されます。
受け入れられた答えは正しくありません。上記のコメントに同意します。 ddをcountパラメータと共に使用して、定期的にディスクをバックアップします。 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"