Löschen Sie die letzten 1 MB einer Festplatte

25

Gibt es einen einfachen Befehl, mit dem ich die letzten 1 MB einer Festplatte auf Null setzen kann?

Zum Start der Fahrt würde ich dd if=/dev/zero of=/dev/sdx bs=1M count=1. Die seekOption für dd sieht vielversprechend aus, aber hat jemand eine einfache Möglichkeit, genau zu bestimmen, wie weit ich suchen soll?

Ich habe eine Hardware-RAID-Appliance, die einen Teil der RAID-Konfiguration am Ende des Laufwerks speichert. Ich benötige die RAID-Appliance, um die Laufwerke als nicht konfiguriert zu betrachten. Daher möchte ich die RAID-Konfiguration entfernen, ohne die Zeit für einen vollständigen Löschvorgang der Laufwerke aufwenden zu müssen. Ich habe ein Dutzend 2-TB-Laufwerke, und das vollständige Löschen all dieser Laufwerke würde viel Zeit in Anspruch nehmen.

Zoredache
quelle

Antworten:

22

Der einfachste Weg unter Linux, die Größe der Festplatte zu ermitteln, ist mit blockdev --getsz:

sudo -s
dd bs=512 if=/dev/zero of=/dev/sdx count=2048 seek=$((`blockdev --getsz /dev/sdx` - 2048))
Psusi
quelle
Hervorragend, ich wusste, dass es ein Werkzeug geben musste, das die Größe problemlos erreichen konnte.
Zoredache
1
Obwohl mir die Lösung gefällt, ist die Verwendung eines sdaBeispiels fürchterlich gefährlich, wenn Sie kopieren und einfügen und es schaffen, den Wagenrücklauf zu kopieren. sdxwäre viel besser geeignet. Ich habe Vorsichtsmaßnahmen getroffen, aber nur deshalb habe ich meine Festplatte jetzt nicht zerstört.
emk2203
@ emk2203 Guter Punkt. Ich bin gespannt, welche Vorkehrungen treffen Sie für solche Szenarien?
Hashim
1
Ich benutze ein einfaches Anführungszeichen vor dem Einfügen. Wenn die Zeile einen Wagenrücklauf enthält, wird sie von der Shell-Eingabeaufforderung abgefangen, da das Ende des Angebots fehlt. Wenn alles in Ordnung ist, gehe ich mit Strg-A zum Zeilenanfang, lösche das Zitat und kehre zurück. Noch drei Tastenanschläge für die Versicherung, es lohnt sich.
emk2203
Sehen Sie sich statt / dev / sdx die Links in / dev / disk / by-id / an, z. B. nvme-SAMSUNG_MZVLW1TXXXX-000XX_XXXXXXXXX. ls -l / dev / disk / by-id / zeigt den Linknamen und das / dev / sdX an, zu dem er verlinkt.
rcpa0
6

Die Größe jeder Partition ist in verfügbar /proc/partitions. Der folgende Befehl zeigt die Größe von sdx(in kB-Einheiten):

awk '$4 == "sdx" {print $3}' </proc/partitions

Somit:

dd if=/dev/zero of=/dev/sdx bs=1k count=1024 \
   seek=$(($(awk '$4 == "sdx" {print $3}' </proc/partitions) - 1024))
Gilles 'SO - hör auf böse zu sein'
quelle
Was ist der Grund für die -1024 am Ende?
Hashim
1
@Hashim Die Frage lautet, wie die letzten 1 MB gelöscht werden sollen. Die letzten 1 MB beginnen 1024 KB vor dem Ende.
Gilles 'SO- hör auf böse zu sein'
3

Die Suche nach dem Ende des Laufwerks funktioniert sehr gut, dh:

seek = $ (( blockdev --getsz /dev/sda- 2048))

Wenn Sie dies jedoch verwenden, empfehle ich, dass Sie entweder wissen, dass Ihr Zählwert korrekt ist, oder dass Sie ihn überhaupt nicht verwenden. Der Grund, warum ich das sage, ist, dass Laufwerke entweder 512-Byte-Sektoren oder 4-KByte-Sektoren haben können. Wenn Sie diese Lösung mit einem Laufwerk verwenden, das 4-KByte-Sektoren enthält, werden Sie mit diesem Zählwert nicht zum Ende des Laufwerks gelangen. und möglicherweise fehlen die RAID-Informationen am Ende (ich bin darauf gestoßen).

J Akers
quelle
Könntest du irgendwie mitteilen, worauf du genau gestoßen bist? Ich bin fasziniert und frage mich, ob ich falsch verstanden habe, wie ddSektoren adressiert werden, wenn benutzerdefinierte bsWerte verwendet werden, die kleiner / größer sind als die tatsächliche Blockgröße, die von der Firmware des Geräts oder dem Linux-Kernel gemeldet wird.
Sjas
2

Mit können Sie die Anzahl der Sektoren auf der Festplatte ermitteln hdparm -v /dev/sdx. Versuchen Sie, eine Anzahl_von_Sektoren - 2048 (unter der Annahme von 512-Byte-Sektoren) zu ermitteln.


quelle
hdparm scheint praktisch zu sein, aber wie überprüfe ich die Sektorgröße?
Peter.O
1
/sys/block/sdx/queue/physical_block_sizeVielleicht geben Sie die Informationen, aber einige neuere Festplatten spielen mit der Sektorgröße, die sie melden, schnell und locker. Es ist wahrscheinlich besser, das Etikett auf der Festplatte zu lesen oder es im Datenblatt des Herstellers nachzuschlagen.
1
Danke .. Mir ist gerade aufgefallen, dass hdparm -I /dev/sda2 "Versionen" der Sektorgröße: Logicalund aufgelistet sind Physical. Ist es das, was du mit "schnell und locker" meinst? .... Ich habe nur das "Gefühl", dass, wenn sich etwas so verhält, es auch ein RAID-System sein könnte.
Peter.O
1
@red: Ich kann die Referenz jetzt nicht finden, aber ich habe irgendwo gelesen, dass einige Laufwerke mit 4096-Byte-Sektoren dem System melden, dass sie 512-Byte-Sektoren sind, und dann intern mit der Konvertierung umgehen.
1

Sie können dddie Gerätegröße verwenden und abrufen über fdisk:

dd if=/dev/zero of=/dev/sda bs=1k \
   seek=$(( (`fdisk -l /dev/sda | grep 'Disk /' | cut -d' ' -f 5` -1024*1024)/1024  )) count=1024

Ich verwende keine Blockgröße von 1 m, um Rundungsfehler zu vermeiden.

Alternativ können Sie ein kleines C-Programm (oder Skript) schreiben, das die lseekFunktion mit SEEK_ENDeinem negativen Offset von 1 MB aufruft und dann aufruft write.

maxschlepzig
quelle