Eu tenho disco rígido cheio de zeros.
Como verificar se todos os bits no disco rígido são zeros usando o bash?
hard-drive
bash
ubuntu-12.10
gkfvbnhjh2
fonte
fonte
Respostas:
od
substituirá as execuções da mesma coisa por*
, para que você possa usá-lo facilmente para verificar bytes diferentes de zero:fonte
| head
ao final disso, para que, se a unidade não estiver zerada, pare após produzir apenas o suficiente para mostrar o fato, em vez de colocar a unidade inteira na tela.Eu escrevi um programa C ++ curto para fazer isso, fonte disponível aqui .
Para construí-lo:
Para executá-lo:
Ele exibirá a posição e o valor de quaisquer bytes diferentes de zero. Você pode redirecionar esta saída para um arquivo com
>
, por exemplo:Você pode tentar mudar
BUFFER_SIZE
para obter melhor eficiência. Não tenho certeza do valor ideal. Observe que isso também afeta a frequência com que imprime o progresso, o que afetará um pouco a velocidade (a saída de impressão no console é lenta ). Adicione2>/dev/null
para se livrar da saída do progresso.Estou ciente de que isso não está usando o bash padrão, nem mesmo os internos, mas não deve exigir privilégios extras. A solução da @Hennes ainda é mais rápida (eu realmente não otimizei nada - esta é a solução ingênua); no entanto, este pequeno programa pode lhe dar uma idéia melhor de quantos bytes seu limpador perdeu e em que local. Se você desabilitar a saída de progresso, ainda será mais rápido do que a maioria dos discos rígidos de consumo pode ler (> 150 MB / s), então isso não é um grande problema.
Uma versão mais rápida com saída menos detalhada está disponível aqui . No entanto, ainda é um pouco mais lento que a solução da @Hennes. Este, no entanto, será encerrado no primeiro caractere diferente de zero que encontrar, por isso é potencialmente muito mais rápido se houver um diferente de zero próximo ao início do fluxo.
Adicionando fonte à postagem para manter a resposta melhor independente:
fonte
iszero /dev/sda
vez de exigir que ele seja canalizado com algo parecidoiszero < /dev/sda
?int main(int argc, char *argv[])
e depoisFILE* file = fopen(argv[1], "r");
. Feito corretamente, incluiria a verificação se o argumento realmente existe, a verificação de erros com êxito (faça umaferror
verificação adicional após afopen
), etc., mas muitos problemas para um programa descartável.gcc
não está necessariamente disponível em todas as distros do Linux sem a necessidade de baixar pacotes adicionais. Então, novamente numpy não é parte de pacotes Python padrão ou ...-O3
e-march=native
poderá ver algumas acelerações; isso deve garantir que o GCC habilite a vetorização automática e use o melhor disponível para sua CPU atual (AVX, SSE2 / SSE3, etc.). Junto com isso você pode jogar com o tamanho do buffer; tamanhos de buffer diferentes podem ser mais ideais com loops vetorizados (eu jogaria com 1 MB +, o atual é 1 kB).@Bob
) no chat: chat.stackexchange.com/rooms/118/root-accessExpandindo a resposta de Gordon,
pv
fornece uma indicação de quão longe o processo está:fonte
Parece uma solução feia e ineficiente, mas se você precisar verificar apenas uma vez:
dd if=/dev/sdX | tr --squeeze-repeats "\000" "T"
Usando dd para ler do disco
sdX
. (substitua o X pela unidade da qual você deseja ler) edepois traduza todos os zero bytes não imprimíveis em algo que possamos manipular.
Em seguida, contamos os bytes que podemos manipular e verificamos se é o número certo (use
wc -c
para isso) ou pulamos a contagem e usamos o-s
ou--squeeze-repeats
para espremer todas as múltiplas ocorrências em um único caractere.Assim,
dd if=/dev/sdX | tr --squeeze-repeats "\000" "T"
deve imprimir apenas um único T.Se você deseja fazer isso regularmente, deseja algo mais eficiente.
Se você quiser fazer isso apenas uma vez, esse kludge poderá verificar se o limpador normal está funcionando e se você pode confiar nele.
fonte
Para verificar apenas, você verá todos os blocos que não correspondem listados
Ou use badblocks para escrevê-los e verificar:
O teste destrutivo padrão é minha opção segura de exclusão
Se alguém puder recuperar alguma coisa depois de encher a unidade com 0s e 1s alternados, então o complemento, todos os 1s e todos os 0s, com cada passe verificado, funcionou, boa sorte para eles!
Também faz uma boa verificação pré-implantação em novas unidades
para outras opções
Não estou dizendo que é rápido, mas funciona ...
fonte
Melhor dos dois mundos. Este comando irá pular setores defeituosos:
Use
kill -USR1 <pid of dd>
para ver o progresso.fonte
Algum tempo atrás, eu estava curioso
AIO
. O resultado foi um programa de teste de amostra que verifica os setores (blocos de 512 bytes) que sãoNUL
. Você pode ver isso como uma variante de um detector de regiões de arquivo esparsas . Eu acho que a fonte diz tudo.NUL
exibido, será semelhante0000000000-eof
. Observe que há um truque no programa, a funçãofin()
não é chamada na linha 107 de propósito para fornecer a saída mostrada.AIO
não é tão direto quanto outras formas,AIO
é provavelmente a maneira mais rápida de manter uma unidade ocupada lendo , porque aNUL
comparação é feita enquanto o próximo bloco de dados é lido. (Podemos espremer mais alguns milissegundos fazendo sobreposiçõesAIO
, mas eu realmente não acho que isso vale a pena o esforço.)true
se o arquivo é legível e tudo funcionou. Ele não retornafalse
se o arquivo não forNUL
.NUL
ele ainda funciona, pois os buffers de memória já contêmNUL
. Se alguém acha que isso precisa de uma correção, na linha 95memcmp(nullblock, buf+off, SECTOR)
pode ler-sememcmp(nullblock, buf+off, len-off<SECTOR : len-off : SECTOR)
. Mas a única diferença é que o "relatório final" talvez seja um pouco aleatório (não para um arquivo que é inteiramenteNUL
).memcmp()
também corrige outro problema nas plataformas, que nãoNUL
alloc()
editam memória, porque o código não faz isso. Mas isso só pode ser visto em arquivos com menos de 4 MiB, maschecknul
provavelmente é um exagero para uma tarefa tão pequena;)HTH
fonte
Queria postar esta solução inteligente a partir de uma pergunta semelhante, mas anterior, postada por um usuário que não faz login há um tempo:
fonte