Falscher DD-Befehl auf dem Hauptlaufwerk – Wie kann ich die Daten wiederherstellen?

Falscher DD-Befehl auf dem Hauptlaufwerk – Wie kann ich die Daten wiederherstellen?

Okay, etwas ärgerlich Dummes ist passiert. Ich wollte eine Arch Linux ISO-Datei auf meinen USB-Stick kopieren, war aber in Eile und habe versehentlich mein Hauptlaufwerk als Parameter eingegeben of.

Hier sind die Details:

$ sudo dd bs=4MB if=archlinux-2017.08.01-x86_64.iso of=/dev/nvme1n1

/dev/nvme1n1gewesen sein sollte /dev/sdb.

Mein Hauptlaufwerk /dev/nvme1n1enthielt zwei Partitionen:

  • Eine 512 MB große EFI-Bootpartition
  • Eine ext4-Partition, die den Rest des 1-TB-Laufwerks umfasst

Die Dateigröße beträgt archlinux-2017.08.01-x86_64.iso541065216 Bytes, oder516 MB

Der Computer läuft noch und scheint einwandfrei zu funktionieren, und ich habe die Ausgabe von lsblkunddf -h VorAusführen des ddBefehls. Die Ausgabe istgenausowie wenn ich die Befehle jetzt ausführe. Ich nehme an, weil die Daten zwischengespeichert sind:

$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
nvme1n1     259:5    0 931.5G  0 disk 
├─nvme1n1p1 259:6    0   512M  0 part /boot
└─nvme1n1p2 259:7    0   931G  0 part /

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/nvme1n1p2  916G   22G  848G   3% /
/dev/nvme1n1p1  511M   36M  476M   7% /boot

ls /bootdruckt zwar immer noch den Verzeichnisinhalt (wahrscheinlich zwischengespeicherte Informationen), aber der Dateiinhalt ist beschädigt und wird ausgeführt ls /boot/EFIoder ls /boot/loaderfüllt den Bildschirm mit zufälligen Zeichen, darunter vielen Input/output error.

Hier sind weitere Informationen:

$ cat /proc/partitions
major minor  #blocks  name

 259        5  976762584 nvme1n1
 259        6     524288 nvme1n1p1
 259        7  976237255 nvme1n1p2

$ sudo fdisk -l /dev/nvme1n1
Disk /dev/nvme1n1: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x282bad86

Device         Boot Start     End Sectors  Size Id Type
/dev/nvme1n1p1 *        0 1056767 1056768  516M  0 Empty
/dev/nvme1n1p2        164  131235  131072   64M ef EFI (FAT-12/16/32)

Wenn man sich die Ausgabe von ansieht fdisk, ist es ziemlich klar, dass die Partitionstabelle (und wahrscheinlich alle Daten auf der Boot-Partition) zerstört wurde. Es sollte sich um einen gptDisklabel-Typ handeln, und die Partitionsgrößen/-typen sind falsch. Leider wurden aufgrund der ISO-Dateigröße (516 MB) auch die ersten 4 MB meiner Root-Partition überschrieben.

Eine etwas andere Ausgabe von gdisk:

$ sudo gdisk /dev/nvme1n1

# selected GPT when asked "Found valid MBR and GPT. Which do you want to use?"

Command (? for help): p
Disk /dev/nvme1n1: 1953525168 sectors, 931.5 GiB
Model: Samsung SSD 960 EVO 1TB                 
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): <guid>
Partition table holds up to 248 entries
Main partition table begins at sector 2 and ends at sector 63
First usable sector is 64, last usable sector is 1056704
Partitions will be aligned on 8-sector boundaries
Total free space is 1 sectors (512 bytes)

Number  Start (sector)    End (sector)  Size       Code  Name
   2             164          131235   64.0 MiB    0700  ISOHybrid1

Ein paar verwandte Fragen, die ich gefunden habe:

Ich habe das testdiskDienstprogramm bereits installiert, es sieht vielversprechend aus, aber ich möchte sicherstellen, dass ich die richtigen Schritte ausführewährend der Computer noch läuft. Wenn ich es jetzt herunterfahre, bootet es nicht mehr, also hier die Fragen:

  • Wie kann man diese Situation am besten überwinden?
  • Wie stelle ich die Partitionstabelle in der vorherigen Form wieder her und wie erstelle ich die /boot-Partition neu? Ich verwende Arch Linux mit dem neuesten Kernel.
  • Gibt es eine Möglichkeit herauszufinden, was in den ersten 4 MB meiner Root-Partition enthalten war (und zerstört wurde?)?

dumpe2fsBEARBEITEN: Basierend auf dem Vorschlag von @WumpusQ.Wumbley, den Befehl auszuführen, füge ich hier weitere Informationen und Details hinzu .

Die grundlegende Ausgabe (erste 50 Zeilen) von dumpe2fs:https://pastebin.com/fBuFRQfE

Für mich sieht es ziemlich normal aus, sogar die magische Zahl des Dateisystems ( 0xEF53) ist korrekt.

Darauf folgt Group 0:

Group 0: (Blocks 0-32767) csum 0x9569 [ITABLE_ZEROED]
  Primary superblock at 0, Group descriptors at 1-117
  Reserved GDT blocks at 118-1141
  Block bitmap at 1142 (+1142)
  Inode bitmap at 1158 (+1158)
  Inode table at 1174-1685 (+1174)
  21349 free blocks, 8177 free inodes, 2 directories, 8177 unused inodes
  Free blocks: 11419-32767
  Free inodes: 16-8192

Darauf folgen dann JEDE MENGE Gruppen, die sagen: „ [...]8192 free inodes, 0 directories, 8192 unused inodes [...]Die erste Gruppe, die tatsächlich einige Verzeichnisse meldet, kommt erst Group 3648ungefähr 25.000 Zeilen später:“

Group 3648: (Blocks 119537664-119570431) csum 0xa9ea [ITABLE_ZEROED]
  Block bitmap at 119537664 (+0)
  Inode bitmap at 119537680 (+16)
  Inode table at 119537696-119538207 (+32)
  23930 free blocks, 1670 free inodes, 614 directories, 1670 unused inodes
  Free blocks: 119546502-119570431
  Free inodes: 29890939-29892608

Es gibt im gesamten Dateisystem viele Backup-Superblöcke:

$ sudo dumpe2fs /dev/nvme1n1p2 | grep -i superblock | wc -l
dumpe2fs 1.43.5 (04-Aug-2017)
19

Antwort1

Ich gehe davon aus, dass die Partitionstabelle und die Bootpartition problemlos neu erstellt werden können, daher werde ich mich auf die ext4-Partition konzentrieren.

Das Layout des Dateisystems hängt in gewissem Maße von den bei seiner Erstellung verwendeten Optionen ab. Ich beschreibe den allgemeinen Fall. Sie können sehen, ob dies Ihrem entspricht, indem Sie es dumpe2fsauf dem Gerät ausführen (wodurch hoffentlich alle Metadaten der obersten Ebene im Cache gefunden werden, anstatt von der Festplatte zu lesen).

Die normale Blockgröße für ext4-Dateisysteme beträgt 4096 Bytes, Sie haben also 1024 Blöcke verloren.

Als erstes wurde Block 0 überschrieben, der primäre Superblock. Das ist an sich kein Problem, da es Backup-Superblöcke gibt. Danach folgt die Gruppendeskriptortabelle, die ebenfalls Backups innerhalb des Dateisystems enthält.

Dann gibt es Block-Bitmaps und Inode-Bitmaps. Hier werden die Neuigkeiten etwas schlechter. Wenn sich eines davon unterhalb von Block 1024 befindet, was wahrscheinlich der Fall ist, haben Sie Informationen darüber verloren, welche Inodes und Blöcke verwendet werden. Diese Informationen sind redundant und werden von fsck basierend auf dem, was es beim Durchsuchen aller Verzeichnisse und Inodes findet, rekonstruiert, sofern diese intakt sind.

Als nächstes kommt jedoch die Inode-Tabelle, und hier haben Sie wahrscheinlich viele Inodes verloren, darunter das Stammverzeichnis, das Journal und andere spezielle Inodes. Es wäre schön, diese wieder zu haben. Offensichtlich ist zumindest das Stammverzeichnis noch funktionsfähig, sonst würden fast alle Befehle, die Sie ausführen möchten, bereits fehlschlagen.

Wenn Sie dd if=/dev/nvme1n1p2 of=/some/external/device bs=4096 count=1024jetzt ein ausführen, erhalten Sie eine Sicherungskopie von dem, was sich derzeit in Ihrem Cache befindet, gemischt mit den fehlerhaften Daten für die Blöcke, die nicht zwischengespeichert sind. Nach dem Booten einer Rettungsdiskette können Sie dasselbe ddin umgekehrter Reihenfolge tun, um die teilweise guten Daten wieder auf die Festplatte zu übertragen und die komplett fehlerhaften Daten zu überschreiben, die sich jetzt dort befinden.

Danach stellen Sie möglicherweise fest, dass automatisierte Wiederherstellungstools ( fsck, testdisk) gut genug funktionieren. Wenn nicht, haben Sie eine Karte, die Sie zur manuellen Wiederherstellung verwenden können. Mithilfe der „Free Block“-Listen von dumpe2fswissen Sie, welche Blöcke Sie ignorieren müssen.

Das meiste, was Sie verloren haben, sind wahrscheinlich Inodes. Es ist eigentlich ziemlich wahrscheinlich, dass Sie keine Datei hattenInhaltin den ersten 4 MB der Festplatte. (Ich habe es mkfs.ext4ohne Optionen auf einer 1 TB großen Bilddatei ausgeführt und der erste Block ohne Metadaten stellte sich als Block 9249 heraus)

Jeder Inode, den Sie wiederherstellen können, identifiziert die Datenblöcke einer ganzen Datei. Und diese Datenblöcke können überall auf der Festplatte verteilt sein, nicht unbedingt in der Nähe.

Tag 2

Der auf Pastebin gepostete Dump enthüllt großartige Neuigkeiten:

Group 0: (Blocks 0-32767) csum 0x9569 [ITABLE_ZEROED]
  Primary superblock at 0, Group descriptors at 1-117
  Reserved GDT blocks at 118-1141
  Block bitmap at 1142 (+1142)
  Inode bitmap at 1158 (+1158)
  Inode table at 1174-1685 (+1174)
  21349 free blocks, 8177 free inodes, 2 directories, 8177 unused inodes
  Free blocks: 11419-32767
  Free inodes: 16-8192

Da wir denken, dass nur 4 MB am Anfang des Dateisystems überschrieben wurden, müssen wir uns nur um die Blöcke 0-1023 kümmern. Und die reservierten GDT-Blöcke reichen bis Block 1141! Dies ist die Art von Schaden, die durch einen einfachen e2fsck -b $backup_superblock_number(nach einem Neustart) repariert werden sollte. Sie könnten das zumindest mit versuchen, -num zu sehen, was es denkt.

Antwort2

Wenn die Festplatte GPT verwendet, sollte die Partitionstabelle mithilfe der GPT-Backup-Daten am Ende der Festplatte wiederherstellbar sein. Sie können dies mit tun gdisk; siehedie gdiskDokumentation zur Datenrettungfür Details. Kurz gesagt: Wenn Sie gdiskdie Festplatte starten, wirdwahrscheinlichden Schaden bemerken und Sie fragen, ob Sie die gesicherten GPT-Daten oder die MBR-Daten verwenden möchten. Wenn Sie die GPT-Option wählen und dann die Änderungen schreiben, wird die Partitionstabelle repariert. Wenn gdisknicht gefragt wird, welche Partitionstabelle verwendet werden soll, können Sie die Sicherungstabelle möglicherweise trotzdem mit der cOption im Wiederherstellungs- und Transformationsmenü laden.

Wenn dies fehlschlägt, können Sie die Partitionstabelle (oder zumindest die Start- und Endpunkte der Partitionen) immer noch neu erstellen, indem Sie die Daten in /sys/block/nvme1n1/nvme1n1p1/startund /sys/block/nvme1n1/nvme1n1p1/sizeDateien verwenden (und ebenso für /dev/nvme1n1p2). Wenn Sie jedoch auf diese Daten zurückgreifen, ist es unbedingt erforderlich, dass SieNICHTFahren Sie den Computer herunter, entgegen dem Rat von hek2mgl. Allerdings hat hek2mgl nicht unrecht, wenn er sagt, dass die weitere Verwendung der Festplatte in ihrem aktuellen Zustand das Risiko birgt, die Situation zu verschlimmern. Insgesamt würde ich sagen, dass der beste Kompromiss darin besteht, zu versuchen, das Partitionstabellenproblem so schnell wie möglich zu beheben und dann herunterzufahren und das Dateisystemproblem von einer Notfalldiskette aus zu beheben.

Leider ist Ihr ESP hinüber. Angesichts Ihres Festplattenlayouts gehe ich davon aus, dass Sie das ESP unter gemountet /bootund Ihre Kernel dort gespeichert haben. Daher müssen Sie Ihre Kernelpakete mithilfe von chrootoder auf andere Weise neu installieren. Das Gleiche gilt für Ihren Bootloader oder Bootmanager.

Antwort3

  1. Den Computer herunterfahren (sofort)
  2. Booten Sie es mit einem Rettungssystem.
  3. Führen Sie den Vorgang aus testdisk, um zu versuchen, Ihre Daten wiederherzustellen. (Wenn Sie über genügend Speicherplatz verfügen, erstellen Sie ein Image vom Gerät ddund führen Sie testdiskes aus.)

Warum sollten Sie den Computer sofort herunterfahren? Wenn eine neue Datei erstellt wird (wahrscheinlich etwas in /run) oder angehängt wird (/var/log/...), muss das Dateisystem die vorhandenen (schlechten!) Informationen prüfen, um zu entscheiden, wo die Daten gespeichert werden. Wenn diese Entscheidung auf der Grundlage schlechter Informationen getroffen wird, besteht ein hohes Risiko, dass vorhandene Datenblöcke überschrieben werden. Dadurch sind sie für immer verloren. Sogar für Tools wie testdiskund photorec.

verwandte Informationen