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

0

Comecei a recuperar meu /dev/sdq1 quando não estava familiarizado com a recuperação do disco rígido. Bem, fui cuidadoso o suficiente e recuperei 85% em cerca de 500 execuções.

Depois, descobri que preciso de /dev/sdq (sem 1) conteúdo para convertê-los depois em .vhd com VBoxManage convertdd z:\fixed.vdi d:\disc.vhd --format VHD e depois de poder anexar e ler .vhd no Windows, porque VBoxManage não suporta conversão partição e requer dados brutos disco rígido completo como uma entrada. Isso significa que eu deveria ter iniciado o ddrescue com /dev/sdq e não /dev/sdq1 .

Descobri que o conteúdo de /dev/sdq1 começa em 32256 byte de /dev/sdq com fdisk. Eu dd ed esses bytes no início para separar o arquivo begin.raw e agora executando cat ./rescue/begin.raw ./rescue/fixed.vdi > ./sdq.raw para pré-anexá-los aos dados recuperados de /dev/sdq1 .

Existe uma maneira mais fácil de continuar as execuções de ddrescue para esse novo ./sdq.raw com o antigo rescueombog? Não tenho certeza de que --output-position caiba aqui. (e como funciona exatamente? - Isso não fica claro em como o output-position influencia na interpretação do salvamento). Eu não quero copiar 500GB toda vez que eu quiser pegar meu ./sdq.raw .

Abaixo está meu script que eu uso para recuperar dados. Às vezes, tive que desconectar o HDD fisicamente porque meu hub usb não oferece suporte a uma desativação completa 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!

S. Eu tenho o hub Logitech USB 2.0, mas ele não suporta poweroff completo em portas com uhubctl . Talvez haja outra ferramenta que possa trabalhar com ela?

    
por Vyacheslav Napadovsky 14.01.2017 / 18:32

1 resposta

2

Independentemente de se --output-position é a opção ddrescue correta ou não, apresento o modo geral do Linux de concatenar dois arquivos sem gravar o resultado no disco.

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

Temos begin.raw do tamanho 32256 B e fixed.vdi correspondente à partição do tamanho <X> (sobre 500 GB , o valor exato desconhecido para mim). Precisamos expressar os tamanhos em 512 B unit; os resultados são 63 e <Y> , respectivamente. No código abaixo, você precisa 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 uma imagem de todo o disco, enquanto ddrescue ainda pode funcionar com fixed.vdi . Cada operação de E / S em whole.raw será mapeada para begin.raw e fixed.vdi .

Observe que esse mapeamento não é persistente. Após a reinicialização, é necessário repetir todo o procedimento, exceto ln -s .

Para limpar esta configuração sem 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)

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 sudo losetup -d /dev/loopX de acordo.

    
por 15.01.2017 / 19:06