Как переключить ddrescue с `/dev/sdq1` на `/dev/sdq`, если я уже сделал резервную копию данных с `/dev/sdq1`?

Как переключить ddrescue с `/dev/sdq1` на `/dev/sdq`, если я уже сделал резервную копию данных с `/dev/sdq1`?

Я начал восстанавливать свои, /dev/sdq1когда я не был знаком с восстановлением HDD. Ну, я был достаточно осторожен и восстановил 85% примерно за 500 запусков.

Впоследствии я обнаружил, что мне нужно /dev/sdq(без 1) содержимое, чтобы фактически преобразовать его после в .vhdс VBoxManage convertdd z:\fixed.vdi d:\disc.vhd --format VHDи после этого я могу прикрепить и прочитать это .vhdв Windows, потому что VBoxManageне поддерживаетразделпреобразование и требуетполный жесткий дисксырые данные в качестве входных данных. Это означает, что мне следовало запустить ddrescue с , /dev/sdqа не /dev/sdq1.

Я обнаружил, что содержимое /dev/sdq1начинается с 32256 байт /dev/sdqс помощью fdisk. Я ddотредактировал эти байты в начале, чтобы отделить файл begin.raw, и теперь запускаю cat ./rescue/begin.raw ./rescue/fixed.vdi > ./sdq.raw, чтобы добавить их к восстановленным данным из /dev/sdq1.

Есть ли более простой способ продолжить запуски в ddrescueэтом новом ./sdq.rawсо старым rescuelog? Я не уверен, что это --output-positionподойдет сюда. (и как именно это работает? -- Из документации не ясно, как это output-positionповлияет на интерпретацию rescuelog). Я не хочу копировать 500 ГБ каждый раз, когда хочу получить свой ./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. Он есть в 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. Каждая операция ввода-вывода на 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соответствующие меры.

Связанный контент