Was macht `dd if = / dev / zero of = / dev / sda`?

19

Bearbeitet: Führen Sie dies nicht aus, um es zu testen, es sei denn, Sie möchten Daten zerstören.

Könnte mir jemand helfen zu verstehen, was ich habe?

  1. dd if=/dev/zero of=/dev/sda bs=4096 count=4096

    F: Warum speziell 4096 für count?

  2. dd if=/dev/zero of=/dev/sda bs=512 count=4096 seek=$(expr blockdev --getsz /dev/sda - 4096)

    F: Was genau macht das?

JH
quelle
4
Wo haben Sie diesen Schadcode gefunden
Suici Doga
10
Dies ist kein bösartiger Code.
Michael Hampton
12
@MichaelHampton: s / dangerous / destructive / Während das Posten von destruktivem Code an sich nicht schädlich ist, kann das Posten ohne eine klare Warnung erfolgen, dass es Daten zerstören kann.
Ben Voigt
1
Es ist am besten, sich DD als 'Disk Destroyer' vorzustellen, wenn jemand im Internet Sie auffordert, einen Befehl wie diesen auszuführen.
Bobby Sacamano
3
DD bedeutet eigentlich Datenbeschreibung
Suici Doga

Antworten:

43

dd if = / dev / zero von = / dev / sda bs = 4096 count = 4096 F: Warum wird 4096 besonders für Zähler verwendet?

Dadurch werden die ersten 16 MiB des Laufwerks auf Null gesetzt. 16 MiB sind wahrscheinlich mehr als genug, um "Start-of-Disk" -Strukturen zu zerstören, obwohl sie so klein sind, dass sie nicht sehr lange dauern.

dd if = / dev / zero von = / dev / sda bs = 512 count = 4096 seek = $ (expr blockdev --getsz / dev / sda - 4096)

F: Was genau macht das?

blockdev --getszRuft die Größe des Blockgeräts in "512-Byte-Sektoren" ab. Dieser Befehl scheint also die letzten 2 MB des Laufwerks auf Null zu setzen.

Leider ist dieser Befehl syntaktisch fehlerhaft. Ich gehe davon aus, dass der Befehl ursprünglich vorgesehen war

dd if=/dev/zero of=/dev/sda bs=512 count=4096 seek=$(expr `blockdev --getsz /dev/sda` - 4096)

und die Backticks gingen irgendwo entlang der Linie der Leute verloren, die sie zwischen verschiedenen Umgebungen kopieren / einfügen.

Alte Partitionstabellen, LVM-Metadaten, RAID-Metadaten usw. können bei der Wiederverwendung eines Laufwerks Probleme verursachen. Durch das Nullsetzen von Abschnitten am Anfang und Ende des Laufwerks werden diese Probleme im Allgemeinen vermieden, während das Nullsetzen des gesamten Laufwerks deutlich beschleunigt wird.

Plugwash
quelle
4
Vielen Dank. Diese Antwort scheint für das, wonach ich gesucht habe, am besten zu passen. Die beiden Befehle werden nach delpart verwendet. Sie werden zum Wischen einer Festplatte zur Wiederverwendung als sauber verwendet.
JH
expr blockdev --getsz /dev/sda - 4096wäre ein syntaxfehler von expr. Ich denke, der beabsichtigte Befehl war ...seek="$(expr "$(blockdev --getsz /dev/sda)" - 4096)". Oder besser:...seek="$(($(blockdev --getsz /dev/sda) - 4096))"
Stéphane Chazelas
1
Ich würde vermuten, dass der Befehl ursprünglich Backticks enthielt, die irgendwann gegessen wurden.
Plugwash
16

Dies löscht die erste 4096*4096=16MBund letzte 512*4096=2MBFestplatte, die wichtige Strukturen für die Wiederherstellung enthält. Ich gehe davon aus, dass dieser Code in böswilliger Absicht veröffentlicht wurde.

Ich habe noch nie eine Situation erlebt, in der explizit eine countandere als 1die nützliche angegeben wurde. Ich habe den ersten Block gelöscht, um sicherzustellen, dass ich keine Spuren des MBR hinterlasse ...

o11c
quelle
8
Dies ist nicht unbedingt böswillig. Ich habe einige schlechte Formatierungsprogramme, die es ablehnen, ein neues Etikett zu schreiben, wenn das aktuelle beschädigt ist, und musste daher die ersten Bytes wie dieses manuell auf Null setzen.
Shelvacu
1
@shelvacu Ich wäre überrascht, wenn das Laufwerk so manipuliert wurde sda. Wahrscheinlicher sdboder sdc. Aber ich kann mich natürlich irren ...
yo '
7
Das ist nicht böswillig. Es löscht die GPT am Anfang der Festplatte und die Backup-GPT am Ende der Festplatte.
Michael Hampton
2
@shelvacu: Es ist destruktiv. Wenn destruktive Befehle ohne eine Erklärung der Funktionsweise veröffentlicht wurden, ist dies böswillig. Wenn sie von einer Erklärung begleitet wurden, warum fragt OP hier danach?
Ben Voigt
2
Also, wer wird in perfektem Verstand Codes kopieren / einfügen, die man irgendwo findet, ohne den Zweck zu kennen? Nicht böswillig, weil ich kein seltsames Gerät erschüttern werde, das ich in der U-Bahn gefunden habe.
Magno C
4

Diese Befehle überschreiben Ihr SDA-Gerät mit Nullen - der erste überschreibt die ersten 16 MB (Blockgröße von 4096 und Anzahl von 4096 Blöcken) und der zweite überschreibt die letzten 2 MB (512 Blockgröße mit 4096 Blöcken) mit Nullen. (Es ist technisch nicht zu löschen, und das bezieht sich auf meinen ersten Punkt unten.)

(das war der Teil, der bereits in anderen Antworten erwähnt wurde, einschließlich hier der Vollständigkeit halber)

Erwähnenswert ist auch, dass die Blockgröße zwar Auswirkungen hat, diese jedoch im Allgemeinen nur bei Vorgängen mit hohem Volumen auftreten. Die effizienteste (schnellste) Möglichkeit, den Befehl auszuführen, besteht darin, dass die Blockgröße des Befehls mit der Zugriffsgröße des Geräts übereinstimmt, andernfalls wird Zeit verschwendet.

Wenn Sie interessiert sind, können Sie versuchen, eine Datei mit einer Million 1-Block-Chunks und einer Datei mit 1 Million Block-Chunks zu erstellen, und den Unterschied feststellen:

[user@host tmp]$ time dd if=/dev/zero of=/tmp/test1 bs=1 count=1000000
1000000+0 records in
1000000+0 records out
1000000 bytes (1.0 MB) copied, 2.44439 s, 409 kB/s

real    0m2.447s
user    0m0.177s
sys     0m2.269s
[user@host tmp]$ time dd if=/dev/zero of=/tmp/test2 bs=1000000 count=1
1+0 records in
1+0 records out
1000000 bytes (1.0 MB) copied, 0.00155357 s, 644 MB/s

real    0m0.003s
user    0m0.001s
sys     0m0.002s
[user@host tmp]$ ls -al test*
-rw-rw---- 1 user grp 1000000 Apr  8 15:51 test1
-rw-rw---- 1 user grp 1000000 Apr  8 15:51 test2

Wie Sie sehen, wirkt sich die Blockgröße massiv auf die Effizienz aus. Das ist vielleicht eine Seitenleiste des OP, aber ich denke, dass es immer noch relevant ist.

TL; DR: Führen Sie keinen willkürlichen Code aus, den Sie im Internet finden oder den Ihnen jemand gibt, dem Sie nicht vertrauen. Es wird deinen Tag ruinieren.

Tim S.
quelle
7
+1 für die Don't execute arbitrary code you find on the netLinie
Sergiy Kolodyazhnyy
7
"Beachten Sie, dass dieser Prozess extrem langwierig und / oder teuer ist und extrem spezielle Geräte erfordert." Hören Sie auf, diese Fehlinformationen zu verbreiten. Das letzte Mal, dass dies theoretisch überhaupt möglich war, war vor Jahrzehnten eine Technologie, die viele Generationen veraltet ist. Niemand hat jemals eine solche
Andrew Medico,
Ich habe diesen Abschnitt entfernt - es ist wohl eine Weile her, seit ich zum ersten Mal davon gehört habe. Ich werde jedoch sagen, dass "theoretisch" das maßgebliche Wort war, aber ich schweife ab.
Tim S.
2

Andere haben erklärt, was sie tun, also werde ich das überspringen.

Der Punkt bei ddder Verwendung von Separat bsund countArgument ist, dass gesteuert wird, bswie viel auf einmal geschrieben wird . Das Angeben sehr großer Werte für bserfordert einen sehr großen Puffer im Programm, und das Angeben von Werten, die kleiner als die Blockgröße des Geräts sind, ist langsam, da der Kernel einen gesamten Block erstellen muss, um auf das Gerät zu schreiben (in solchen Fällen ist dies möglich) Wahrscheinlich puffern Sie die Schreibvorgänge, bis ein vollständiger Block vorhanden ist. In anderen Fällen muss möglicherweise gelesen werden, was sich bereits auf der CD befindet. Da die beiden Befehle unterschiedliche Werte für verwenden bs, kann ich annehmen, dass Sie sie an zwei verschiedenen Standorten gefunden haben. Festplatten hatten früher eine Blockgröße von 512 Bytes, entsprechend derbs=512des letzteren Befehls, aber vor einigen (6-8, glaube ich) Jahren begannen sie damit, Disks mit einer Blockgröße von 4096 Bytes herzustellen, was bs=4096eine bessere Wahl für moderne Disks war.

Henrik - hör auf, Monica zu verletzen
quelle
1
Der Sweet Spot für bsist viel höher . Ein einzelner SATA-Befehl kann mehrere Sektoren lesen oder schreiben, sodass der Kernel E / A-Vorgänge zusammenführt, bevor er sie sendet. Ein Bereich von bs=64kbis bs=1024kist sinnvoll (die L3-Cache-Größe beträgt häufig 4 bis 8 MB). Ich benutze oft bs=128k, die Hälfte der L2-Cache-Größe auf modernen Intel-CPUs. ( ddEnthält zwei memcpy-Operationen: in der read(2)von der Quelle (auch wenn es / dev / zero ist) und in der write(2).IIRC, sddhatte die Option, Nullen zu schreiben, was ein bisschen CPU-Zeit spart. Wirklich nur relevant, wenn das Ziel etwas ist andere als eine Festplatte).
Peter Cordes
Sehen Sie sich die Ausgabe von iostat -x 4oder etwas an, und notieren Sie sich die Spalten rrqm / s (Leseanforderungen werden pro Sekunde zusammengeführt) und wrqm / s , um zu sehen , ob die E / A-Anforderung zusammengeführt wird.
Peter Cordes
1

WARNUNG: Dient dd if=/dev/zero of=/dev/ zum Reinigen eines Laufwerks oder Geräts vor dem forensischen Kopieren von Daten. Das Laufwerk oder Gerät muss immer bereinigt werden, bevor Informationen aus einem System kopiert werden, das einer forensischen Untersuchung unterzogen wird, um eine Kreuzkontamination zu vermeiden. Daher ist es kein schlechter Befehl, der Endbenutzer muss verstehen, wofür er verwendet wird, sonst werden seine Daten zerstört. Wenn Sie dies wünschen, überprüfen Sie die Null-Schreiboperation dd if=/dev/sda | hexdump -C | head.

Quelle: Ein praktischer Leitfaden für Computerforensik-Untersuchungen von Dr. Darren Hayes

SierraJuliet
quelle
1

Ich dd if=/dev/zero of=/dev/sdX oflag=syncteste die Qualität eines eingelegten USB-Laufwerks oder einer MicroSD-Karte, BEVOR ich sie tatsächlich mit gparted, fdisk oder dd mit einem Disk-Image verwende. Ich halte dies für eine umsichtige Idee, insbesondere bei MicroSD-Medien mit einer schlechten Qualität.

Seien Sie natürlich vorsichtig mit of = sdX, da es bei einem versehentlichen Löschen der Festplatte keine Vergebung gibt. Stellen Sie sicher, dass X = Laufwerksbuchstabe des beabsichtigten Ziels ist.

Richard
quelle