すでに `/dev/sdq1` からデータをバックアップしている場合、ddrescue を `/dev/sdq1` から `/dev/sdq` に切り替えるにはどうすればよいでしょうか?

すでに `/dev/sdq1` からデータをバックアップしている場合、ddrescue を `/dev/sdq1` から `/dev/sdq` に切り替えるにはどうすればよいでしょうか?

私はHDDのリカバリに慣れていない頃にリカバリを始めました/dev/sdq1。慎重に行った結果、約500回の実行で85%をリカバリすることができました。

/dev/sdqその後、私は実際にそれらを変換するために(1なし)コンテンツが.vhd必要であることを発見しましたVBoxManage convertdd z:\fixed.vdi d:\disc.vhd --format VHD。その後、.vhdWindowsで添付して読むことができVBoxManageます。パーティション変換が必要であり、ハードドライブがいっぱい生データを入力として使用します。つまり、/dev/sdqではなくで ddrescue を起動する必要がありました/dev/sdq1

fdisk を使用して、の内容が/dev/sdq1の 32256 バイトから始まることを発見しました。先頭のこれらのバイトを別のファイルに編集し、から回復したデータの先頭に追加するために実行しています。/dev/sdqddbegin.rawcat ./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.rawfixed.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

関連情報