O que acontece se eu dd zeros para a unidade onde reside o dd?

10

Este comando: dd if=/dev/zero of=/dev/sda bs=1M será bem sucedido se o comando dd estiver originalmente em / dev / sda? Isso será completo porque o dd está na memória nesse momento?

    
por agz 23.04.2013 / 22:26

6 respostas

40

Existem três coisas que podem acontecer:

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


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

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

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

    
por 23.04.2013 / 23:22
6

Um experimento rápido em uma máquina virtual usando o Damn Small Linux indica que o comando dd realmente é concluído, como esperado; Inicialmente, o programa é carregado na memória para ser executado e faz muito pouco sentido carregar o executável várias vezes durante o processo. Eventualmente, o dd irá sair e reportar 'sem espaço deixado no dispositivo'.

Depois, 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 não responde. Uma breve inspeção do conteúdo do disco rígido mostra que a partição foi realmente zerada.

    
por 23.04.2013 / 23:40
4

Na página mmap 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 por meio de uma chamada interna para a função mmap . Um mapeamento de MAP_PRIVATE type é solicitado (procure em fs/binfmt_elf.c da árvore de origem do kernel).

Portanto, resume-se ao comportamento de mmap : se as alterações no arquivo, ou o 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 são presente.

Essa página é baseada em padrões de API, em vez de 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. É claro que, se o programa de repente pular para uma página de código que não tenha sido paginada, e o apagamento já tiver ocorrido, ele obterá uma página de todos os zeros.

Mas, muito provavelmente, no momento em que dd se apaga, ele paginou todas as páginas de código necessárias para continuar o loop de eliminação. Existe a possibilidade de que, uma vez terminado o loop, ele possa atingir algum código que esteja em uma página que não esteja presente: por exemplo, para uma função se estender por um limite de página, para alcançar a instrução de retorno, uma página deve ser buscada. p>

Mas essa página também pode ser armazenada em cache de uma invocação anterior de dd .

    
por 24.04.2013 / 03:12
1

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

    
por 23.04.2013 / 22:27
0

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

O desktop (com 10 GB de memória e até semanas) continuou funcionando por algumas horas, como se nada tivesse acontecido. Conseguiu recentemente alterar arquivos importantes para o dropbox, navegou no chrome normalmente. Na verdade eu poderia executar o dd para o cartão SD como eu queria originalmente, funcionou bem.

Após algumas horas, meu sistema de arquivos entrou em modo somente leitura e programas aleatórios começaram a morrer. Eu foi sshed em muitos outros sistemas, eu poderia continuar usando essas sessões, mas fazendo nova sessão deu erro que não consigo encontrar o programa ssh. Neste momento eu poderia mudar de abas abertas no chrome, mas o conteúdo das abas parece ter "pendurado". Se eu atualizar, recebo a tela branca para sempre. O rsyslogd estava recebendo 100% cpu (1 core) por algum motivo, provavelmente ficou confuso por que não foi possível limpar os logs para o disco ... talvez.

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

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

Então, isso não responde exatamente à sua pergunta, mas informa o que acontece se você acabar com o disco.

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

    
por 19.05.2013 / 10:39
-1

O mais provável é que ele não seja concluído, já que algum outro componente em execução solicitará um arquivo que está faltando e apavorou o kernel. se você realmente quiser zerar o disco, use um live CD; caso contrário, você nunca poderá garantir o resultado.

    
por 23.04.2013 / 22:28

Tags