web-dev-qa-db-ja.com

dd画像を複数のファイルに分割する

私はハードディスクからいくつかのデータ復旧を行っています。ディスクには約300GBのデータがありますが、300GBの空き容量がある別のハードドライブがありません。

私は3つのHDを持っており、150、40、120GBが無料です。

最初のチャンクを作成するために、次のことを検討しました。

Sudo dd if=/dev/sdf1 bs=4096 count=150G | gzip > img1.gz

「中断したところから再開」するには、他のマシンで何を実行する必要がありますか?

6
lfaraone

KPWINCが言うように、おそらくtarの使用を検討したいと思うかもしれませんが、質問に直接答えるには、ddの「スキップ」オプションを使用したいと思います。

前述のように、最初のコマンドが次の場合:

Sudo dd if=/dev/sdf1 bs=4096 count=150GB | gzip > img1.gz

次に、2番目は次のようになります。

Sudo dd if=/dev/sdf1 bs=4096 skip=150GB count=40GB | gzip > img2.gz

そして3番目:

Sudo dd if=/dev/sdf1 bs=4096 skip=190GB count=120GB | gzip > img3.gz

とはいえ、「GB」サフィックスが意図したとおりに機能するかどうかはわかりません。指定したブロックサイズからその数ギガバイトを取得する方法を理解するのではなく、それに続くルート番号に対して生の計算を行うだけだと思います。私はこのようなことをします:

dd if=/dev/sdf1 bs=`expr 10 * 1024 * 1024` count=`expr 15 * 1024 * 1024 * 1024`

数学を確実にするためだけに。

ああ、それをコピーするときに、デバイスがあなたの下で変化していないことを確認してください。それは悪いことです。

5
wfaulk

単純な解決策は、「/ usr/bin/split」を使用することです。ファイルを分割するだけです。標準入力から読み取る入力ファイル名として「-」を使用できます。分割の良いところは、シンプルで、ツールチェーンに実際の影響を与えず、「cat」を使用してファイルをグロブに戻す(または別のアプリにパイプする)だけでファイルを「結合」できることです。

7
Michael Tiller

それは私のコマンドラインです:

dd if=/dev/sda bs=4M | gzip -c | split -b 2G - /mnt/backup_sda.img.gz

この方法で2GBのファイルを作成します。

backup_sda.img.gz.aa
backup_sda.img.gz.ab
backup_sda.img.gz.ac

戻す:

cat /mnt/UDISK1T/backup_sda.img.gz.* | gzip -dc | dd of=/dev/sda bs=4M

それが役に立てば幸い。

4
Aaron

tar

私はあなたの問題を解決するかもしれません。ファイルを複数のボリュームに分割する機能があります。

このリンクをチェックしてください:

http://paulbradley.tv/44/

ページから:

標準構文に加えて使用する必要がある2つの追加のコマンドラインオプションは-M(-multi-volume)で、これはTarにファイルを複数のメディアディスクに分割するように指示します。次に、Tarにそのメディアの大きさを伝えて、正しいサイズのファイルを作成できるようにする必要があります。これを行うには、-tape-lengthオプションを使用します。ここで、渡す値は数値x1024バイトです。

以下の例は、使用される構文を示しています。 largefile.tgzが150 Megであり、2つの100 Meg Zipドライブにファイルを収める必要があるとします。

tar -c -M --tape-length = 102400 --file = disk1.tar largefile.tgz

値102400は1024x 100で、disk1.tarという100 Megファイルが作成され、Tarは次のようにボリューム2のプロンプトを表示します:-

Disk1.tar用にボリューム#2を準備し、returnキーを押します。

テープドライブの時代には、最初のテープをマシンから取り出して新しいテープを挿入し、Returnキーを押して続行します。 Tarに残りの50Megを別のファイルに作成させたいので、次のコマンドを発行します:-

n disk2.tar

これにより、tarは、largefile.tgzの残りの50Megをdisk2.tarという名前のファイルに書き込み続けるように指示されます。次に、以下の行のプロンプトが表示され、Returnキーを押して続行できます。

Disk2.tar用にボリューム#2を準備し、returnキーを押します。

大きなファイルが完全に処理されるまでこのプロセスを繰り返し、プロンプトが表示されるたびにファイル名のディスク番号を増やします。

1
KPWINC

ここにいくつかのこと。まず、リストしたコマンドは、おそらく期待どおりに機能しません。 150GBに到達しようとしているように見えますが、ブロックサイズとカウントの両方を考慮する必要があります(カウントはブロックサイズのブロックの数です)。したがって、150 GBが必要な場合は、bs=1GB count=150を使用します。次に、2回目の実行でskip=150を追加して150ブロック(それぞれ1GB)をスキップすることにより、中断したところから再開できます。また、gzipで出力を標準出力に送信するには、-cオプションを渡す必要があります。

ただし、その前に、他にいくつか質問があります。ファイルシステムが破損/破損などしていて、ビットごとに正確なディスクイメージのコピーが必要なため、ここでddを使用していますか?それとも、データを取得しようとしているだけですか?ファイルシステム対応ツールの方が効果的かもしれません。特にソースファイルシステムがいっぱいでない場合。オプションにはtarが含まれますが、 ClonezillaPartclonePartimage などのWindows固有のオプションを直接調べることもできます。 Windowsファイルシステムにアクセスします Linux-NTFS (前述のツールはWindowsファイルシステムをさまざまな程度で処理できることに注意してください)。

ファイルシステムに対応していないプログラムを使用してパーティションを操作するように設定されている場合は、dd行を使用すると(上記で正しく変更されているように)機能する可能性があります。どれだけうまく圧縮できるかはわかりませんが、元のファイルシステムよりも小さくする必要があります。元のファイルシステムへの読み取り/書き込みアクセス権がある場合、ddで保存する前に、/ dev/zeroから書き込まれたファイルで空き領域を埋めて、未使用の領域をゼロにする価値があります。これにより、ディスクイメージの空き領域を圧縮するgzipの機能が強化されます。

2番目のチャンクを操作するには、2番目のdd呼び出しにskip=XXXビットを追加するだけです。ここで、「XXX」は、最初に指定したcount=値と同じです。最初のもので150GB、2番目のもので40GBを実行したい場合は、次のようにします。

Sudo dd if=/dev/sdf1 bs=1GB count=150 | gzip -c > img1.gz

に続く:

Sudo dd if=/dev/sdf1 bs=1GB skip=150 count=40 | gzip -c > img2.gz

1

パーティーに遅刻しましたが、FAT32スティック上の不明なファイルシステムをバックアップするためにそのようなスクリプトを実行する必要がありました。

この簡単なスクリプトは私にとってはうまくいきます:

# Sets pipefail so failed dd makes the whole pipe command fail
set -o pipefail
dd_result=0
split=0
filenameSplit=
while [ $dd_result == 0 ]
do
    cmd="dd if=/dev/sdX bs=2G count=1 skip=$split | pigz --fast > \"2G.$filenameSplit.myharddisk.gz\""
    echo $cmd
    eval $cmd
    dd_result=$?
    split=$((split + 1))
    filenameSplit=$split
done

編集:dd、pigz、またはgzip圧縮を使用し、コマンドラインで設定できるチャンクにファイルを分割する基本的なバックアップ復元スクリプトをアップロードしました。スクリプトはここにあります: github.com/deajan/linuxscripts

0
Orsiris de Jong