Linux verificar sectores danificados numa partição do disco rígido

Lidamos com computadores para vários fins no nosso dia a dia. Todas as nossas informações são guardadas em vários tipos de media, como Pens, cartões de memória, DVDs, discos rígidos e outros. Mas a maioria de nós hoje em dia ainda trabalha com discos rígidos mecânicos pois este tipo de hardware é normalmente barato e permite armazenar uma grande quantidade de informação. Todos nós colectamos informação que gostamos. Seja ela imagens, vídeos, email, contactos entre muitos outros tipos.


Os discos rígidos como qualquer outra media não duram para sempre, temos de alguma forma estar atentos a este facto se quisermos manter os nossos dados em condições. Os discos rígidos mais cedo ou mais tarde iram ficar com sectores danificados. As causas deste problema podem ser muitas, falhas de energia, pancadas, desgaste mecânico, entre outras.

A informação nos discos rígidos é organizada, com regras muito bem definidas. Ora vejamos a imagem:

Imagem da forma como é organizada a informação num disco rígido mecânico.

Sectores Danificados

Detectar sectores danificados o mais cedo possível é importante, para podermos evitar problemas de maior com perda de dados. Bem como evitar que os sectores danificados se alastrem no disco rígido caso tenhamos intenção de usar o disco mesmo com sectores danificados.

Os discos com sectores danificados podem ter uso desde que o sistema de ficheiros seja informado para não utilizar os tais sectores danificados. Claro que isto depende de todo da importância da informação. Em um servidor não é de todo aconselhado ter um disco com sectores danificados.  Mas se for um disco que temos para guardar uns filmes ou para testar sistemas operativos Linux de preferência, é capaz de trabalhar ainda por mais alguns bons anos sem dar qualquer problema. Eu não estou apenas a falar de aqueles discos antigos que temos para lá num canto. Pode ser um disco com três anos que já perdeu a garantia e por um corte de energia gerou um ou mais sectores danificados.

O Linux tem todos os utilitários que nos permite detectar sectores danificados, bem como para informar o sistema de ficheiros que não os pode usar para guardar informação. Claro que o sistema de ficheiros tem que suportar, como é o caso do sistema ext4 que utilizo.

Atenção, eu não me responsabilizo pela má utilização destes comandos, use-os por sua conta e risco!

 

Ora vamos lá!

Para podermos fazer este tipo de tarefa as partições têm de estar devidamente desmontadas! Estes comandos têm de ser lançados por o utilizador root!

Para sabermos qual o disco rígido e a partição que queremos trabalhar podemos fazer:

# fdisk -l
Disco /dev/sda: 500.1 GB, 500107862016 bytes
255 cabeças, 63 setores/trilhas, 60801 cilindros, total de 976773168 setores
Unidades = setores de 1 * 512 = 512 bytes
Tamanho do setor (lógico/físico): 512 bytes / 512 bytes
Tamanho da E/S (mínimo/ideal): 512 bytes / 512 bytes
Identificador do disco: 0x0006773d

Dispositivo Boot      Início        Fim      Blocos   Id  Sistema
/dev/sda1            2048   282378239   141188096   83  Linux
/dev/sda2   *   282378240   282583039      102400    7  HPFS/NTFS/exFAT
/dev/sda3       282583040   405258239    61337600    7  HPFS/NTFS/exFAT
/dev/sda4       405260286   976773119   285756417    5  Estendida
/dev/sda5       405260288   410380287     2560000   82  Linux swap / Solaris
/dev/sda6       410382336   641470226   115543945+  83  Linux
/dev/sda7       641472512   976773119   167650304   83  Linux

Disco /dev/sdb: 60.0 GB, 60022480896 bytes
255 cabeças, 63 setores/trilhas, 7297 cilindros, total de 117231408 setores
Unidades = setores de 1 * 512 = 512 bytes
Tamanho do setor (lógico/físico): 512 bytes / 512 bytes
Tamanho da E/S (mínimo/ideal): 512 bytes / 512 bytes
Identificador do disco: 0x000b2234

Dispositivo Boot      Início        Fim      Blocos   Id  Sistema
/dev/sdb1            2048   117229567    58613760   83  Linux

O badblocks é um utilitário muito usado neste tipo de tarefa. A função dele é percorrer toda a partição e relatar os blocos de informação que encontrou com defeito.

Escolhemos a partição que queremos testar com o badblocks, no meu caso vou usar a partição /dev/sdb1. Pois sei que este disco e no final desta partição existe sectores danificados.

Para que o badblocks trabalhe com o tamanho correcto do bloco temos de analisar o tamanho do bloco que está a ser usado no sistema de ficheiros desta partição. Para isso usamos:

# dumpe2fs /dev/sdb1 | grep 'Block size'
dumpe2fs 1.42 (29-Nov-2011)
Block size:               4096

Caso queiramos só saber se a partição tem blocos danificados podemos executar este comando:

# badblocks -v -b 4096 /dev/sdb1
Verificando blocos 0 até 58613759
Verificando por blocos defeituosos (teste em modo de leitura):
57352148
done, 33:14 elapsed. (0/0/0 errors)
57352149
done, 33:35 elapsed. (1/0/0 errors)
57352150
done, 33:59 elapsed. (2/0/0 errors)
57352151
done, 34:22 elapsed. (3/0/0 errors)
57352912
done, 35:06 elapsed. (4/0/0 errors)
57352913
done, 35:30 elapsed. (5/0/0 errors)
...

O comando com estes parâmetros vai fazer um teste à partição escolhida por nós e escrever o resultado no terminal.

Caso queiramos então usar o disco mesmo com sectores danificados teremos de guardar os números dos blocos defeituosos num ficheiro, que utilizaremos mais tarde para verificar o sistema de ficheiros e informar o sistema de ficheiros quais os blocos que estão danificados. Também podemos utilizar o mesmo ficheiro mais tarde, quando por alguma razão queiramos formatar novamente esta partição. Assim evitasse perder muito tempo a verificar quais os blocos defeituosos pois já os temos em ficheiro. Usamos:

badblocks -v -b 4096 /dev/sdb1 > badblocks.txt

No ficheiro badblocks.txt temos então uma lista de blocos danificados que foram encontrados não partição. Para ver o seu conteúdo usamos:

# cat badblocks.txt
14338037
14338228
14338274
14338466
...
14602175
14602282
14602520
14602711

Para verificarmos a integridade da partição e informar o sistema de ficheiros da lista de blocos danificados corremos o comando e2fsck com os seguintes parâmetros:

# e2fsck -l badblocks.txt /dev/sdb1
e2fsck 1.42 (29-Nov-2011)
/dev/sdb1: Updating bad block inode.
Passo 1: Verificando inodes, blocos, e os tamanhos.
Passo 2: Verificando estrutura directory
Passo 3: Checando conectividade com o directory
Passo 4: Checando contagens de referência
Passo 5: Procurando informações de resumo group

/dev/sdb1: ***** O SISTEMA DE ARQUIVOS FOI MODIFICADO *****
/dev/sdb1: 11/3670016 files (0.0% non-contiguous), 277235/14653440 blocks

Como podemos ver pela linha “/dev/sdb1: Updating bad block inode” que o sistema tomou conhecimento dos blocos danificados.

Mais tarde se por alguma razão necessitarmos de reformatar esta partição podemos utilizar o mesmo ficheiro para informar os blocos danificados na altura da formatação, desta forma:

mkfs.ext4 -l badblocks.txt /dev/sdb1
mke2fs 1.42 (29-Nov-2011)
Rótulo do sistema de arquivos=
OS type: Linux
Tamanho do bloco=4096 (log=2)
Tamanho do fragmento=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
3670016 inodes, 14653440 blocks
732672 blocks (5.00%) reserved for the super user
Primeiro bloco de dados=0
Máximo de blocos de sistema de arquivos=4294967296
448 grupos de blocos
32768 blocos por grupo, 32768 fragmentos por grupo
8192 inodes por grupo
Cópias de segurança de superblocos gravadas em blocos: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000, 7962624, 11239424

Allocating group tables: pronto                            
Gravando tabelas inode: pronto                            
Creating journal (32768 blocks): concluído
Escrevendo superblocos e informações de contabilidade de sistema de arquivos: concluído

O disco que utilizei para testar estes procedimentos é um disco Seagate Barracuda ATA, com cerca de treze anos, este disco tem 863 blocos danificados no final do disco. Costumo utilizar este disco para testes.

Não se esqueçam de comentar!

Artigos Relacionados:

Deixe uma resposta