Risposte:
Ci possono essere tre cose che possono accadere:
Finora per la teoria. Ora per un test pratico.
Ho installato un nuovo Ubuntu 12.10 su una VM. (Workstation VMware su win7-x64, utilizzando le opzioni predefinite e un disco virtuale da 10 GB).
Il comando dd è stato completato con successo e mi è stato restituito quello che sembrava un prompt funzionante. Potrei inserire nuovi comandi, anche se fallirebbero per ovvi motivi.
Segmentation fault
e affermi che è stato completato correttamente ...?
Un rapido esperimento in una macchina virtuale che utilizza Damn Small Linux indica che il comando dd viene effettivamente completato, come previsto; il programma viene inizialmente caricato in memoria per l'esecuzione e ha poco senso caricare più volte l'eseguibile durante il processo. Alla fine, dd uscirà e segnalerà "nessuno spazio lasciato sul dispositivo".
Successivamente, il sistema operativo sembra funzionare normalmente a prima vista, ma si blocca dopo il primo comando che non può più eseguire per ovvi motivi e non risponde. Una breve ispezione del contenuto del disco rigido mostra che la partizione è stata effettivamente azzerata.
Dalla mmap
pagina su 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.
Gli eseguibili vengono mappati nella memoria dal kernel tramite una chiamata interna alla mmap
funzione. È MAP_PRIVATE
richiesta una mappatura del tipo (consultare fs/binfmt_elf.c
l'albero dei sorgenti del kernel).
Quindi si riduce al comportamento di mmap
: se i cambiamenti nel file, o il dispositivo a blocchi sottostante a cui viene fatto riferimento a quel file, vengono propagati alle pagine della mappatura che sono già state paginate e sono presenti.
Quella pagina si basa sugli standard API, piuttosto che sul comportamento del kernel, quindi il "non specificato". Il comportamento effettivo è che le modifiche al file non vengono propagate alle pagine già presenti. Ovviamente, se il programma salta improvvisamente a una pagina di codice che non è stata paginata e la cancellazione è già avvenuta, allora otterrà una pagina di tutti gli zeri.
Ma, molto probabilmente, con il tempo si dd
cancella, ha impaginato in tutte le pagine di codice necessarie per continuare il ciclo di cancellazione. Esiste la possibilità che una volta terminato il ciclo, possa colpire del codice che si trova in una pagina non presente: come, diciamo, una funzione si estende attraverso un limite di pagina, quindi per raggiungere l'istruzione di ritorno, una pagina deve essere recuperata.
Ma quella pagina può anche essere memorizzata nella cache da una precedente dd
chiamata.
Sì. Certo, ti costerà anche la maggior parte del tuo filesystem, ma presumibilmente sai già che ...
Ho fatto un errore di recente. Avevo intenzione di aggiungere un img da 2 GB su scheda SD, ma per errore l'ho fatto su SDA dd if=rasberrypi.img of=/dev/sda
. Realizzato il mio errore e cancellato il dd, ma per allora erano stati scritti ~ 600 MB (su un disco con ~ 500 GB usati). Il tavolo delle partizioni è stato rovinato.
Il desktop (con 10 GB di memoria e fino a settimane) ha continuato a funzionare per alcune ore se non è successo nulla. Gestito per ottenere recentemente cambiato importanti file in dropbox, navigato normalmente in Chrome. In effetti ho potuto eseguire il dd su scheda SD come avevo inizialmente desiderato, ha funzionato bene.
Dopo un paio d'ore, il mio filesystem è entrato in modalità di sola lettura e i programmi casuali hanno iniziato a morire. Sono stato coinvolto in molti altri sistemi, ho potuto continuare a utilizzare quelle sessioni, ma fare una nuova sessione mi ha dato l'errore di non riuscire a trovare il programma ssh. In questo momento ho potuto cambiare le schede aperte in Chrome, ma il contenuto delle schede sembra essere "bloccato". Se aggiorno, ottengo lo schermo bianco per sempre. rsyslogd stava prendendo il 100% di CPU (1 core) per qualche motivo, probabilmente era confuso perché non poteva scaricare i log su disco ... forse.
Avevo aperto (e messo in pausa) un video da 350 MB in VLC, potevo ancora riprodurlo e saltare a qualsiasi parte del video. Probabilmente dal momento che è un download recente.
Potrei arrestare normalmente il sistema usando la GUI, nessun errore.
Quindi questo non risponde esattamente alla tua domanda, ma dice cosa succede se cancelli l'inizio del disco.
La maggior parte delle cose sul disco può ancora essere recuperabile, ma non mi preoccuperò poiché (si spera) viene eseguito il backup di tutto ciò che mi interessa.
Molto probabilmente non verrà completato, poiché alcuni altri componenti in esecuzione richiederanno un file mancante e faranno prendere il panico dal kernel. se vuoi davvero azzerare il disco, usa un live CD; altrimenti non puoi mai garantire il risultato.