Por que o dd está rodando para sempre em uma unidade de 8 GB?

4

Eu tenho um sistema de arquivos manipulado pelo ZFS e tem cerca de 8 GB.

Eu tentei zerar o sistema de arquivos executando:

dd if=/dev/zero of=/EMPTY bs=1M | true
rm -f /EMPTY

E normalmente em um sistema de arquivos ext4, ele é concluído em poucos segundos.

Mas desta vez continuou.

Consegui iniciar um segundo terminal e ver qual era o tamanho de /EMPTY . E depois de executar ll -h , ele disse que /EMPTY foi 800 GB! Obviamente, 800 GB não se encaixam em 8 GB.

Além disso, executando df -h , mostrou que o sistema de arquivos não estava sendo preenchido.

No entanto, o dd consome 50% da CPU, etc., aquecendo meu laptop. Estou assumindo que estava fazendo muito trabalho, mas não conseguindo nada.

Então, por que o dd está rodando para sempre criando um arquivo que não ocupa nenhum tamanho? No ext4, ele deve ser concluído e me dar um erro para que eu possa prosseguir.

    
por CMCDragonkai 07.07.2014 / 07:51

3 respostas

3

Você está correndo para a compactação do ZFS. Se você está tentando eliminar o sistema de arquivos, não é possível fazer isso no ZFS. Se você está tentando eliminar o disco subjacente, a melhor coisa a fazer seria usar "zpool destroy" no pool do zfs, então use o dd no próprio dispositivo físico. ("dd if = / dev / zero de = / dev / ...."). Uma vez feito isso, basta recriar o pool com o zpool create.

    
por 07.07.2014 / 13:39
6

Eu não sei o que você está tentando alcançar, então só posso descrever o que seu comando está realmente fazendo.

dd if=/dev/zero

Você está lendo de um dispositivo especial que retorna um número infinito de bytes zero (ou NUL).

of=/EMPTY

Você está criando um novo arquivo usando a entrada acima (infinita).

bs=1M

Você lê e grava o fluxo de dados infinito em blocos de megabytes. Você nunca deve fazer algo como você provavelmente irá preencher o sistema de arquivos e muitas ferramentas não podem lidar com tais situações. Enquanto o sistema de arquivos ext4 é efetivamente preenchido e o comando termina, um sistema de arquivos compactado é capaz de compactar o fluxo de zero bytes de forma agressiva.

| true

Isso não faz sentido, pois o dd com of= não tem saída. Você provavelmente quis dizer || true para neutralizar o código de status de dd , mas isso não é muito útil, pois falhas de comando individuais não eliminam todo o script.

Um uso típico de dd if=/dev/zero é zerar todo o dispositivo, como /dev/sdb . Conforme observado em outra resposta, talvez você queira usar shred . Em ambos os casos, você quer referir-se a todas as partições do sistema apresentadas no sistema como dispositivos de bloco, não aos arquivos individuais (que podem não existir mais). Existem muitos livros e recursos on-line em dispositivos de bloco linux e páginas de manual de shred e dd também são muito úteis.

Quando você exclui um arquivo, seus blocos ficam imediatamente disponíveis. Você não precisa realizar nenhuma magia negra. Se você quiser eliminar o conteúdo de um arquivo para evitar técnicas forenses, use apenas schred --delete para remover o arquivo em vez de uma exclusão normal. Enxugar os blocos de um arquivo já excluído não é tão fácil e você não pode simplesmente confiar na criação de um grande arquivo vazio. Você precisaria de uma ferramenta específica do sistema de arquivos para fazê-lo com segurança.

    
por 07.07.2014 / 16:55
1

Eu não tenho idéia sobre ZFS , mas se sua intenção é zerar o sistema de arquivos, então dd vou sugerir shred

Não estou respondendo por que o dd está em loop infinito, mas o seu destino final está resolvido

    
por 07.07.2014 / 07:57