Respostas:
Há três coisas que podem acontecer:
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.
Segmentation fault
e você afirma que foi concluído com êxito ...?
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.
Na mmap
pá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 mmap
função. Um MAP_PRIVATE
mapeamento 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 dd
apaga, 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 dd
chamada anterior .
Sim. Claro, isso também custará a maior parte do seu sistema de arquivos, mas presumivelmente você já sabe disso ...
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.
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.