O que são e como identificar badblocks no Linux?

Uma unidade de disco pode apresentar uma série de problemas ao longo da sua vida útil. Uma das falhas com maior impacto é o badblock. Resultado de problemas causados por danos físicos, os badblocks podem levar a perda de dados ou mesmo à remoção completa de arquivos do sistema.

O que são e como identificar badblocks no Linux?

Diante disso, saber identificar os sintomas de que um HD está com esse problema auxiliará o administrador de sistemas a tomar medidas para reduzir seu impacto. Se você quer saber como isso pode ser feito, veja no nosso post de hoje tudo sobre os badblocks no Linux!

O que são badblocks?

Um badblock é um bloco de memória de um drive HDD ou memória flash que, em função de um dano físico, não pode ser lido ou gravado. Em geral, esse tipo de problema surge após um curto-circuito, quedas, falhas nos transistores do chip flash ou problemas na rede elétrica. A longo prazo, badblocks podem causar problemas como a perda de arquivos ou até mesmo a inutilização completa da unidade de memória.

APRENDA A DOMINAR O LINUX

Aprenda a dominar o LINUX de uma vez por todos, pegue sua cópia

  • Ferramentas para instalar softwares adicionais
  • Shell do LINUX passo a passo, e muito mais...

Quais são os sintomas?

Os badblocks podem apresentar vários sintomas. Um deles, por exemplo, é o led de atividade do disco ligado constantemente. Já o desempenho do sistema pode cair consideravelmente durante operações de leitura e escrita. Além disso, mensagens de erros ao salvar e abrir arquivos também são indícios de problemas, assim como mensagens no syslog.

Como verificar badblocks no Linux?

Hoje, graças à tecnologia S.M.A.R.T., que está presente em vários discos, o sistema já faz um monitoramento pró-ativo para encontrar possíveis problemas. Em muitos casos, quando o S.M.A.R.T. detecta algo grave, uma mensagem de erro é emitida durante a inicialização.

Nos discos modernos, a firmware já vem programada para monitorar as operações de escrita em busca de possíveis badblocks. Caso algum setor defeituoso seja encontrado, ele é mapeado e inserido em uma “lista negra” com todos os blocos que não devem ser lidos. Mas, se o problema ocorrer com muita frequência, as chances de a falha impedir o uso do computador crescerão rapidamente.

Em caso de suspeitas, uma série de medidas podem ser tomadas para rastrear os badblocks no Linux e impedir que o disco rígido (ou SSD) tente gravar algum dado nessa área. Nesse sentido, podemos destacar como as principais:

Programas

Um dos programas mais indicados para verificar blocos com problemas no Linux é o badblocks. Ele deve ser utilizado, preferencialmente, em um Live CD e com o root ativo. Assim, é possível garantir que todos os setores da unidade de disco serão analisados. O badblocks é acessível pela linha de comando. Ele pode ser escrito com os seguintes parâmetros:

Leia também ...   Primeiro comando para executar após a instalação do Ubuntu

badblocks [ -svwnf ] [ -b block-size ] [ -c blocks_at_once ] [ -e max_bad_blocks ] [ -d read_delay_factor ] [ -i input_file ] [ -o output_file ] [ -p num_passes ] [ -t test_pattern ] device [ last-block ] [ first-block ]

Tenha em mente que, caso o resultado da análise do badblocks seja compartilhado com programas como o 2fsck ou mke2fs, o responsável pela operação deve especificar o tamanho de cada bloco com precisão. Isso ocorre pois o número de blocos criados ao particionar o disco está diretamente ligado ao tamanho padrão de cada bloco utilizado pelo sistema de arquivos. Diante disso, é recomendado utilizar o badblocks indiretamente por meio da opção -c do e2fsck e do mke2fs.

Os parâmetros do badblocks são os seguintes:

-b — Especifica o tamanho de cada bloco.

-c  — É o número de blocos que será testado a cada execução do programa.

-e — Especifica a quantidade máxima de badblocks que serão lidos antes que o teste seja abordado.

-d — Caso esse parâmetro seja passado com um valor diferente de zero, os badblocks vão “dormir” entre cada operação de leitura se nenhum tipo de erro aparecer durante a leitura de dados. Em outras palavras, um valor de 100 indicará que a operação de leitura será interrompida pelo mesmo tempo da operação de leitura anteriormente executada. Já um valor de 200 indica o dobro de tempo.

-f — Em geral, o badblocks não executa operações de leitura e escrita em partições que estão montadas, uma vez que isso pode causar uma falha grave no sistema operacional ou mesmo danificar o sistema de arquivos. Por meio desse parâmetro, esse padrão de segurança pode ser ignorado. Diante do dano em potencial causado pelo seu mau uso, ele só é indicado caso o arquivo /etc/mtab esteja corrompido e a unidade de armazenamento não esteja, de fato, montada.

-i — Indica um arquivo com badblocks identificados anteriormente para o programa. Eles serão ignorados durante a operação e não estarão listados no arquivo de saída. Esse parâmetro pode ser utilizado em conjunto com o parâmetro -b do dumpe2fs, que lista os badblocks já catalogados pelo sistema de arquivos.

-n — Utiliza o modo não destrutivo de leitura/escrita. Essa opção não deve ser utilizada com o parâmetro -w (leitura/escrita), uma vez que ambos são excludentes.

-o — Cria um arquivo com a lista de badblocks identificados pelo programa.

-p — Repete a operação até que todos os blocos tenham sido estreados.

-s — Exibe uma barra de status com o progresso da operação.

-t — Indica um padrão de leitura e escrita. Ele pode ser um valor numérico, como o número 0, ou mesmo a palavra “random”, que especifica que o padrão deve ser escolhido aleatoriamente. Para os padrões -w e -n, dois modos devem ser indicados. Já no modo somente leitura, apenas um.

Leia também ...   TOP 5 - Perguntas respondidas sobre UBUNTU LINUX (#4 é uma das perguntas que mais recebo)

Vale destacar que o modo de leitura não pode ser randômico. Ele considera que um padrão anterior já tenha sido gravado no disco. Caso múltiplos padrões sejam indicados, o badblock testará todos.

-v — Verbose mode.

-w — Nesse caso, o badblock vai escrever algum padrão em todos os blocos, ler cada um deles e comparar o conteúdo final com o original em busca de falhas.

-X — Utilizado apenas no e2fsck e no mke2fs, ignora checagens de segurança do disco.

Linha de Comando

Como citado anteriormente, o S.M.A.R.T. já é capaz de identificar badblocks automaticamente. No entanto, esse processo ocorre de maneira passiva e, como consequência, um bloco defeituoso só é identificado se o sistema operacional tentar executar uma operação de leitura nele. Diante disso, uma alternativa é utilizar o comando dd como superusuário para bloquear o acesso aos blocos defeituosos. Ele pode ser escrito como

# dd if=/dev/zero of=/myfile.txt bs=1024 count=10

Sendo os seus parâmetros

-if — Especifica o disco que será lido.

-of — Indica o arquivo de saída.

-bs — Tamanho de cada bloco de dados do sistema.

-count — Número de blocos a serem reescritos.

Recuperando os badblocks com o Linux

Além de identificar os badblocks, também precisamos bloquear o acesso aos mesmos, impedindo que o bloco defeituoso seja acessado. Para isso, utilizaremos os comandos smartd e smartctl. Em sistemas de arquivo ext2 e ext3, o procedimento é simples.

O smartctl informa ao usuário o endereço lógico do bloco (LBA) em formato exadecimal. Ele deve ser utilizado como superusuário, da seguinte forma:

smartctl -l selftest /dev/

O comando retornará o número dos setores em que erros forem encontrados, que deve ser convertido para a sua forma decimal. Com o atributo -A no lugar do atributo -l, podemos confirmar que o setor está mesmo com problemas. Para remover o trecho com problemas, devemos fazer os seguintes passos:

1. Identificar a partição em que o bloco com problemas encontra-se

Para isso, utilizamos o comando fdisk. Ele informa o trecho do disco em que cada partição começa e termina e deve ser utilizado com o root:

fdisk -lu /dev/hda (caso seja esse o nome da unidade)

Para identificar o número do setor em que o bloco encontra-se, basta subtrair o número do bloco em que a partição começa pelo valor informado no comando smartctl.

2. Identificar o tamanho de cada bloco no sistema de arquivos

Para identificar o tamanho dos blocos, utilizamos o comando tune2fs no modo superusuário da seguinte forma:

tune2fs -l /dev/ | grep Block

3. Encontrar o bloco do sistema que possui o LBA com problemas

Nesse passo, devemos usar a seguinte fórmula:

b = ((L-S) * 512/B)

onde:

Leia também ...   Como usar os poderes do usuário root no Ubuntu Linux

b = número do bloco no sistema de arquivos; B = tamanho do bloco em bytes; L = LBA do setor com problemas; S = número do setor inicial da partição em que o bloco com problemas encontra-se, de acordo com o comando fdisk -lu

O valor final deve ser convertido para um algarismo inteiro, sem a casa decimal.

4. Identificar se existe algum arquivo salvo no bloco com problemas

Nessa parte, utilizamos o comando debugfs. Ele permite identificar se um bloco específico está com problemas e também deve ser utilizado com o root conforme o exemplo abaixo, que utilizará o bloco de número 2269012:

debugfs debugfs 1.32 (09-Nov-2002) debugfs: open /dev/hda3 debugfs: testb 2269012 Block 2269012 not in use

Nesse caso, o bloco não está em uso. Caso ele esteja, o resultado será exibido conforme abaixo:

debugfs: testb 2269012 Block 2269012 marked in use debugfs: icheck 2269012 Block Inode number 2269012 41032 debugfs: ncheck 41032 Inode Pathname 41032 /arquivos/documento.txt

Nesse caso, o arquivo armazenado no bloco com problemas possui o caminho /arquivos/documento.txt.

Em computadores com o sistema de arquivos ext3, o bloco com problemas pode fazer parte do journal do disco. Nessas situações, o inode será muito pequeno, impedindo a exibição do caminho do documento. Para evitar que isso atrapalhe o processo, basta remover o journal com o comando tune2fs

tune2fs -O ^has_journal /dev/

Repita o passo 4 e se o problema não ocorrer novamente, refaça o journal

tune2fs -j /dev/

5. Remover os dados com o comando dd

O último passo envolve a remoção do arquivo que ocupa o setor defeituoso e a recuperação do bloco. Para isso, utilizaremos o comando dd. No exemplo abaixo, o bloco de número 2269012 possui o tamanho de 4096 bytes:

dd if=/dev/zero of=/dev/hda3 bs=4096 count=1 seek=2269012 sync

Falhas operacionais podem ocorrer em qualquer ambiente de trabalho. No caso dos badblocks, eles podem ter um grande impacto, levando a perda permanente de arquivos. Mas, graças ao Linux, já é possível adotar medidas corretivas para isolar os blocos defeituosos.

Em todo caso, a maneira mais eficaz de lidar com badblocks no Linux é trocando a unidade defeituosa e efetuando o backup dos dados. Assim, a empresa elimina as chances de a falha voltar a ocorrer e interferir na rotina do negócio.

Sistemas Linux já fazem parte do dia a dia de vários empreendimentos. Saiba o que pode ser feito para otimizar os seus estudos na área e tornar-se um profissional de destaque!

Sobre pedrodelfino

Trabalha a mais de 14 anos com administração de sistemas LINUX, dedicado em ensinar novos profissionais a atuar com servidores. Saiba mais aqui. "Caso queira participar de uma aula online comigo utilize o formulário Acima"

Aula Online: Aprenda a Dominar o Linux De Uma Vez Por Todas

x

Aprenda a Dominar o Linux De Uma Vez Por Todas

Você vai aprender passo a passo como dominar o LINUX de uma vez por todas e descobrir os 4 pilares para ser um Profissional EXPERT.