terça-feira, novembro 06, 2007

Recuperando dados de HDs, CDs e DVDs defeituosos com o dd

O dd é um comando usado para clonar partições inteiras, bloco a bloco. Você pode usá-lo para clonar CDs e DVDs também. Mas o que acontece quando você tenta clonar partições ou CDs com defeito? A cópia é abortada.

Outro dia mesmo recebi de uma cliente um DVD no qual ela havia gravado uma festinha de sua filha de 5 anos. O DVD-RW em que a festa foi gravada estava danificado, e com isso o arquivo todo do filme estava inacessível. É um problema bastante irritante: você tem um filme de 400 MB, e por causa de 1 ou 2 MB com defeito a cópia do arquivo é abortada.

Foi então que descobri o dd_rescue. Ao contrário do dd, ele segue adiante, mesmo encontrando erros durante a cópia, e ainda tenta recuperar dados em setores defeituosos. Com isso, no caso do DVD, eu poderia recuperar boa parte do vídeo, embora perdendo alguns megas - o que, com certeza, seria bem melhor do que perder o arquivo inteiro. Ele funciona assim:

  dd_rescue /dev/hdc ~/Desktop/dvd_da_festa.img

Onde /dev/hdc é o dispositivo do meu DVD player. O comando acima gera uma imagem do DVD-RW danificado, da melhor maneira possível, sem truncar o arquivo. Às vezes, quando o estrago é grande, não há muito o que fazer. Mas muitas vezes, com a imagem em mãos, é possível montá-la com o mount e extrair vários arquivos dela, desta maneira:

  # mount -o loop ~/Desktop/dvd_da_festa.img /mnt/tmp

O único inconveniente é que, ao topar com badblocks, o dd_rescue se esforça ao máximo para recuperar os dados, e embora muitas vezes consiga, ele demora bastante para conseguir. Com isso, a recuperação do DVD levaria dias... Sem falar que se você estiver recuperando dados de um HD que já esteja nas últimas, o esforço para recuperar setores com badblocks pode acabar rendendo o último suspiro do HD. Não seria melhor checar primeiro os blocos não danificados, para garantir alguma coisa? Foi então que descobri algo ainda melhor: o dd_rhelp.

Funcionando como um complemento ao dd_rescue, o dd_rhelp "pula" os setores defeituosos, cuidando primeiro dos setores em perfeito estado. Com isso, se você tem um CD de 600 MB e apenas 10 MB estão danificados, o dd_rhelp vai recuperar 590 MB rapidamente, deixando os 10 MB críticos para o final. Se você vai executar a recuperação completa, saiba que ambos os programas levarão o mesmo tempo. Porém, talvez o dd_rhelp já tenha restaurado o suficiente, e você não sinta a necessidade de restaurar os últimos 10 MB. Se estivesse usando o dd_rescue, a recuperação dos 10 MB defeituosos, que poderiam estar logo no início do disco, poderia levar horas, sem que você tivesse a menor idéia do estado do resto do disco. Veja como é prático usar o dd_rhelp:

  $ dd_rhelp /dev/hdc ~/Desktop/dvd_da_festa.img

Você pode interromper a operação com CTRL+C à vontade para continuar mais tarde. De tempos em tempos, o programa exibe ainda uma representação gráfica do progresso da recuperação, como esta:

  === dd_rhelp INFO - 226 chunks...
- Jump pos : 167826.0 - max file size : 1429088.0
- Biggest hole size : 10464 k - total holes : 1285625.5k
- xferd(succ/err) : 143462.5k(142568.0k/894.5k)
- EOF is found and is at 1429088.0k.
=== BAR === [ 'x' dd_rescued, '*' next jump point, '|' '.' not dd_rescued ]
|||x|...|.......||.......||.......|x|.......|......|x|....|xxx|......|xxx|......|xxx|......|........|....
.....|.......|.......|x|....|xxx|...*....|xx|...|xxxx|......|xxx|.......xx|.....|...|....|....|....|....|
...|....|....|...|....|....|...|....|....|...|....|...|....|....|...|....|....|...|....|.....|x|......|xx
x|...|....|xxx|....||...|....|...|....|......|xx|.......|.|xxx|..|..xxx|..||........|.......|....|...|...
..|....|...|....|....|...|....|...|....|....|...|....|....|...|....|...|....|....|...|....|....|...|....|
....|...|....|...|....|....|...|....|....|...|....|....|...|....|...|....|...|....|...|....|...|....|...|
....|...|....|...|...|....|...|....|...|....|...|....|...|....|...|....|...|...|....|...|....|...|....|..
.|....|...|....|...|....|...|...|....|...||...|...|....|...|....|...|....|...|....|...|....|...|...|....|
...|....|...|....|...|....|...|...|xxxx|....|...|x|......|...|....|...|....|...|....|...|....|...|....|..
.|...||...|...||...|...|....|...|....|...|....|...|....|...|....|...|...|....|...|....|...|....|........|
...|....|...|....|...|....|...|...|....|...|....|...|........||.......||.......|....|...|...|....|....|xx
xxxx|.....|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=== Bar was drawn from 0 to 1429088.0

Depois que o dd_rhelp acabar de trabalhar, ou se você decidir parar no meio e ver no que vai dar, você deve montar a imagem com o comando mount, como já ilustrei acima. Porém, antes de montar a imagem, cheque a consistência do sistema de arquivos para tentar corrigir eventuais falhas:

  # fsck -y ~/Desktop/dvd_da_festa.img

Se estiver recuperando dados de um HD danificado, você pode copiar a imagem resultante para um HD novo sem maiores problemas, usando o dd:

  dd if=~/Desktop/hd_danificado_do_cliente.img of=/dev/hdb1


Por Roberto Bechtlufft,
http://www.linuxparaoresgate.com/index.php

LINUX para o resgate - Powered by txt2tags