Was passiert, wenn ich Nullen auf das Laufwerk treibe, auf dem sich dd befindet?

10

Wird dieser Befehl dd if=/dev/zero of=/dev/sda bs=1Merfolgreich sein, wenn der Befehl dd ursprünglich in / dev / sda war? Wird dies abgeschlossen sein, weil sich dd zu diesem Zeitpunkt im Speicher befindet?

agz
quelle

Antworten:

40

Es gibt drei Dinge, die passieren können:

  1. Der Befehl wird gestartet, bis zum Abschluss ausgeführt und Sie werden zu einer Eingabeaufforderung zurückgeführt. Da die Festplatte effektiv gelöscht wird, können Sie danach nicht mehr viel tun, obwohl Sie möglicherweise Glück mit einigen integrierten Shell-Befehlen haben.
  2. Der Befehl wird gestartet. Irgendwann wird es aufgrund des Speicherdrucks ausgelagert. Normalerweise ist dies kein Problem, da Teile davon einfach von der Festplatte (unveränderte Daten) von Swap neu geladen werden können. Wenn Sie diese jedoch gerade gelöscht haben, schlägt der Befehl dd teilweise fehl, obwohl die Festplatte gefüllt ist.
  3. Die dritte Option ist etwas von BSDs. Der MBR auf einer bereitgestellten Festplatte ist vor Überschreiben geschützt. Auch wenn Sie den Befehl als root ausführen. Es gibt Dutzende von Linux-Distributionen, die sich alle geringfügig unterscheiden. Es ist durchaus möglich, dass einige von ihnen dies nachahmen.


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.

Screenshot der Ubuntu-VM nach dem Löschen der Festplatte

Hennes
quelle
9
Big +1 für den Praxistest!
Doug Harris
10
Ich sehe Segmentation faultund Sie behaupten, dass es erfolgreich abgeschlossen wurde ...?
Alvin Wong
1
Ja. Es machte die Festplatte unlesbar. Ich denke das war das Ziel. Für sicheres Löschen sollten Sie wirklich etwas anderes ausprobieren (z. B. den Befehl zum sicheren Löschen).
Hennes
Eine der besten Antworten, die ich je bekommen habe. Vielen Dank!
Agz
6

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.

Marcks Thomas
quelle
4

Von der mmapSeite 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 mmapFunktion dem Speicher zugeordnet . Eine MAP_PRIVATETypzuordnung wird angefordert (siehe fs/binfmt_elf.cKernel-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 ddAufruf zwischengespeichert werden.

Kaz
quelle
1

Ja. Natürlich kostet es Sie auch den größten Teil Ihres Dateisystems, aber vermutlich wissen Sie das bereits ...

Aaron Miller
quelle
0

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.

Sajal
quelle
-1

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.

Frank Thomas
quelle
2
Das Anfordern einer fehlenden Datei bringt den Kernel nicht in Panik. In diesem Fall würden Maschinen abstürzen, wenn sie nur eine unzuverlässige Festplatte hätten.
David Schwartz
@DAvid Schwartz, wenn das der Fall wäre, würde #rm -rf / tatsächlich das gesamte Dateisystem löschen. Ich weiß aus Experimenten, dass dies nicht der Fall ist. Das System kann nicht lange vollständig vom RAM laufen, es sei denn, es ist eine Art Ramdisk-Technologie implementiert, die nicht Standard ist.
Frank Thomas
@FrankThomas: Hat der Kernel in Panik geraten?
David Schwartz
Ja, Blackscreen-Shutdown.
Frank Thomas