Posso consertar blocos ruins no meu disco rígido com um único comando?

5

Estou trabalhando para corrigir os erros no meu disco rígido. É possível fazer isso manualmente, mas pode levar horas.

Depois de digitar este comando sudo badblocks -b 512 /dev/sda , obtive centenas de resultados e quero evitar corrigi-los manualmente.

Mais detalhes sobre o meu erro podem ser encontrados aqui

Então, há alguma ferramenta que eu possa usar para corrigir os erros? Ou talvez você possa me ajudar a escrever um script de shell?

    
por Aziz Al-ghannam 02.12.2011 / 13:53

4 respostas

10

Bem, há alguns casos:

  1. Este disco faz parte de uma matriz RAID. Boa. Apenas faça md 'reparar' o array assim: echo 'repair' > /sys/block/md0/md/sync_action . Problema resolvido sem perda de dados. (Eu estou supondo que este não é o caso para você, mas você realmente deveria considerar mudar isso.)
  2. Você não se importa com os dados no disco (ou não há nenhum). Apenas use dd para zerar todo o disco.
  3. Os blocos defeituosos fazem parte do espaço livre no disco. Use, por exemplo, cat /dev/zero > tempfile para preencher o espaço livre com zeros. Faça isso como root (há espaço reservado apenas para raiz), provavelmente no modo de usuário único (para que nada quebre a falta de espaço). Depois que ficar sem espaço, remova o arquivo ( rm tempfile ).
  4. Os blocos defeituosos fazem parte dos dados (arquivos) ou metadados (estrutura do sistema de arquivos) no disco. Você perdeu dados. fsck -fc (executado com o sistema de arquivos desmontado, ou o pior caso em leitura somente durante a inicialização inicial, se for o sistema de arquivos raiz) informará quais arquivos. Substitua-os do backup.

Também é possível que badblocks -n , que deve ser somente ser feito em um sistema de arquivos desmontado , forçará um remapeamento. Não deve perder nenhum dado (além do que estava nos blocos ruins, que já estão perdidos).

Se você quiser fazer um script baseado na saída de badblocks (o que não é seguro, isso deixa você com problemas silenciosos), é bem fácil. Cada linha de saída de badblocks fornece um número de bloco, baseado no tamanho do bloco (512 no seu exemplo). Use o mesmo tamanho de bloco para% s bs . O número do bloco é seu seek para dd. Seu count é 1 (ou superior, se houver alguns blocos ruins em uma linha). of é a partição (ou disco) na qual você executou badblocks. Um bom if é /dev/zero .

    
por 02.12.2011 / 16:39
0

entrar no modo de usuário único e fazer fsck -yvf /dev/sda

Parece que ele precisa de um fsck depois de tudo.

    
por 02.12.2011 / 14:35
0

Eu não tenho certeza se você pode fazer isso com um único comando porque eu vi algumas soluções de script na internet.

O script abaixo encontra setores defeituosos, coloca os resultados de blocos ruins em um arquivo de texto e, se o tamanho do arquivo de texto for diferente de zero, e2fsck marcará setores defeituosos (portanto, esses setores marcados não serão usados pelo sistema operacional).

#!/bin/sh
target=/tmp/bad-blocks.txt
for disc in 'fdisk -l | grep '^/' | awk '{ print $1 }''; do
   badblocks -v $disc > $target
   if [ -s $target ]; then
       echo "badblock(s) found on $disc"
       e2fsck -l $target $disc
   else
       echo "no badblocks on $disc"
   fi
done
    
por 30.10.2015 / 20:23
-1

e2fsck -c -c parece fazer a mesma coisa, com seguro de tamanho de bloco.

    
por 18.11.2015 / 14:22