Antworten:
Es gibt drei Dinge, die passieren können:
Soweit zur Theorie. Nun zu einem praktischen Test.
Ich habe ein neues Ubuntu 12.10 auf einer VM installiert. (VMware Workstation unter Win7-x64 mit Standardoptionen und einer virtuellen Festplatte von 10 GB).
Der Befehl dd wurde erfolgreich ausgeführt und ich wurde an einer scheinbar funktionierenden Eingabeaufforderung zurückgesetzt. Ich könnte neue Befehle eingeben, obwohl diese aus offensichtlichen Gründen fehlschlagen würden.
Segmentation fault
und Sie behaupten, dass es erfolgreich abgeschlossen wurde ...?
Ein kurzes Experiment in einer virtuellen Maschine unter Verwendung von Damn Small Linux zeigt, dass der Befehl dd tatsächlich wie erwartet ausgeführt wird. Das Programm wird zunächst in den Speicher geladen, um ausgeführt zu werden, und es macht wenig Sinn, die ausführbare Datei während des Vorgangs immer wieder zu laden. Schließlich wird dd beendet und meldet, dass auf dem Gerät kein Speicherplatz mehr vorhanden ist.
Danach scheint das Betriebssystem auf den ersten Blick normal zu funktionieren, hängt jedoch nach dem ersten Befehl, den es aus offensichtlichen Gründen nicht mehr ausführen kann, und reagiert nicht mehr. Eine kurze Überprüfung des Festplatteninhalts zeigt, dass die Partition tatsächlich auf Null gesetzt wurde.
Von der mmap
Seite unter 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.
Ausführbare Dateien werden vom Kernel über einen internen Aufruf der mmap
Funktion dem Speicher zugeordnet . Eine MAP_PRIVATE
Typzuordnung wird angefordert (siehe fs/binfmt_elf.c
Kernel-Quellbaum).
Es läuft also auf das Verhalten hinaus mmap
: ob Änderungen in der Datei oder das zugrunde liegende Blockgerät, auf das auf diese Datei verwiesen wird, an die Seiten der Zuordnung weitergegeben werden, die bereits ausgelagert wurden und vorhanden sind.
Diese Seite basiert eher auf API-Standards als auf dem Kernel-Verhalten, daher das "nicht spezifizierte". Das tatsächliche Verhalten besteht darin, dass Änderungen an der Datei nicht auf bereits vorhandene Seiten zurückgegeben werden. Wenn das Programm plötzlich zu einer Codeseite springt, die nicht ausgelagert wurde und die Löschung bereits stattgefunden hat, erhält es natürlich eine Seite mit allen Nullen.
Aber wahrscheinlich hat es zu dem Zeitpunkt dd
, an dem es sich selbst löscht, alle Seiten des Codes ausgelagert, die es benötigt, um die Löschschleife fortzusetzen. Es besteht die Möglichkeit, dass die Schleife nach dem Beenden einen Code trifft, der sich auf einer nicht vorhandenen Seite befindet: Angenommen, eine Funktion erstreckt sich über eine Seitengrenze. Um die Rückgabeanweisung zu erreichen, muss eine Seite abgerufen werden.
Diese Seite kann jedoch auch von einem vorherigen dd
Aufruf zwischengespeichert werden.
Ja. Natürlich kostet es Sie auch den größten Teil Ihres Dateisystems, aber vermutlich wissen Sie das bereits ...
Ich habe kürzlich einen Fehler gemacht. Ich wollte ein 2-GB-Bild auf die SD-Karte übertragen, habe es aber versehentlich mit sda gemacht dd if=rasberrypi.img of=/dev/sda
. Ich habe meinen Fehler erkannt und den dd abgebrochen, aber bis dahin waren ~ 600 MB (auf einer Festplatte mit ~ 500 GB) geschrieben worden. Partitionstabelle wurde ruiniert.
Der Desktop (mit 10 GB Speicher und wochenlang) funktionierte einige Stunden lang, wenn nichts passierte. Es ist gelungen, kürzlich wichtige Dateien in Dropbox zu ändern, die normalerweise in Chrome durchsucht werden. In der Tat konnte ich die dd auf SD-Karte laufen lassen, wie ich ursprünglich wollte, funktionierte gut.
Nach ein paar Stunden ging mein Dateisystem in den schreibgeschützten Modus und zufällige Programme begannen zu sterben. Ich war in viele andere Systeme eingebunden, ich konnte diese Sitzungen weiterhin verwenden, aber das Erstellen einer neuen Sitzung gab den Fehler, dass das ssh-Programm nicht gefunden werden konnte. Zu diesem Zeitpunkt konnte ich offene Tabs in Chrom wechseln, aber der Inhalt der Tabs scheint "hängen geblieben" zu sein. Wenn ich aktualisiere, bekomme ich für immer einen weißen Bildschirm. rsyslogd hat aus irgendeinem Grund 100% CPU (1 Kern) verwendet, wahrscheinlich war es verwirrt, warum es keine Protokolle auf die Festplatte leeren konnte ... vielleicht.
Ich hatte ein 350 MB großes Video in VLC geöffnet (und angehalten), konnte es trotzdem abspielen und zu einem beliebigen Teil des Videos springen. Wahrscheinlich seit dem letzten Download.
Ich konnte das System normalerweise über die GUI herunterfahren, keine Fehler.
Dies beantwortet Ihre Frage also nicht genau, sondern sagt, was passiert, wenn Sie den Anfang der Festplatte auslöschen.
Die meisten Dinge auf der Festplatte können immer noch wiederhergestellt werden, aber ich werde mich nicht darum kümmern, da (hoffentlich) alles, was mir wichtig ist, gesichert wird.
Höchstwahrscheinlich wird es nicht abgeschlossen, da eine andere ausführende Komponente eine fehlende Datei anfordert und den Kernel in Panik versetzt. Wenn Sie die Festplatte wirklich auf Null stellen möchten, verwenden Sie eine Live-CD. Andernfalls können Sie das Ergebnis niemals garantieren.