O que acontece se eu dd zeros na unidade em que o dd reside?

10

Este comando: terá dd if=/dev/zero of=/dev/sda bs=1Mêxito se o comando dd estava originalmente em / dev / sda? Isso será concluído porque dd está na memória naquele momento?

agz
fonte

Respostas:

40

Há três coisas que podem acontecer:

  1. O comando inicia, é executado até a conclusão e você volta a um prompt. Como o disco é efetivamente limpo, você não pode fazer muita coisa depois disso, embora possa ter sorte com alguns comandos de compilação do shell.
  2. O comando inicia. Em algum momento, ele é paginado devido à pressão da memória. Normalmente, isso não é um problema, porque partes dele podem ser recarregadas apenas do disco (dados inalterados) da troca. No entanto, se você acabou de limpá-las, o comando dd falhará parcialmente ao preencher o disco.
  3. A terceira opção é algo dos BSDs. O MBR em um disco montado está protegido contra substituição. Mesmo se você executar o comando como root. Existem dezenas de distribuições Linux, sendo todas ligeiramente diferentes. É bem possível que alguns deles imitem isso.


Até agora, para a teoria. Agora, para um teste prático.

Eu instalei um novo Ubuntu 12.10 em uma VM. (Estação de trabalho VMware em win7-x64, usando opções padrão e um disco virtual de 10 GB).

O comando dd foi concluído com êxito e fui suspenso no que parecia um prompt de trabalho. Eu poderia inserir novos comandos, embora eles falhassem por razões óbvias.

Captura de tela da VM do Ubuntu após limpar o disco

Hennes
fonte
9
Big +1 para o teste prático!
Doug Harris
10
Entendo Segmentation faulte você afirma que foi concluído com êxito ...?
Alvin Wong
1
Sim. Isso tornou o disco ilegível. Eu acho que esse era o objetivo. Para apagamentos seguros, você realmente deve tentar outra coisa (como o comando apagamento seguro).
Hennes
uma das melhores respostas que já recebi. Obrigado!
AGZ
6

Um experimento rápido em uma máquina virtual usando o Damn Small Linux indica que o comando dd é concluído como esperado; o programa é inicialmente carregado na memória para execução e faz muito pouco sentido carregar o executável repetidamente durante o processo. Eventualmente, o dd sairá e informará 'não há espaço no dispositivo'.

Posteriormente, o sistema operacional parece funcionar normalmente à primeira vista, mas trava após o primeiro comando que não pode mais ser executado por razões óbvias e deixa de responder. Uma breve inspeção do conteúdo do disco rígido mostra que a partição foi zerada.

Marcks Thomas
fonte
4

Na mmappágina no Linux:

MAP_SHARED Share this mapping.  Updates to the mapping are visible to other processes that map this  file,
           and  are  carried  through  to the underlying file.  The file may not actually be updated until
           msync(2) or munmap() is called.


MAP_PRIVATE
           Create a private copy-on-write mapping.  Updates to the mapping are not visible to other  pro‐
           cesses  mapping  the  same  file,  and  are  not carried through to the underlying file.  It is
           unspecified whether changes made to the file after the mmap() call are visible  in    mapped
           region.

Os executáveis ​​são mapeados para a memória pelo kernel através de uma chamada interna para a mmapfunção. Um MAP_PRIVATEmapeamento de tipo é solicitado (procure na fs/binfmt_elf.cárvore de origem do kernel).

Portanto, tudo se resume ao comportamento de mmap: se as alterações no arquivo ou no dispositivo de bloco subjacente ao qual esse arquivo é referenciado são propagadas de volta para as páginas do mapeamento que já foram paginadas e estão presentes.

Essa página é baseada nos padrões da API, e não no comportamento do kernel, daí o "não especificado". O comportamento real é que as alterações no arquivo não são propagadas de volta para as páginas já presentes. Obviamente, se o programa saltar repentinamente para uma página de código que não foi paginada e a exclusão já tiver ocorrido, ele receberá uma página com todos os zeros.

Mas, provavelmente, quando o tempo se ddapaga, ele paginou todas as páginas de código necessárias para continuar o ciclo de apagamento. Existe a possibilidade de que, uma vez que o loop termine, ele possa atingir algum código que esteja em uma página não presente: como, digamos, uma função se estenda através do limite de uma página, para alcançar a instrução de retorno, é necessário buscar uma página.

Mas essa página também pode ser armazenada em cache de uma ddchamada anterior .

Kaz
fonte
1

Sim. Claro, isso também custará a maior parte do seu sistema de arquivos, mas presumivelmente você já sabe disso ...

Aaron Miller
fonte
0

Eu cometi um erro recentemente. Eu pretendia colocar um img de 2 GB no cartão SD, mas fiz isso por sda por engano dd if=rasberrypi.img of=/dev/sda. Percebi meu erro e cancelei o dd, mas até então ~ 600MB (em um disco com ~ 500GB usado) havia sido gravado. Mesa de partição foi arruinada.

A área de trabalho (com 10 GB de memória e esgotada por semanas) continuou funcionando por algumas horas, caso nada acontecesse. Conseguiu transferir arquivos importantes recentemente alterados para o dropbox, navegados normalmente no chrome. Na verdade, eu poderia executar o dd no cartão SD como eu queria originalmente, funcionou bem.

Depois de algumas horas, meu sistema de arquivos entrou no modo somente leitura e programas aleatórios começaram a morrer. Eu estava no sshed em muitos outros sistemas, eu poderia continuar usando essas sessões, mas fazer uma nova sessão deu erro, pois ele não consegue encontrar o programa ssh. Nesse momento, eu podia alternar as abas abertas no chrome, mas o conteúdo das guias parecia "travar". Se eu atualizar, fico com a tela branca para sempre. O rsyslogd estava usando 100% da CPU (1 núcleo) por algum motivo, provavelmente estava confuso por que não conseguia liberar os logs para o disco ... talvez.

Eu tinha um vídeo de 350 MB aberto (e pausado) no VLC, ainda podia reproduzi-lo e pular para qualquer parte do vídeo. Provavelmente desde que é um download recente.

Eu poderia desligar o sistema normalmente usando a GUI, sem erros.

Portanto, isso não responde exatamente à sua pergunta, mas diz o que acontece se você acabar com o início do disco.

A maioria das coisas no disco ainda pode ser recuperável, mas não vou incomodar, já que (espero) tudo o que me interessa é feito.

sajal
fonte
-1

Provavelmente ele não será concluído, pois algum outro componente em execução solicitará um arquivo que está faltando e entrará em pânico no kernel. se você realmente deseja zerar o disco, use um CD ao vivo; caso contrário, você nunca poderá garantir o resultado.

Frank Thomas
fonte
2
Solicitar um arquivo que está faltando não entrará em pânico no kernel. Se isso acontecesse, as máquinas travariam se tivessem apenas um disco não confiável.
David Schwartz
@ DAVID Schwartz, se fosse esse o caso, #rm -rf / excluiria todo o sistema de arquivos. Sei por experimentos que esse não é o caso. o sistema não pode ficar funcionando por muito tempo a partir do ram, a menos que algum tipo de tecnologia ramdisk seja implementada, o que não é padrão.
Frank Thomas
@FrankThomas: O kernel entrou em pânico?
21713 David Schwartz
sim, desligamento da tela preta.
24513 Frank Thomas