Como ignorar erros de gravação ao zerar um disco?

19

Digamos que você queira zerar um disco rígido com falha. Você quer sobrescrever o máximo possível com zeros. O que você não quer é: o processo é anulado no primeiro erro de gravação. Como fazer isso?

AFAICS, simples dd fornece apenas uma opção para ignorar erros de leitura. Assim, algo como

dd if=/dev/zero of=/dev/disk/by-id/lousy-vendor-123 bs=128k

não é suficiente.

ddrescue parece ser melhor em ignorar erros - mas qual seria a linha de comando ideal?

Minha tentativa com o GNU ddrescue:

ddrescue --verbose --force --no-split /dev/zero /dev/disk/by-id/lousy-vendor-123
    
por maxschlepzig 13.09.2015 / 12:08

5 respostas

12

Eu prefiro badblocks no modo de gravação destrutivo para isso. Ele escreve, ele continua fazendo isso quando atinge os erros e, finalmente, informa onde esses erros estavam, e essas informações podem ajudá-lo a decidir o que fazer a seguir (Will It Blend?).

# badblocks -v -b 4096 -t random -o badblocks.txt -w /dev/destroyme
Checking for bad blocks in read-write mode
From block 0 to 2097151
Testing with random pattern: done
Reading and comparing: done
Pass completed, 52105 bad blocks found. (0/52105/0 errors)

E a lista de bloqueios:

# head badblocks.txt
2097000
2097001
2097002
2097003
2097004

E o que resta no disco depois:

# hexdump -C /dev/destroyme
00000000  be e9 2e a5 87 1d 9e 61  e5 3c 98 7e b6 96 c6 ed  |.......a.<.~....|
00000010  2c fe db 06 bf 10 d0 c3  52 52 b8 a1 55 62 6c 13  |,.......RR..Ubl.|
00000020  4b 9a b8 d3 b7 57 34 9c  93 cc 1a 49 62 e0 36 8e  |K....W4....Ib.6.|

Observe que não são dados aleatórios, mas o padrão é repetitivo, por isso, se você ignorou 1MiB , verá a mesma saída novamente.

Ele também tentará verificar lendo os dados de volta, portanto, se você tiver um disco que afirma estar gravando com sucesso, mas retornar dados errados no readback, ele também encontrará esses erros. (Certifique-se de que nenhum outro processo grave no disco enquanto os badblocks estão sendo executados para evitar falsos positivos.)

Claro que com um disco mal quebrado, isso pode levar muito tempo: não há código que faça com que ele pule totalmente as áreas defeituosas. A única maneira de conseguir isso com badblocks seria usar blocos muito maiores.

Não tenho certeza se ddrescue faz isso melhor; é suposto fazer isso na outra direção (recuperar o máximo de dados o mais rápido possível). Você pode fazer isso manualmente para dd / ddrescue / badblocks especificando primeiro / último bloco ...

    
por 13.09.2015 / 12:34
13

Se o disco não for não conectado por USB, considere usar hdparm (versão > 9.31) para executar um ATA Secure Erase do disco. Este comando faz com que o firmware da unidade limpe o conteúdo do disco, incluindo os blocos defeituosos.

Aviso: Use a letra da unidade correta - Mostrei /dev/sdX como exemplo - não copie / cole apenas.

Primeiro, verifique se ele entende os comandos ATA (a maioria das unidades fabricadas nesta última década ou mais deve):

$ sudo hdparm -I /dev/sdX
.
# lots of other info here...
.
Security: 
    Master password revision code = 65534
        supported
    not enabled
    not locked
    not frozen
    not expired: security count
        supported: enhanced erase
    202min for SECURITY ERASE UNIT. 202min for ENHANCED SECURITY ERASE UNIT.

As duas últimas linhas da extração mostram que ela é suportada.

Portanto, adicione uma senha ao drive (um requerimento aparentemente):

$sudo hdparm --user-master u --security-set-pass p /dev/sdX
security_password="p"

e apagar:

$sudo hdparm --user-master u --security-erase p /dev/sdX
security_password="p"

/dev/sdX:
Issuing SECURITY_ERASE command, password="p", user=user

Mais informações sobre este procedimento estão disponíveis aqui .

    
por 13.09.2015 / 13:25
2

Eu vejo quatro respostas viáveis aqui:

  1. O método hdparm publicado por garethTheRed é provavelmente o melhor se você estiver conectado diretamente ao seu computador. Aparentemente, no entanto, se você tentar conectá-lo via USB, você pode fazer o seu disco funcionar. Se você está fazendo isso para uma unidade que você está prestes a descartar, então isso pode ser uma coisa boa. No entanto, você provavelmente deseja proteger o apagamento antes de descartá-lo.

  2. A técnica relatada por imz - Ivan Zakharyaschev funcionará, mas pode seja muito lento. Sugiro que, se você não quiser que os dados sejam recuperáveis, use /dev/urandom em vez de /dev/zero ; por exemplo,

    dd iflag=fullblock oflag=direct conv=noerror,notrunc if=/dev/urandom of=/dev/sdX
    
  3. Eu aconselharia o seguinte. Para algo mais rápido que faz a mesma coisa, use a técnica relatada por maxschlepzig (na pergunta):

    ddrescue --verbose --force --nosplit /dev/urandom /dev/sdX
    

    Isso será mais rápido que o comando dd , mas não tão rápido quanto o comando hdparm . Veja abaixo porque eu não recomendo isso ...

  4. O comando badblocks também funcionará, mas você não pode randomizar os dados dessa maneira e, novamente, será muito lento.

Por fim, seria negligente se eu não apontasse a razão número um para as pessoas quererem apagar completamente um disco, pois elas estão prestes a descartá-lo. Nesse caso, se você ainda não tiver feito isso, tente primeiro recuperar o disco. Se você ler um bloco e ele retornar o erro de I / O, da próxima vez que você gravar no mesmo bloco, o disco tentará realocar um bloco diferente de uma lista de reserva. Quando a lista de reserva estiver cheia, você receberá erros de E / S nas gravações. É quando você realmente deve descartar a unidade.

Então você pode fazer algo simples como:

dd if=/dev/sdX of=/dev/null conv=noerror

E, então, para reescrever os blocos ruins, apenas algo como:

dd if=/dev/zero of=/dev/sdX bs=128k

Se este comando funcionar, se você for corajoso, poderá reformatar seu disco e usá-lo novamente.

Como alternativa, você pode executar o comando badblocks no disco duas vezes. A segunda vez que ele não deve reportar nenhum bloco ruim ...

badblocks -v -s -w -t random /dev/sdX
badblocks -v -s -w -t random /dev/sdX

Isso vai demorar mais, mas é mais confiável.

Também é importante notar que nenhuma das técnicas realmente faz um apagamento seguro, exceto o comando hdparm . Lembre-se de todos esses maus blocos? Aqueles ainda têm alguns dos seus dados originais praticamente intactos. Um especialista em recuperação de dados pode acessá-los para ver uma pequena parte do que estava anteriormente em seu disco rígido.

No que diz respeito a descescue e porque eu aconselho contra isso, eu tenho o seguinte antídoto:

O problema é que o ddrescure será muito bom em ignorar erros. Eu tinha um disco rígido que consistentemente com dd caiu velocidade de gravação em cerca de 102 GB e começou a produzir erros de gravação na marca de 238 GB. Fiquei bastante impressionado com o fato de que o ddrescue continuava a se movimentar pelo disco a uma velocidade constante, mesmo sem relatar nenhum erro. 17 horas depois, quando estava no 1300 GB, quando percebi que a luz da propulsão parou de piscar. Uma verificação rápida revelou que todo o gabinete USB estava offline. Eu puxei o carro para fora do berço. Eu notei que ddrescue apenas felizmente relatou que ainda estava copiando sem erros, mesmo com o disco em minhas mãos. Eu pluguei o disco em outra máquina e descobri que agora era um tijolo.

Eu não culpo o ddrescue por fazer do drive um tijolo. A unidade estava falhando e se tornaria um tijolo. Acabei de encontrar perturbador ddrescue não dá sequer uma contagem de erros de quantos erros de gravação está ignorando. Nesse uso, o ddrescue deixa você pensar que foi completamente bem-sucedido, independentemente de todas as falhas de gravação. O fato é que não deveria ter sido capaz de continuar a toda velocidade na seção com a desaceleração. A razão pela qual a seção foi lenta, é que muitos blocos foram realocados pela unidade, causando muita procura ao acessar essa seção. Então, esse é provavelmente o ponto em que a saída do ddrescue se tornou fictícia.

    
por 19.09.2015 / 15:02
1

Um método rápido e maduro é usar sdd .

Se você quiser apenas destruir todo o conteúdo, ligue:

sdd -inull bs=1m of=/dev/rdsk/cXdXtXp0 -noerror

Sempre use a interface de driver de disco "bruta".

Se você gosta de reparar um disco e manter o máximo possível do conteúdo antigo, chame:

sdd if=/dev/rdsk/cXdXtXp0 of=/dev/rdsk/cXdXtXp0 bs=1m -noerror

Isso substituirá todos os blocos ilegíveis por zeros no nível de 512 bytes. Você pode modificar a contagem de novas tentativas através de try=# , o padrão é 2.

Observe que sdd é mais rápido que dd no caso de erros, pois primeiro tenta ler com o tamanho do bloco fornecido e, no caso de erros, lê com 512 bytes. Se houver erros de leitura, o sdd faz buscas aleatórias e leituras falsas para acalmar o firmware da unidade.

Os recursos aprimorados de recuperação de erros foram desenvolvidos na década de 1980, enquanto eu trabalhava para o segundo maior OEM da Sun Microsystems.

O código fonte do Sdd está incluído nas ferramentas schily:

link

    
por 13.09.2015 / 15:20
0
dd conv=notrunc

provavelmente fez o truque para mim.

O mencionado

dd conv=noerror

deve ser para erros de leitura (de acordo com a manpage). Não há nada de ruim em combinar os dois.

Meu comando completo para zerar um disco se parecia com:

dd iflag=fullblock oflag=direct conv=noerror,notrunc if=/dev/zero of=/dev/sda

Adicionar um bs= personalizado também pode ser desejado em alguns casos.

    
por 13.09.2015 / 15:09