Comecei a recuperar /dev/sdq1
quando não estava familiarizado com a recuperação de HDD. Bem, fui cuidadoso o suficiente e recuperei 85% em cerca de 500 corridas.
Depois, descobri que preciso /dev/sdq
(sem 1) conteúdo para convertê-los depois para .vhd
with VBoxManage convertdd z:\fixed.vdi d:\disc.vhd --format VHD
e depois de poder anexar e ler .vhd
no Windows, porque VBoxManage
não suportapartiçãoconversão e requerdisco rígido cheiodados brutos como entrada. Isso significa que eu deveria ter iniciado o ddrescue com /dev/sdq
e não /dev/sdq1
.
Eu descobri que o conteúdo /dev/sdq1
começa em 32256 bytes /dev/sdq
com fdisk. Eu dd
editei esses bytes no início para separar o arquivo begin.raw
e agora estou executando cat ./rescue/begin.raw ./rescue/fixed.vdi > ./sdq.raw
para anexá-los aos dados recuperados do arquivo /dev/sdq1
.
Existe uma maneira mais fácil de continuar ddrescue
com o novo registro ./sdq.raw
de resgate antigo? Não tenho certeza se isso --output-position
vai caber aqui. (e como funciona exatamente? - Isso não está claro nos documentos como output-position
influenciará a interpretação do Rescuelog). Não quero copiar 500 GB cada vez que quiser obter meu arquivo ./sdq.raw
.
Abaixo está meu script que uso para recuperar dados. Às vezes eu tive que desconectar o HDD fisicamente porque meu hub USB não suporta desligamento completo em suas portas.
#!/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
Obrigado!
PS Eu tenho um hub Logitech USB 2.0, mas ele também não suporta desligamento total nas portas com uhubctl
. Talvez haja outra ferramenta que possa funcionar com isso?
Responder1
Independentemente de --output-position
ser a opção certa ddrescue
ou não,Apresento a maneira geral do Linux de concatenar dois arquivos sem gravar o resultado no disco.
A ferramenta é dmsetup
. Está no dmsetup
pacote do meu Kubuntu, o mesmo no Debian.
Temos begin.raw
do tamanho 32256 B
e fixed.vdi
correspondente à partição do tamanho <X>
(cerca de 500 GB
, o valor exato desconhecido para mim). Precisamos expressar os tamanhos em 512 B
unidades; os resultados são 63
e <Y>
respectivamente. No código abaixo você deve substituir <Y>
pelo valor computado, portanto não copie e cole sem 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
Agora você pode usar whole.raw
como imagem de todo o disco enquanto ddrescue
ainda pode trabalhar com arquivos fixed.vdi
. Cada operação de E/S on whole.raw
será mapeada para begin.raw
e fixed.vdi
.
Observe que esse mapeamento não é persistente. Após uma reinicialização, você precisa repetir todo o procedimento, exceto ln -s
.
Para limpar esta configuração sem reinicializar, 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)
Se você perder as variáveis de alguma forma (por exemplo, fechando o emulador de terminal), examine a saída de losetup -a
e faça o procedimento sudo losetup -d /dev/loopX
de acordo.