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

19

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

AFAICS, plain ddapenas fornece 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 é o suficiente.

ddrescue parece ser melhor para 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
maxschlepzig
fonte
1
dd conv=noerrorpode ser uma extensão GNU, não tenho certeza. De qualquer forma, deve funcionar. Porém, vale a pena investigar a resposta SATA para dizer a unidade para apagar a si mesma.
Peter Cordes
1
@PeterCordes, a página homem de GNU dddocumentos noerrorcomo 'continuar depois de erros de leitura' ...
maxschlepzig
1
dd conv=noerrorist POSIX padrão, mas pode ser muito lento
Schily
2
dd conv=noerrordeve ser para erros de leitura (de acordo com a página de manual), não para erros de gravação. Não há nada ruim em combiná-lo conv=notrunc, o que fez o truque de ignorar os erros de gravação para mim. unix.stackexchange.com/a/229379/4319
imz - Ivan Zakharyaschev
Uma operação simples de gravação em um disco rígido, como o uso dd if=/dev/zero of=/dev/sdX, não executaria nenhuma leitura de disco. Por que você acha que o comando dd "não é suficiente" ? Quais "erros" você está enfrentando?
sawdust

Respostas:

12

Eu prefiro badblocksno modo de gravação destrutivo para isso. Ele escreve, continua fazendo isso quando encontra erros e, finalmente, informa onde estavam esses erros, e essas informações podem ajudá-lo a decidir o que fazer em seguida (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 realmente aleatórios - o padrão é repetitivo; portanto, se você pular, 1MiBverá a mesma saída novamente.

Ele também tentará verificar lendo os dados novamente, portanto, se você tiver um disco que afirma estar gravando com êxito, mas retorna dados incorretos no readback, ele também encontrará esses erros. (Verifique se nenhum outro processo grava no disco enquanto os badblocks estão em execução para evitar falsos positivos.)

Obviamente, com um disco danificado, isso pode levar muito tempo: não há código que o faça pular completamente as áreas defeituosas. A única maneira de conseguir isso badblocksseria usando um tamanho de bloco muito maior.

Não tenho certeza se ddrescueisso melhora; deve 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 o primeiro / último bloco ...

frostschutz
fonte
1
Se eu usar -t randomou -t 0- badblocks, basta fazer um passe de gravação? Olhando para a página de manual - parece que sem -tele faz 4 passes (para '0xaa, 0x55, 0xff, 0x00').
maxschlepzig 13/09/2015
2
Ele faz uma passagem para cada um que -tvocê fornecer na linha de comando. O padrão é 4 passes, como você diz.
Frostschutz 13/09/2015
13

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

Aviso: use a letra da unidade correta - /dev/sdXcomo mostrei como exemplo - não copie / cole.

Primeiro, verifique se ele entende os comandos do ATA (a maioria das unidades fabricadas na ú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 à unidade (um requisito aparentemente):

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

e apague:

$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 .

garethTheRed
fonte
Isso pode funcionar com USB, se você tiver sorte, e sua ponte USB <-> SATA pode passar por comandos SATA não padrão (e o driver Linux + hdparm sabe como fazê-lo nesse modelo). Além disso, para escrever exemplos, /dev/sdXé bom, porque, se alguém perder uma ocorrência ao colar e personalizar, não haverá problema.
Peter Cordes
@ Peter Cordes - A menos que você tenha 24 discos ... Não, bobo! Obrigado, mudei para sdX, o que me ensinará a responder rapidamente!
garethTheRed
2
As listas de páginas ligadas tantas hardware / advertências firmware relacionados com este método ... um pouco assustador
maxschlepzig
Realmente mostra algumas advertências! Tudo o que posso dizer é que funcionou para mim sem nenhum problema.
garethTheRed
2

Vejo quatro respostas viáveis ​​aqui:

  1. O hdparmmétodo publicado por garethTheRed provavelmente é o melhor se você estiver conectado diretamente ao seu computador. Aparentemente, porém, se você tentar conectar via USB, poderá bloquear sua unidade. Se você estiver fazendo isso para uma unidade que está prestes a descartar, isso pode ser uma coisa boa. No entanto, você provavelmente deseja apagar com segurança antes de descartar.

  2. A técnica relatada por imz - Ivan Zakharyaschev funcionará, mas pode ser muito lenta. Eu sugeriria que se você não quiser que os dados sejam recuperáveis, use em /dev/urandomvez de /dev/zero; por exemplo,

    dd iflag=fullblock oflag=direct conv=noerror,notrunc if=/dev/urandom of=/dev/sdX
    
  3. Eu aconselharia contra o seguinte. Para algo mais rápido que faça 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 ddcomando, mas não tão rápido quanto o hdparmcomando. Veja abaixo por que eu não recomendo isso ...

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

Por fim, seria negligente se não apontasse a principal razão pela qual as pessoas desejam apagar completamente um disco porque estão prestes a descartá-lo. Nesse caso, se você ainda não o fez, convém tentar recuperar o disco primeiro. Se você ler um bloco e ele retornar o erro de E / S, 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. É aí que 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 defeituosos, algo como:

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

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

Como alternativa, você pode executar o badblockscomando no disco duas vezes. Na segunda vez, ele deve relatar sem bloqueios ...

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

Isso levará mais tempo, mas é mais confiável.

Também é importante notar que nenhuma das técnicas realmente faz uma exclusão segura, exceto o hdparmcomando. Lembra de todos aqueles blocos ruins? Esses ainda têm alguns dos seus dados originais praticamente intactos. Um especialista em recuperação de dados pode acessá-los para ver uma pequena quantidade do que estava anteriormente no seu disco rígido.

Em relação ao ddrescue e por que aconselho contra, 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 o dd diminuiu a velocidade de gravação na marca de 102 GB e começou a produzir erros de gravação na marca de 238 GB. Fiquei bastante impressionado com o fato de o ddrescue continuar agitando o disco a uma velocidade constante, mesmo sem relatar erros. 17 horas depois, quando eu estava com 1300 GB quando notei que a luz da unidade parou de piscar. Uma verificação rápida revelou que todo o gabinete USB ficou offline. Puxei a unidade para fora do berço. Percebi que o ddrescue simplesmente relatou que ainda estava copiando sem erros, mesmo com o disco em minhas mãos. Liguei o disco a outra máquina e descobri que agora era um tijolo.

Não culpo o ddrescue por fazer da unidade um tijolo. A unidade estava falhando e se tornaria um tijolo. Eu apenas acho que o perturbador ddrescue nem dá uma contagem de erros de quantos erros de gravação ele está ignorando. Nesse uso, o ddrescue deixa você achar 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 muitas buscas ao acessar essa seção. Então esse é provavelmente o ponto em que a produção de ddrescue se tornou fictícia.

user6856
fonte
1
'Para apagar com segurança, você precisa substituir o mesmo bloco várias vezes com dados aleatórios.' - você pode fundamentar sua reivindicação com uma referência (ou seja, artigo revisado por pares que mostra recuperação de dados zerados em discos rígidos modernos)? Além disso, o firmware do disco rígido é uma caixa preta. Como você sabe que o comando ATA Secure Delete não é implementado apenas como padrão de gravação zero para cada setor?
Maxschlepzig # 20/15
Apenas o contrário. Parece que em 2006 houve vários estudos que mostraram que várias gravações antigas não são mais necessárias com unidades modernas, pois as unidades modernas armazenam os dados tão densos que uma única gravação é igualmente eficaz.
user6856
1
dd conv=notrunc

provavelmente fez o truque para mim.

O mencionado

dd conv=noerror

deve ser para erros de leitura (de acordo com a página de manual). Não há nada 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 costume bs=também pode ser necessário em alguns casos.

imz - Ivan Zakharyaschev
fonte
1

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

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

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

Sempre use a interface do driver de disco "bruto".

Se você deseja reparar um disco e manter o máximo possível do conteúdo antigo, ligue para:

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 via try=#, o padrão é 2.

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

Os recursos avançados de recuperação de erros foram desenvolvidos nos anos 80 enquanto eu trabalhava para o segundo maior OEM da Sun-Microsystems.

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

http://sourceforge.net/projects/schilytools/files/

esperto
fonte