sexta-feira, 12 de setembro de 2008

Recuperando partições e corrigindo sistemas de arquivos

Quem nunca perdeu dados importantes por problemas ou descuidos relacionados ao particionamento do HD, nunca reinstalou o sistema por que um vírus apagou a tabela de partições do HD, ou por que o fsck não encontrava o superbloco da partição, que atire a primeira pedra :). Este tutorial ensina a recuperar partições deletadas e recuperar sistemas de arquivos corrompidos, usando as ferramentas disponíveis no Linux. Todo o processo pode ser feito a partir de um live-CD, como o Kurumin.Carlos E. Morimoto
02/02/2006


Fazendo backup e recuperando a MBR e tabela de partições

Ao comprar um novo HD, você precisa primeiro formatá-lo antes de poder instalar qualquer sistema operacional. Existem vários programas de particionamento, como o QTParted, GParted, CFDisk e outros.

Os programas de particionamento salvam o particionamento na tabela de partição, gravada no início do HD. Esta tabela contém informações sobre o início e final de cada partição. Depois do particionamento, vem a formatação de cada partição, onde você pode escolher o sistema de arquivos que será usado em cada uma (ReiserFS, EXT3, FAT, etc.).

Ao instalar o sistema operacional, é gravado mais um componente: o gerenciador de boot, responsável por carregar o sistema durante o boot.

Tanto o gerenciador de boot quanto a tabela de particionamento do HD são salvos no primeiro setor do HD, a famosa trilha MBR, que contém apenas 512 bytes. Destes, 446 bytes são reservados para o setor de boot, enquanto os outros 66 bytes guardam a tabela de partição.

Ao trocar de sistema operacional, você geralmente subscreve a MBR com um novo gerenciador de boot, mas a tabela de particionamento só é modificada ao criar ou deletar partições. Caso por qualquer motivo, os 66 bytes da tabela de particionamento sejam subscritos ou danificados, você perde acesso a todas as partições do HD. O HD fica parecendo vazio, como se tivesse sido completamente apagado.

Para evitar isso, você pode fazer um backup da trilha MBR do HD. Assim, você pode recuperar tudo caso ocorra qualquer eventualidade. Para fazer o backup, use o comando:

# dd if=/dev/hda of=backup.mbr bs=512 count=1

O comando vai fazer uma cópia dos primeiros 512 bytes do "/dev/hda" no arquivo "backup.mbr". Se o seu HD estivesse instalado na IDE secundária (como master), ele seria visto pelo sistema como "/dev/hdc". Basta indicar a localização correta no comando.

Você pode salvar o arquivo num disquete ou pendrive, mandar para a sua conta do GMail, etc. Caso no futuro, depois da enésima reinstalação do Windows XP, vírus, falha de hardware ou de um comando errado a tabela de particionamento for pro espaço, você pode dar boot com o CD do Kurumin e regravar o backup com o comando:

# dd if=backup.mbr of=/dev/hda

Lembre-se de que o backup vai armazenar a tabela de particionamento atual. Sempre que você reparticionar o HD, não se esqueça de atualizar o backup.

Usando o Gpart

Caso o pior aconteça, a tabela de particionamento seja perdida e você não tenha backup, ainda existe uma esperança. O Gpart é capaz de recuperar a tabela de partição e salvá-la de volta no HD na maioria dos casos. Você pode executá-lo dando boot pelo CD do Kurumin, ou baixá-lo no: http://www.stud.uni-hannover.de/user/76201/gpart/#download.

Baixe o "gpart.linux" que é o programa já compilado. Basta marcar a permissão de execução para ele:

# chmod +x gpart.linux

Nas distribuições derivadas do Debian, você pode instalá-lo pelo apt-get:

# apt-get install gpart

Execute o programa indicando o HD que deve ser analisado:

# ./gpart.linux /dev/hda


(ou simplesmente "gpart /dev/hda" se você tiver instalado pelo apt-get)

O teste demora um pouco, pois ele precisará ler o HD inteiro para determinar onde começa e termina cada partição. No final, ele exibe um relatório com o que encontrou:

Primary partition(1)
type: 007(0x07)(OS/2 HPFS, NTFS, QNX or Advanced UNIX)
size: 3145mb #s(6442000) s(63-6442062)
chs: (0/1/1)-(1023/15/63)d (0/1/1)-(6390/14/61)r

Primary partition(2)
type: 131(0x83)(Linux ext2 filesystem)
size: 478mb #s(979964) s(16739730-17719693)
chs: (1023/15/63)-(1023/15/63)d (16606/14/1)-(17579/0/62)r

Primary partition(3)
type: 130(0x82)(Linux swap or Solaris/x86)
size: 478mb #s(979896) s(17719758-18699653)
chs: (1023/15/63)-(1023/15/63)d (17579/2/1)-(18551/3/57)r

Se as informações estiverem corretas você pode salvar a tabela no HD usando o parâmetro "-W":

# gpart -W /dev/hda /dev/hda

Veja que é preciso indicar o HD duas vezes. Na primeira você indica o HD que será vasculhado e em seguida em qual HD o resultado será salvo. Em caso especiais, onde você tenha dois HDs iguais, por exemplo, você pode gravar num segundo HD, com em: "gpart -W /dev/hda /dev/hdc"

O gpart não é muito eficiente em localizar partições extendidas (hda5, hda6, etc.). Em boa parte dos casos ele só vai conseguir identificar as partições primárias (hda1, hda2, hda3 e hda4). Nestes casos, você pode usar o cfdisk ou outro programa de particionamento para criar manualmente as demais partições (apenas crie as partições e salve, não formate!). Se você souber indicar os tamanhos aproximados, principalmente onde cada uma começa, você conseguirá acessar os dados depois.

Usando o Testdisk

Outra ferramenta "sem preço" para recuperação de partições é o Testdisk. Embora a função seja a mesma, ele utiliza um algoritmo bastante diferente para detectar partições, o que faz com que ele funcione em algumas situações em que o Gpart não detecta as partições corretamente e vice-versa. Por isso vale a pena ter ambos na caixa de ferramentas.

Lembre-se que ambos são capazes de recuperar partições apenas enquanto as informações não são subscritas. Se você acabou de apagar a sua partição de trabalho, é bem provável que consiga recuperá-la, mas se o HD já tiver sido reparticionado e formatado depois do acidente, as coisas ficam muito mais complicadas. Sempre que um acidente acontecer, pare tudo e volte a usar o HD só depois de recuperar os dados.

O Testdisk permite recuperar desde partições isoladas (incluindo as extendidas), até toda a tabela de partição, caso o HD tenha sido zerado. Ele suporta todos os principais sistemas de arquivos, incluindo FAT16, FAT32, NTFS, EXT2, EXT3, ReiserFS, XFS, LVM e Linux Raid.

A página oficial é a http://www.cgsecurity.org/testdisk.html onde, além da versão Linux, você encontra versões para Windows, DOS e até para o Solaris.

Embora não seja exatamente um utilitário famoso, o Testdisk é incluído em muitas distribuições. Nos derivados do Debian, você pode instalá-lo via apt-get:

# apt-get install testdisk

Para instalar a versão em código fonte, além dos compiladores básicos (veja mais detalhes no capítulo 3), é necessário ter instalado o pacote "ncurses-dev" ou "libncurses-dev". A instalação propriamente dita é feita usando a receita tradicional: descompactar o arquivo, acessar a pasta criada e rodar os comandos "./configure", "make" e "make install".

Vamos a um exemplo prático de como recuperar duas partições deletadas "acidentalmente". Onde o cfdisk está mostrando "Free Space" existem na verdade as partições "/dev/hda2" e "/dev/hda3", que removi previamente:

index.inc_html_5b51d64e

Comece chamando o Testdisk como root:

# testdisk

Na tele inicial, selecione o HD que será analisado, acesse a opção "Analyse" e em seguida "Proceed", para iniciar a varredura do disco.

O Testdisk verifica a tabela de partições atual e em seguida pesquisa em todos os setores onde podem existir informações sobre outras partições que não constem na tabela principal.

Veja que, apenas com o teste rápido, ele já conseguiu localizar as duas partições que haviam sido deletadas:

index.inc_html_m17028385

Pressionando a tecla "P" você pode ver os dados dentro da partição, para ter certeza que os arquivos estão lá (a versão disponível no apt-get não consegue mostrar arquivos dentro de partições ReiserFS, mas a recuperação funciona normalmente).

Nos raros casos onde ele localize a partição, mas identifique incorretamente o sistema de arquivos, use a opção "T" para indicar o correto.

Depois de checar se o particionamento detectado está correto, pressione "Enter" mais uma vez e você chega à tela final, onde você pode salvar as alterações, usando a opção "Write". Reinicie o micro e monte a partição para checar os dados.

Caso a lista não exiba a partição que você está procurando, use a opção "Search" no lugar do Write. Isto ativa o teste mais longo, onde ele vasculha todos os setores do HD em busca de partições deletadas. Este segundo teste demora alguns minutos e, num HD com bastante uso, pode retornar uma longa lista de partições que foram criadas e deletadas durante a vida útil do HD. Neste caso, preste atenção para recuperar a partição correta.

index.inc_html_m2bbaa36c

Todas as partições listadas aqui parecem com o atributo "D", que significa que a partição foi deletada. Para recuperar uma partição, selecione-a usando as setas para cima/baixo e use a seta para a direita para mudar o atributo para "*" (se ele for uma partição primária e bootável, como o drive C: no Windows), "P" se ela for uma partição primária ou "L" se ela for uma partição lógica. Lembre-se de que. no Linux, as partições de 1 a 4 são primárias e de 5 em diante são extendidas.

É possível também adicionar uma partição manualmente, caso você saiba os setores de início e final, mas isso raramente é necessário.

index.inc_html_453accd1

Pressione "Enter" mais uma vez e ele mostra uma tela de confirmação, com a tabela de particionamento alterada que será salva no disco. Use o "Write" para salvar ou volte à tela inicial para começar novamente em caso de erros.

Tenha em mente que o tamanha da partição é reportado de acordo com o número de setores de 512 bytes. Uma partição de 5 GB tem pouco mais de 10 milhões de setores.

O ideal é que você faça todo o processo usando um live-CD. O Kurumin vem com o Testdisk pré-instalado a partir da versão 6.0 e ele pode ser encontrado também nas versões recentes do Knoppix, PLD e Ultimate Boot CD.

Depois de recuperar qualquer partição, é importante checá-la usando o utilitário apropriado, para que qualquer problema dentro da estrutura do sistema de arquivos seja corrigido.

Recuperando partições danificadas

Assim como no Windows, você nunca deve desligar o micro no botão ao rodar qualquer distribuição Linux.

Mas, acidentes acontecem. A energia elétrica acaba de vez em quando, alguns dos drivers de softmodems podem fazer o micro travar (estes drivers são proprietários, por isso não é possível corrigir bugs, como em outras partes do sistema; você depende unicamente da boa vontade do fabricante) e assim por diante.

Durante o boot, o sistema verifica as partições em busca de problemas, tentando resolver qualquer inconsistência no sistema de arquivos causado por um desligamento incorreto. Você pode perder alguns arquivos que ainda não tivessem sido salvos no HD, mas a idéia é que a verificação coloque todo o resto em ordem.

Para partições em ReiserFS é usado o reiserfsck, para partições em EXT2 ou EXT3 é usado (respectivamente) o fsck.ext2 ou o fsck.ext3 e para partições em XFS é usado o xfs_repair.

Mas, em alguns casos, o dano pode ser grande o suficiente para que não seja possível repará-lo automaticamente, fazendo com que o sistema simplesmente deixe de dar boot.

Não há motivo para pânico. Você pode dar boot pelo CD do Kurumin e usá-lo para reparar as partições danificadas.

Abra um terminal e vire root (su), lembre-se de que, ao rodar o Kurumin pelo CD, você pode definir a senha de root usando o comando "sudo passwd". A partição a ser reparada precisa estar desmontada. Vou usar como exemplo a partição /dev/hda1.

Se for uma partição EXT3, use o comando:

# fsck.ext3 /dev/hda1

Ele vai começar a apontar os erros e perguntar se cada um deve ser corrigido. Normalmente você pode ir apenas respondendo "y" para tudo, mas caso existam dados realmente importantes na partição é melhor prestar mais atenção. Arquivos danificados ou fragmentos de arquivos que puderam ser recuperados vão para a pasta "lost+found" no diretório raiz da partição.

Você pode também adicionar o parâmetro "-f", que força a verificação da partição, mesmo que o sistema de arquivos pareça não ter problemas:

# fsck.ext3 -f /dev/hda1

O fsck não é capaz de recuperar o sistema de arquivos em casos de problemas com o superbloco, o setor que contém informações essenciais, como o tipo, tamanho, status e informações sobre a estrutura do sistema de arquivos. Quando não encontra o superbloco, o fsck simplesmente falha miseravelmente, exibindo um "fatal error", sem maiores explicações.

É difícil estimar quantas reinstalações já foram feitas, e qual foi o efeito negativo sobre a reputação do sistema durante sua história por causa deste simples problema, que é felizmente fácil de resolver.

Sempre que a partição é criada, são criados vários superblocos alternativos, que servem justamente de backups para casos de problemas com o primeiro. Você pode ver a lista de endereços usando o comando "mkfs.ext3 -n partição", como em:

# mkfs.ext3 -n /dev/hda1

Ao usar o comando, nunca esqueça de incluir o "-n", caso contrário ao invés de mostrar as informações, ele vai formatar a partição. No final do relatório você encontra:

Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736

Alternativamente, você pode usar também o comando "dumpe2fs /dev/hda1 | grep -i superblock". O Testdisk (que vimos a pouco) também oferece uma opção para listar superblocos alternativos em partições EXT, que você acessa em "Advanced > Superblock".

Chame novamente o comando "fsck.ext3", adicionando a opção "-b", seguida do endereço do superbloco que será usado. Caso eventualmente o primeiro resulte em erro, experimente o segundo, e assim por diante:

# fsck.ext3 -f -b 32768 /dev/hda2

Para partições EXT2, use o comando "fsck.ext2", que suporta os mesmos parâmetros.


Numa partição ReiserFS, comece com o comando:

# reiserfsck --check /dev/hda1

Ele exibe um aviso:

Do you want to run this program?[N/Yes] (note need to type Yes if you do):

Ou seja, você precisa digitar "Yes" para continuar, caso apenas dê Enter ele aborta a operação.

Ele vai verificar toda a estrutura do sistema de arquivos e indicar os erros encontrados. O próximo passo é usar a opção "--fix-fixable":

# reiserfsck --fix-fixable /dev/hda1

Este segundo comando efetivamente corrige todos os erros simples, que possam ser corrigidos sem colocar em risco as demais estruturas do sistema de arquivos. Em 90% dos casos isto é suficiente.

Caso seja encontrado algum erro grave, ele vai abortar a operação. Estes erros mais graves podem ser corrigidos com o comando:

# reiserfsck --rebuild-tree /dev/hda1

Este comando vai reconstruir do zero todas as estruturas do sistema de arquivos, vasculhando todos os arquivos armazenados. Esta operação pode demorar bastante, de acordo com o tamanho e quantidade de arquivos na partição. Nunca interrompa a reconstrução, caso contrário você não vai conseguir acessar nada dentro da partição até que recomece e realmente termine a operação.

O "--rebuild-tree" vai realmente corrigir qualquer tipo de erro no sistema de arquivos. Ele só não vai resolver o problema caso realmente existe algum problema físico, como, por exemplo, um grande número de setores defeituosos no HD.


Finalmente, caso você esteja usando uma partição formatada em XFS, comece com o:

# xfs_check /dev/hda1

Ele vai indicar os problemas encontrados. Para realmente corrigi-los, rode o:

# xfs_repair /dev/hda1

Assim como no caso do reiserfsck, todo o processo é automático. Ao contrário do EXT2, tanto o ReiserFS quanto o XFS são sistemas de arquivos muito complexos, por isso qualquer intervenção manual só aumentaria a possibilidade de destruir tudo.

Mas, ambos incluem algumas opções avançadas, que podem ser especificadas no comando. Você pode dar uma olhada dentro dos manuais: "man reiserfsck" ou "man xfs_repair".


Fonte

Nenhum comentário: