¿Cómo cambiar ddrescue de `/dev/sdq1` a `/dev/sdq` si ya hice una copia de seguridad de los datos de `/dev/sdq1`?

¿Cómo cambiar ddrescue de `/dev/sdq1` a `/dev/sdq` si ya hice una copia de seguridad de los datos de `/dev/sdq1`?

Comencé a recuperarlo /dev/sdq1cuando no estaba familiarizado con la recuperación de HDD. Bueno, tuve bastante cuidado y recuperé el 85% en unas 500 carreras.

Luego, descubrí que necesito /dev/sdq(sin 1) contenidos para convertirlos después .vhdy VBoxManage convertdd z:\fixed.vdi d:\disc.vhd --format VHDdespués puedo adjuntarlos y leerlos .vhden Windows, porque VBoxManageno es compatible.dividirconversión y requieredisco duro llenodatos sin procesar como entrada. Eso significa que debería haber empezado con ddrescue /dev/sdqy no con /dev/sdq1.

Descubrí que el contenido /dev/sdq1comienza en 32256 bytes /dev/sdqcon fdisk. Edité ddestos bytes al principio para separar el archivo begin.rawy ahora los ejecuto cat ./rescue/begin.raw ./rescue/fixed.vdi > ./sdq.rawpara anteponerlos a los datos recuperados de /dev/sdq1.

¿Existe una manera más fácil de continuar ddrescuecon el nuevo ./sdq.rawregistro de rescate anterior? No estoy seguro de que eso --output-positionencaje aquí. (¿Y cómo funciona exactamente? - En los documentos no queda claro cómo output-positioninfluirá en la interpretación del registro de rescate). No quiero copiar 500 GB cada vez que quiero obtener mi archivo ./sdq.raw.

A continuación se muestra mi script que uso para recuperar datos. A veces tuve que desconectar físicamente el disco duro porque mi concentrador USB no admite el apagado completo de sus puertos.

#!/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

¡Gracias!

PD: Tengo un concentrador Logitech USB 2.0 pero tampoco admite el apagado total en los puertos con uhubctl. ¿Quizás haya otra herramienta que pueda funcionar con él?

Respuesta1

Independientemente de si --output-positiones la opción correcta ddrescueo no,Presento la forma general de Linux de concatenar dos archivos sin escribir el resultado en el disco.

La herramienta es dmsetup. Está en el dmsetuppaquete en mi Kubuntu, lo mismo en Debian.

Tenemos begin.rawdel tamaño 32256 By fixed.vdicorrespondiente a la partición del tamaño <X>(aproximadamente 500 GB, el valor exacto lo desconozco). Necesitamos expresar los tamaños en 512 Bunidades; los resultados son 63y <Y>respectivamente. En el código siguiente debe reemplazarlo <Y>con el valor calculado, así que no lo copie y pegue sin pensar.

# 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

Ahora puedes utilizarlo whole.rawcomo imagen de todo el disco mientras ddrescueaún puedes trabajar con él fixed.vdi. Cada operación de E/S whole.rawse asignará a begin.rawy fixed.vdi.

Tenga en cuenta que esta asignación no es persistente. Después de reiniciar, deberá repetir todo el procedimiento excepto ln -s.

Para limpiar esta configuración sin reiniciar, invoque:

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)

Si pierde las variables de alguna manera (por ejemplo, al cerrar el emulador de terminal), examine la salida losetup -ay haga sudo losetup -d /dev/loopXlo correspondiente.

información relacionada