terça-feira, 30 de dezembro de 2008

Como recuperar partição Reiserfs com bad blocks?

Este é um assunto interessante: às vezes, tudo está bem com seu sistema... está tudo configurado, rodando, indo às mil maravilhas!! Porém, ninguém escapa do infortúnio de um defeito físico no disco rígido, não é mesmo?? E ele é como aquelas visitas mensais de sua namorada ou esposa: vem sempre no pior e mais inesperado momento, sem aviso, e te pega num golpe baixo, onde você terá de ser hábil para não por tudo a perder...
Daí você se lembra das recomendações do Pajé descritas neste artigo, e fica tranquilo, pois ainda há luz no fim do túnel!!

  • Do que Trata Este Artigo?

Apesar de ser destinado àqueles que utilizam partições com sistema de arquivos ReiserFS, as recomendações aqui descritas podem ser parcialmente aplicadas a problemas com outras partições.

  • Quais os Sintomas, Doutor?

O computador está trabalhando bem mas, de repente, você obtém uma mensagem de algum aplicativo dizendo que houve erro de entrada e saída (I/O, o famoso Input/output error). Isto pode acontecer a qualquer momento: durante o uso ou mesmo durante a inicialização do sistema.

  • O Que Fazer Agora?

A primeira dica é a mais importante de todas:
  1. Se você está trabalhando, interrompa tudo o que você está fazendo e salve todos os seus trabalhos, desligando o micro em seguida. Se estava apenas utilizando o micro, desligue-o imediatamente. Isto é o mais importante porque evita que você perca seus dados. Erros de Input/output podem provocar que programas inteiros travem e/ou fechem, e você não gostará de se encontrar trabalhando quando, inadivertidamente, tudo travar durante alguns minutos e fechar repentinamente.
  2. Pegue um CD de resgate de sua distribuição. Pode ser um CD do Kurumin, do Ubuntu, do SuSE ou de qualquer outra distribuição que tenha as ferramentas de seu sistema de arquivos (no nosso caso, o ReiserFS), e que seja capaz de iniciar pelo CD, ao menos em modo texto. Acredite se quiser, existem distribuições de Linux especializadas nisto, pequenas o suficiente para iniciar facilmente pelo CD e contendo, todavia, milhares de ferramentas de recuperação. Acredito ser interessante citar o SystemRescueCD.
  3. Se você conseguir, monte a sua partição como somente leitura e faça backup de todos os seus dados pessoais e arquivos de configuração. Só isto já é um alívio! Pode ser para CD, DVD, Pen Drive, Fita, outra partição (se no mesmo disco, desaconselhável...), o que for... mas faça o backup. Não esqueça as tabelas do MySQL, aqueles arquivos que você cisma em colocar no /tmp, apesar de não ser recomendado, e os favoritos do Firefox.

  • Copiando a Partição com o dd
Se a coisa ficou realmente feia e você sente aquele frio na espinha, lembre-se de que você pode criar uma imagem de sua partição, lendo o que for possível, e tentar recuperar depois com as ferramentas do Reiser. Use esta técnica se você notar que a partição defeituosa não monta, mesmo que somente leitura, ou monta mas não lê devido a milhares de erros de leitura. Siga estes passos:
  1. Crie, em outro disco, preferencialmente, outra partição com o mesmo tamanho da partição defeituosa;
  2. Copie bit a bit a partição defeituosa para a recém-criada, com o comando dd abaixo:
# dd if=/dev/hda1 of=/dev/hdb1 bs=4k conv=noerror,sync

Explicando o comando:
if-> partição defeituosa, usada como entrada de dados. No nosso caso, o /dev/hda1 (não é /mnt/hda1!!!!);
of -> partição de destino, preferencialmente em outro HD, já que o primeiro não tem mais a nossa confiança...
bs -> é o tamanho do bloco de leitura do dd ("block size"). Lembre-se de que, quanto menor o tamanho, maior a precisão da leitura, permitindo recuperar mais dados. No entanto, quanto menor o tamanho, mais chances de se esbarrar e setores ruins e mais lenta será a recuperação (experimente bs=1024 e veja que lerdeza não será este procedimento...). Acredito que você deva começar com um tamanho otimista, pequeno, como o sugerido e, se a leitura se tornar insuportavelmente lenta, aumente o tamanho. Você poderá perder mais informações, mas vai pular muito mais setores ruins, fazendo a cópia bem mais rápido. Dica: não seja tão radical aqui. Você vai perder alguma coisa, mas o importante é recuperar a maioria dos dados.
conv -> Estas opções acima foçam que, havendo erro de leitura, o bloco será pulado e, em seu lugar, na partição de destino, será gravado um bloco com bytes zerados. Esta é uma maneira de remediar o irremediável: pula-se o que não será lido mesmo e ganha-se tempo.

Se seus dados são realmente muito importantes e você tem que garantir a cópia fiel do máximo possível deles, custe o que custar, então utilize este comando:

# dd_rescue /dev/hda1 /dev/hdb1

O comando dd_rescue acima é mais eficiente que o dd, nesta conjuntura. Ele lê blocos maiores, de 64kB, porém apenas quando a leitura funciona. Se houver erro de leitura, o bloco gigantesco de 64kB é quebrado em frações mínimas de 512 bytes, onde será lido e gravado o que for possível. Assim, você terá um desempenho maior para setores sem defeitos (64kB vai, a passos largos, mais rápido que 4kB) e, todavia, garante que, nos lugares problemáticos da superfície de seu disco, a leitura tentará ser tão detalhada quanto possível, ainda que tome muito tempo. Uma alternativa mista, ainda, é o dd_rhelp, que roda o dd_rescue várias vezes, procurando balancear entre a perda de tempo e a eficiência de recuperação de dados.

Verifique mais informações:
na página do dd_rescue:
http://www.garloff.de/kurt/linux/ddrescue/
na página do dd_rhelp:
http://www.kalysto.org/utilities/dd_rhelp/index.en.html

  • Recuperando a Partição
E agora, o que temos?? Bom, temos uma imagem da partição defeituosa, feita com alguns problemas durante a cópia, porém escrita sobre um disco de superfície perfeita, intacta, funcional e límpida como a aurora orvalhada da primavera... basta, então, tentar recuperar o possível.

  1. Com a partição desmontada, rode o tradicional: reiserfsck --check /dev/hda1.
  2. Provavelmente não funcionará, mas não se desespere... agora você não tem setores ruins, apenas seus dados não foram bem gravados. Então, vamos pedir ao sistema que reconstrua a sua árvore com a estrutura de seus dados, para poder montar e usar sua partição:
reiserfsck --rebuild-tree /dev/hda1

Como não há setores ruins, as chances de a reconstrução da árvore parar no meio são pequenas. Terminado com sucesso este comando, possivelmente sua nova partição estará saudável e poderá, pelo menos, ser lida para a recuperação dos seus preciosos dados, antes perdidos dentro dela...
Atenção: o rebuild-tree pode demorar para terminar. Nunca o interrompa, a fim de evitar danos à sua partição. Se ele parar com erro, rode-o de novo imediatamente.

(*) Lembre-se de substituir "/dev/hda1" pela partição correspondente!!

  • Casos Omissos

Se desejar ou necessitar recuperar a partição original, a qualquer custo, sem a chance de fazer a cópia descrita acima, então é preciso se gerar uma lista com todos os setores ruins (um arquivo com o número de cada setor ruim, um por linha) e rodar o comando:

reiserfsck --rebuild-tree --badblocks ./file /dev/hda1

Onde ./file é o arquivo com os setores ruins. Este arquivo pode ser gerado automaticamente (vide instruções na referência "dica", abaixo, e no item seguinte) ou manualmente, tentado rodar e repetir o comando a cada novo setor ruim encontrado e acrescentando o novo setor ruim no arquivo (só faça isto em último caso, a não ser que você queira levar semanas nesta operação!!). Se for preciso mesmo, tente gerar este arquivo automaticamente (vide item abaixo). Como esta técnica foge ao escopo deste artigo, incluí uma referência (abaixo) com todas as instruções para a sua realização, a fim de não deixar nenhum caro leitor na mão...

Dicas: tudo sobre como lidar com bad blocks e recuperação de sistemas de arquivos ReiserFS, clique aqui.

  • Outros Comandos
badblocks -o badbk.txt -v /dev/hda1: Verifica blocos ruins em uma partição e os grava no arquivo "badbk.txt". Útil no caso citado anteriormente. A opção "-v" permite ligar o modo verbose, que mostra alguma coisa na tela sobre o progresso da operação, ao invés do cursor piscando monotonamente. O arquivo gerado pode servir de input para várias ferramentas de recuperação de partições. No caso do Reiser, poderá servir para o comando do item anterior (reiserfsck).
Importante: o comando badblocks utiliza, por padrão, o tamanho de bloco de 1024 bytes. Contudo, a maioria das partições contróem blocos, por padrão, de 4096 bytes (4kB), e este é o padrão das partições Reiser. Se você coletar os dados com o tamanho errado, sua ferramenta de recuperação vai recusar o arquivo de blocos ruins gerado. Uma maneira de contornar este problema é informar ao comando badblocks o tamanho esperado de bloco de sua partição defeituosa, com o parâmetro "-b", da seguinte maneira:

badblocks -o badblocks.txt -vs -b 4096 /dev/hda1



Espero ter ajudado!! Gostou?? Detestou?? Ajudou?? Só te atrapalhou?? COMENTE!!

22 comentários:

night64 disse...

Espero sinceramente não precisar disso nunca!

alfagnish disse...

Já fiz isso tudo e mais um pouco, o meu HD foi pro espaço uma vez, perdi 33GB de dados praticamente...

E fiz tudo isso ai ;)

Pena que o problema tava punk mesmo...

waGNUx disse...

O professor Morimoto no GDH postou uma informação semelhante a essa, porém mais informação nunca é demais. ;-)

O Pajé disse...

Beleza, pessoal!!

Alfagnish, vc está certo: setores ruins, em se tratando de problema físico no HD, podem chegar a um ponto em que nenhuma ferramenta mais é capaz de recuperar... uma lástima, mas isto acontece... por isso backup é sempre a ordem do dia (ou da semana, ou até do mês, dependendo do uso e importância), para evitar perder grandes quantidades de dados.
Mas, acreditem, com os procedimentos que descrevi, já cheguei a recuperar partições de 40GB que foram dadas como perdidas. Claro, após dezenas de horas de insistência...

alfagnish disse...

Bem a importância era pessoal, pois isso foi do meu PC, e dos 200 GB perder 33GB foi muito para alguns porém relativamente pouco pra mim ;)
Só não quero passar por isso denovo....
[]'s
t+

O Pajé disse...

Uma boa dica, praticada por alguns, é instalar o SVN na sua máquina e fazer controle de versão do diretório /home/usuario (ou seja, dos dados pessoais). Esta é uma opção interessante, porque permite mapear em outra partição e programar um backup automatizado. Não deixa de ser uma alternativa. Mas, se o HD quiser ir pro brejo mesmo, não tem santo q te salve. Dessa nem o Jay e o Silent Bob escapam...

Robert disse...

Ai ai, como é bom a persistência.. sempre soube disso e comprovei mais uma vez hoje (10/01/09).. Deu um crash aqui na minha partição Ubuntu 8.10 que tem esse filesystem ReiserFS e nem esse comando reiserfsck resolvia meu problema (sinal que o reiserfsck ainda ñ foi desenvolvido perfeitamente, há falhas)..

Enfim, bootei um LiveCD do Ubuntu e cheguei até este site.. fiz todos os procedimentos descritos, dei reiserfsck p/ cá, reiserfsck p/ lá, criei o arquivo com os setores zuados, rodei o reiserfsck --rebuild-tree -B [file] [dev..] pra pegar esse arquivo e consertar minha H.D., mas sempre travava o comando no meio dele... tentei tb reiserfsck --fix-fixable.... e nada... tava realmente um caso sério... porém como sou brasileiro e ñ desisto nunca rs.. fui pesquisar no google e fucei em td quanto é tipo de site, italiano, russo, frances e até (pasmém) polonês.. óbviamente que nesses sites eu ñ entendia muita coisa, mas queria ver o próximo comando utilizado depois do último q eu tentava.. e dava p/ ver que os tópicos se encerravam sem nenhum outro comando ou sem nenhuma outra solução.. MAS não, ainda havia uma solução hehe.. eu tenho um utilitário aqui chamado Hiren's Boot CD que tem varios programas de td qto é tipo e é bootavel.. rodei ele, usei o bendito HDD Regenerator, deixei ele rodando por aproximadamente umas 7 hs (ESSE PROGRAMA É FENOMENAL, CORRIGE BADBLOCKS DE QUALQUER FILESYSTEM) e após isso, entrei no meu LiveCD do Ubuntu rodei o reiserfsck e RODOU IGUAL UMA BELEZA.. arrumei minha partição. Obrigado ao criador do HDD Regenerator, Dmitriy Primochenko, ao qual já mandei um e-mail de agradecimento no seu website rs, vc salvou minha vida hehe..

Detalhe: essa minha H.D. já a uso há oito anos (putz rs) e hj mesmo irei rodar o dd nela pra outro H.D. antes que outro crash ocorra rs..

flw galera, sempre persistam, caso achem que a sua partição já era, pelo fato de nem o "super comando" reiserfsck funfar, já era nada, vão numa lan house, na casa do colega, baixem esse Hiren's Boot CD que vem com dezenas de programas bons e usem o HDD Regenerator.. ou então usem outro programa bom de correção de badblocks, enfim... ele corrigirá todos os badblocks independente do filesystem e aí sim vc poderá entrar com o liveCD e rodar o reiserfsck.. nossa, estou muito feliz haha.. mas uma vez, obrigado Dmitiry Primockenko e tb ao Pajé que me deu várias dicas boas neste site.. flw

O Pajé disse...

Obrigadíssimo, Robert, pelo excelente comentário e pela ótima dica!! Realmente, eu não conhecia o Hiren's BootCD, mas já o encontrei na net e vejo que é de fato fantástico!! Para aqueles interessados, aqui vai o link:
http://www.hiren.info/pages/bootcd, e pode fazer o download aqui.

Outra dica é: se o comando badblocks não conseguir gerar o arquivo com todos os setores ruins e, na hora de rodar o reiserfsck --rebuild-tree, ele parar no meio (sim, ainda há muito a ser melhorado no reiserfsck!!! Você tem razão: a ferramenta é boa mas ainda tem muito a trilhar), lembre-se de que o reiserfsck dá a dica do setor ruim onde ele parou na mensagem de erro, e vc pode acrescentar este setor no arquivo de setores ruins. Assim, em ultimíssimo caso, você pode ir reiniciando o reiserfsck a cada vez que descobrir um setor ruim novo. Se o disco tiver muito ferrado e vc pegar dois ou três setores ruins novos de numeração seguida, aconselho acrescentar no arquivo logo uns 10 na seqüência, para andar mais rápido. Essa é a pior solução, mas serve em último caso. Se vc gosta de programar, dá pra fazer um programinha que captura a mensagem de erro, lê, atualiza o arquivo e reinicia o reiserfsck. Assim, ele fica rodando direto e um dia acaba funcionando...

Valeu pela grande dica, Robert!!

Robert disse...

Por nada Pajé. Sempre que puder, estarei entrando no seu blog acompanhando as suas dicas, que por sinal, tem várias dicas boas, rs. Bem, além do HDD Regenerator que pode estar sendo usado em último caso, quando sua HD já estiver bem afetada, encontrei na net o programa Nucleus ReiserFS Linux Partition Recovery no site http://www.softpedia.com/get/System/Hard-Disk-Utils/Nucleus-ReiserFS-Linux-Partition-Recovery.shtml. Ainda não o verifiquei, mas parece ser muito bom.

Abraços

O Pajé disse...

Sim, sim, este é bem interessante, e é inclusive usado para recuperar arquivos ou diretórios apagados sem querer (em HDs saudáveis mesmo). O interessante é que ele roda em Windows, e não em linux, ehehehehe... útil para quem tem aquele famoso dual boot com Widows e, ao invés de iniciar pelo CD para ter a partição desmontada, reinicia pelo Windows. :-)

Taoista Sem Memoria (Capitão Caverna) disse...

Caramba, estou com os temidos bad blocks (nunca diga que isto nunca irá acontecer com você).
Gerei a lista dos badblocks com o comando badblocks. Ele achou 28 blocos entre os blocos 380 e 420.
Quando executo o reiserfsck --rebuild-tree, ele grita que o bloco x (por ex, 410) é da area de sistema do ReiserFS e que não pode ser realocada e pára.
:S

E agora???? Vou tentar a dica do Hiren's BootCD antes de comprar uma corda.

alfagnish disse...

rapaiz,

Faça um DD desse HD urgente!
Nem o ligue nesse meio tempo, só depois de fazer o backup dos dados para o HD novo/outro hd.

[]'s

Taoista Sem Memoria (Capitão Caverna) disse...

Ja descartei esta hipotese, o hd problematico é de 320 GB, com apenas 1 partição (de mesmo tamanho, óbvio)
:S

alfagnish disse...

uai...
pq descartou e o que descartou exatamente, o dd??
Cara eu se fosse vc começava a pensar no HD pois ele pode ir pro espaço em breve...

[]'s

Taoista Sem Memoria (Capitão Caverna) disse...

descartei a copia bit a bit pq nao tenho um HD de 320 pra copiar todo o atual.

Taoista Sem Memoria (Capitão Caverna) disse...

O HDD Regenerator recuperou o block (1 só q ele acusou com erro) e o --rebuild-tree fez o resto.
ja consigo montar a partição!!!!

Ufa. Valeu pajé pelo conteudo, salvou minha vida (eu até ja tinah encomendado a corda, rsrsrsr)

O Pajé disse...

Muito bom, amigo Taoista!!! É impressionante a quantidade de pessoas que têm me escrito dizendo que este artigo ajudou a salvar seus dados!! Não há nada mais compensador para quem se dá ao trabalho de pesquisar, testar, estudar e publicar num blog de tecnologia receber em troca coisas deste tipo!! Agradeço muito a todos!!

alfagnish disse...

Eu encontrei um programa que tenta recuperar até partições com bad blocks. O mesmo se chama test disk e possuim versões para vários sistemas operacionais!

O Pajé disse...

Beleza, rapaz!!

O Test Disk eu nem conhecia, e vejo que é free e roda em linux, como em diversas outras plataformas!! Muito interessante, obrigado pela dica!!

Para quem quer experimentar, aqui vai o link com todos os detalhes, funcionalidades do programa e o endereço de download:

http://www.cgsecurity.org/wiki/TestDisk

alfagnish disse...

Ah o Test Disk recupera dados de partições formatadas várias vezes, mesmo o HD tendo sido particionado em N partições :D

Paulo Vianna, the MusicGamer disse...

Olha, eu vou deixar a minha experiência aqui para outros que passam ou passaram sufoco.
Eu sempre confiei ReiserFS do que em qualquer outro sistema de arquivo Linux, mesmo depois do Hans Reiser ter matado a mulher dele e o Reiser ter sido descontinuado. Eu sempre fiz isso porque presto serviço para uma empresa que não quer investir em equipamentos, daí os hds corrompem os sistemas de por constantes piques de energia e quando isso acontece, sempre consegui restaurar as partições ReiserFS sem ter utilizar programas de restauração de arquivos como muitos fazem no Windows. MAS, no último dia de funcionamento desta empresa, deu um pique de energia que além de corromper o sistema de arquivos, deu badblock no HD, mesmo o pc estando com um nobreak de 400KVA novinho só pra ele. Então eu tentei de tudo com o reiserfsprogrs, rebuild three e o escambal, inclusive deixei fazendo uma imagem do sistema de arquivos do mesmo por 5 dias com o dd_rescue e nada! Estava desesperado porque eram quase 2 terabytes de arquivos de uma empresa. Revirei a internet inteira, até que encontrei um destes muitos programas pagos que existem por aí, http://www.ufsexplorer.com/order_rdr.php?ed=reiser. Paguei 21 euros nesta bagaça, baixei o programa específico para ReiserFS, coloquei minha licença e deixei 12 horas fazendo o scan no HD. A única coisa que posso dizer é que foi emocionante chegar de manhã no serviço e ver que estava tudo lá, maravilhosamente perfeito.

O Pajé disse...

Olá Paulo!!!

Nossa, seu depoimento é mesmo muito emocionante. Emocionante de um jeito que só quem tem experiência na indústria e que já sentiu a espinha congelar fria instantaneamente diante dos problemas mais esquizofrênicos pode entender.... quem tem essa experiência e já passou por isso várias vezes, entende o q vc fez. Eu não descarto os programas pagos, mas o pajeonline está voltado para soluções open source. Contudo, na hora do sufoco, vale qualquer coisa mesmo, e sei que você agiu bem. Parabéns!

Abraços do Pajé!