Я начал восстанавливать мой /dev/sdq1 когда я не был знаком с восстановлением жесткого диска. Ну, я был достаточно осторожен и выздоровел на 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 повлияет на интерпретацию журнала спасения). Я не хочу копировать 500 ГБ каждый раз, когда хочу получить ./sdq.raw .

Ниже мой скрипт, который я использую для восстановления данных. Иногда мне приходилось физически отключать жесткий диск, потому что мой 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 ответ1

2

Независимо от того, является ли --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 соответственно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .