Como mudar o ddrescue de `/dev/sdq1` para `/dev/sdq` se eu já fiz backup dos dados de `/dev/sdq1`?

Como mudar o ddrescue de `/dev/sdq1` para `/dev/sdq` se eu já fiz backup dos dados de `/dev/sdq1`?

Comecei a recuperar /dev/sdq1quando 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 .vhdwith VBoxManage convertdd z:\fixed.vdi d:\disc.vhd --format VHDe depois de poder anexar e ler .vhdno Windows, porque VBoxManagenão suportapartiçãoconversão e requerdisco rígido cheiodados brutos como entrada. Isso significa que eu deveria ter iniciado o ddrescue com /dev/sdqe não /dev/sdq1.

Eu descobri que o conteúdo /dev/sdq1começa em 32256 bytes /dev/sdqcom fdisk. Eu ddeditei esses bytes no início para separar o arquivo begin.rawe agora estou executando cat ./rescue/begin.raw ./rescue/fixed.vdi > ./sdq.rawpara anexá-los aos dados recuperados do arquivo /dev/sdq1.

Existe uma maneira mais fácil de continuar ddrescuecom o novo registro ./sdq.rawde resgate antigo? Não tenho certeza se isso --output-positionvai caber aqui. (e como funciona exatamente? - Isso não está claro nos documentos como output-positioninfluenciará 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-positionser a opção certa ddrescueou não,Apresento a maneira geral do Linux de concatenar dois arquivos sem gravar o resultado no disco.

A ferramenta é dmsetup. Está no dmsetuppacote do meu Kubuntu, o mesmo no Debian.

Temos begin.rawdo tamanho 32256 Be fixed.vdicorrespondente à partição do tamanho <X>(cerca de 500 GB, o valor exato desconhecido para mim). Precisamos expressar os tamanhos em 512 Bunidades; os resultados são 63e <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.rawcomo imagem de todo o disco enquanto ddrescueainda pode trabalhar com arquivos fixed.vdi. Cada operação de E/S on whole.rawserá mapeada para begin.rawe 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 -ae faça o procedimento sudo losetup -d /dev/loopXde acordo.

informação relacionada