
私はHDDのリカバリに慣れていない頃にリカバリを始めました/dev/sdq1
。慎重に行った結果、約500回の実行で85%をリカバリすることができました。
/dev/sdq
その後、私は実際にそれらを変換するために(1なし)コンテンツが.vhd
必要であることを発見しましたVBoxManage convertdd z:\fixed.vdi d:\disc.vhd --format VHD
。その後、.vhd
Windowsで添付して読むことができVBoxManage
ます。パーティション変換が必要であり、ハードドライブがいっぱい生データを入力として使用します。つまり、/dev/sdq
ではなくで ddrescue を起動する必要がありました/dev/sdq1
。
fdisk を使用して、の内容が/dev/sdq1
の 32256 バイトから始まることを発見しました。先頭のこれらのバイトを別のファイルに編集し、から回復したデータの先頭に追加するために実行しています。/dev/sdq
dd
begin.raw
cat ./rescue/begin.raw ./rescue/fixed.vdi > ./sdq.raw
/dev/sdq1
ddrescue
古い rescuelog で新しい の実行を継続するより簡単な方法はありますか./sdq.raw
? それがここに当てはまるかどうかはわかりません--output-position
。(そして、それは正確にはどのように機能しますか? - これは、rescuelog の解釈にどのように影響するかについて、ドキュメントからは明らかではありませんoutput-position
)。 を取得するたびに 500 GB をコピーしたくありません./sdq.raw
。
以下は、私がデータを回復するために使用するスクリプトです。USB ハブがポートの完全な電源オフをサポートしていないため、HDD を物理的に取り外す必要がある場合もありました。
#!/bin/bash
function run {
ddrescue -T 5s --max-error-rate=10MB --skip-size=512KiB,10MiB \
--direct -vv -P /dev/sdq1 ./fixed.vdi ./rescue.log
}
while true; do
run &
JOBPID=$!
while true; do
dmesg | tail -1 | grep 'reset high-speed USB device number' > /dev/null
CODE=$?
if [ $CODE -eq 0 ]; then
break
fi
kill -0 "$JOBPID" > /dev/null
CODE=$?
if [ $CODE -ne 0 ]; then
break
fi
sleep 3
done
./uhubctl -i -a 2 -p 1 -l 1
wait $JOBPID
echo "MSG: waiting for re-attach"
until dmesg | tail -1 | grep 'Attached SCSI disk'; do sleep 1; done
sleep 5
done
ありがとう!
PS 私は Logitech USB 2.0 ハブを持っていますが、これもポートの完全な電源オフをサポートしていませんuhubctl
。おそらく、これに対応できる他のツールがあるのでしょうか?
答え1
--output-position
それが正しいddrescue
選択であるかどうかにかかわらず、結果をディスクに書き込まずに 2 つのファイルを連結する一般的な Linux の方法を紹介します。
ツールは ですdmsetup
。これはdmsetup
私の Kubuntu のパッケージに含まれていますが、Debian でも同じです。
begin.raw
サイズ と があり32256 B
、これはfixed.vdi
サイズ の分割に対応しています<X>
(約500 GB
、正確な値は不明)。サイズを512 B
単位で表す必要があります。結果はそれぞれ と です63
。<Y>
以下のコードでは、 を計算した値に置き換える必要がある<Y>
ため、うっかりコピーして貼り付けないでください。
# Creating loop devices and storing their names.
BEGIN_LOOP=$(sudo losetup -f --show begin.raw)
FIXED_LOOP=$(sudo losetup -f --show fixed.vdi)
# Creating a map to feed to `dmsetup` later.
# !!! REPLACE <Y> WITH THE PROPER VALUE !!!
echo "0 63 linear $BEGIN_LOOP 0" > whole.map
echo "63 <Y> linear $FIXED_LOOP 0" >> whole.map
# Creating a concatenated "file".
sudo dmsetup create whole.raw < whole.map
ln -s /dev/mapper/whole.raw
whole.raw
をディスク全体のイメージとして使用できるようになりましたが、ddrescue
は引き続き で動作しますfixed.vdi
。 上のすべての I/O 操作はおよびwhole.raw
にマップされます。begin.raw
fixed.vdi
このマッピングは永続的ではないことに注意してください。再起動後、を除く手順全体を繰り返す必要がありますln -s
。
再起動せずにこの設定をクリーンアップするには、次のコマンドを呼び出します。
rm whole.raw # removes the symlink
sudo dmsetup remove whole.raw # removes /dev/mapper/whole.raw
sudo losetup -d $FIXED_LOOP # removes /dev/loop1 (or so)
sudo losetup -d $BEGIN_LOOP # removes /dev/loop0 (or so)
何らかの理由で変数が失われた場合 (たとえば、ターミナル エミュレーターを閉じるなど)、出力を調べてそれに応じてlosetup -a
操作しますsudo losetup -d /dev/loopX
。