如果我已經從“/dev/sdq1”備份了數據,如何將 ddrescue 從“/dev/sdq1”切換到“/dev/sdq”?

如果我已經從“/dev/sdq1”備份了數據,如何將 ddrescue 從“/dev/sdq1”切換到“/dev/sdq”?

/dev/sdq1當我不熟悉硬碟恢復時,我開始恢復我的硬碟。好吧,我足夠小心,在大約 500 次運行中恢復了 85%。

後來,我發現我/dev/sdq實際上需要(沒有 1)內容將它們轉換為.vhdwith並且在我可以在 Windows 中VBoxManage convertdd z:\fixed.vdi d:\disc.vhd --format VHD附加並讀取它之後,因為不支持.vhdVBoxManage分割轉換並需要全硬碟原始資料作為輸入。這意味著我應該用/dev/sdq而不是開始 ddrescue /dev/sdq1

我發現fdisk的內容/dev/sdq1從32256位元組開始。/dev/sdqdd在開始時編輯了這些位元組以分隔文件begin.raw,現在運行cat ./rescue/begin.raw ./rescue/fixed.vdi > ./sdq.raw以將它們添加到從/dev/sdq1.

有沒有更簡單的方法可以使用舊的救援日誌繼續運行ddrescue新的./sdq.raw?我不確定這--output-position是否適合這裡。 (它到底是如何運作的?——文件中尚不清楚這output-position將如何影響救援日誌的解釋)。我不想每次想要獲取我的./sdq.raw.

下面是我用來恢復資料的腳本。有時我必須物理分離 HDD,因為我的 USB 集線器不支援其連接埠完全關閉電源。

#!/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我介紹了連接兩個檔案而不將結果寫入磁碟的一般 Linux 方法。

該工具是dmsetup.我的Kubuntu中是這個dmsetup包,Debian中也是。

我們begin.raw有的大小32256 Bfixed.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相應操作。

相關內容