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 dd
apenas 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
dd conv=noerror
pode 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.dd
documentosnoerror
como 'continuar depois de erros de leitura' ...dd conv=noerror
ist POSIX padrão, mas pode ser muito lentodd conv=noerror
deve 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á-loconv=notrunc
, o que fez o truque de ignorar os erros de gravação para mim. unix.stackexchange.com/a/229379/4319dd 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?Respostas:
Eu prefiro
badblocks
no 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?).E a lista de bloqueios:
E o que resta no disco depois:
Observe que não são dados realmente aleatórios - o padrão é repetitivo; portanto, se você pular,
1MiB
verá 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
badblocks
seria usando um tamanho de bloco muito maior.Não tenho certeza se
ddrescue
isso 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 ...fonte
-t random
ou-t 0
- badblocks, basta fazer um passe de gravação? Olhando para a página de manual - parece que sem-t
ele faz 4 passes (para '0xaa, 0x55, 0xff, 0x00').-t
você fornecer na linha de comando. O padrão é 4 passes, como você diz.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/sdX
como 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):
As duas últimas linhas da extração mostram que ela é suportada.
Portanto, adicione uma senha à unidade (um requisito aparentemente):
e apague:
Mais informações sobre este procedimento estão disponíveis aqui .
fonte
/dev/sdX
é bom, porque, se alguém perder uma ocorrência ao colar e personalizar, não haverá problema.Vejo quatro respostas viáveis aqui:
O
hdparm
mé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.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/urandom
vez de/dev/zero
; por exemplo,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):
Isso será mais rápido que o
dd
comando, mas não tão rápido quanto ohdparm
comando. Veja abaixo por que eu não recomendo isso ...O
badblocks
comando 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:
E, então, para reescrever os blocos defeituosos, algo como:
Se esse comando funcionar, se você for corajoso, poderá reformatar seu disco e usá-lo novamente.
Como alternativa, você pode executar o
badblocks
comando no disco duas vezes. Na segunda vez, ele deve relatar sem bloqueios ...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
hdparm
comando. 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.
fonte
provavelmente fez o truque para mim.
O mencionado
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:
Adicionar um costume
bs=
também pode ser necessário em alguns casos.fonte
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 quedd
no 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/
fonte