![¿Cómo cambiar ddrescue de `/dev/sdq1` a `/dev/sdq` si ya hice una copia de seguridad de los datos de `/dev/sdq1`?](https://rvso.com/image/1518674/%C2%BFC%C3%B3mo%20cambiar%20ddrescue%20de%20%60%2Fdev%2Fsdq1%60%20a%20%60%2Fdev%2Fsdq%60%20si%20ya%20hice%20una%20copia%20de%20seguridad%20de%20los%20datos%20de%20%60%2Fdev%2Fsdq1%60%3F.png)
Comencé a recuperarlo /dev/sdq1
cuando 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 .vhd
y VBoxManage convertdd z:\fixed.vdi d:\disc.vhd --format VHD
después puedo adjuntarlos y leerlos .vhd
en Windows, porque VBoxManage
no es compatible.dividirconversión y requieredisco duro llenodatos sin procesar como entrada. Eso significa que debería haber empezado con ddrescue /dev/sdq
y no con /dev/sdq1
.
Descubrí que el contenido /dev/sdq1
comienza en 32256 bytes /dev/sdq
con fdisk. Edité dd
estos bytes al principio para separar el archivo begin.raw
y ahora los ejecuto cat ./rescue/begin.raw ./rescue/fixed.vdi > ./sdq.raw
para anteponerlos a los datos recuperados de /dev/sdq1
.
¿Existe una manera más fácil de continuar ddrescue
con el nuevo ./sdq.raw
registro de rescate anterior? No estoy seguro de que eso --output-position
encaje aquí. (¿Y cómo funciona exactamente? - En los documentos no queda claro cómo output-position
influirá 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-position
es la opción correcta ddrescue
o 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 dmsetup
paquete en mi Kubuntu, lo mismo en Debian.
Tenemos begin.raw
del tamaño 32256 B
y fixed.vdi
correspondiente a la partición del tamaño <X>
(aproximadamente 500 GB
, el valor exacto lo desconozco). Necesitamos expresar los tamaños en 512 B
unidades; los resultados son 63
y <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.raw
como imagen de todo el disco mientras ddrescue
aún puedes trabajar con él fixed.vdi
. Cada operación de E/S whole.raw
se asignará a begin.raw
y 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 -a
y haga sudo losetup -d /dev/loopX
lo correspondiente.