Как переключить 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 со старым спасением? Я не уверен что --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 ответ
Несмотря на погоду --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 соответственно.