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/nvme1n1
gewesen sein sollte /dev/sdb
.
Mein Hauptlaufwerk /dev/nvme1n1
enthielt 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.iso
541065216 Bytes, oder516 MB
Der Computer läuft noch und scheint einwandfrei zu funktionieren, und ich habe die Ausgabe von lsblk
unddf -h
VorAusführen des dd
Befehls. 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 /boot
druckt zwar immer noch den Verzeichnisinhalt (wahrscheinlich zwischengespeicherte Informationen), aber der Dateiinhalt ist beschädigt und wird ausgeführt ls /boot/EFI
oder ls /boot/loader
fü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 gpt
Disklabel-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:
- https://askubuntu.com/questions/94421/gibt es eine Möglichkeit, Dateien von einem Speichergerät wiederherzustellen, das teilweise überschrieben ist?
- Habe versehentlich die falsche Festplatte mit dd überschrieben. Wie kann ich das Problem wiederherstellen?
Ich habe das testdisk
Dienstprogramm 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?)?
dumpe2fs
BEARBEITEN: 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 3648
ungefä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 dumpe2fs
auf 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=1024
jetzt 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 dd
in 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 dumpe2fs
wissen 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.ext4
ohne 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, -n
um 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 gdisk
Dokumentation zur Datenrettungfür Details. Kurz gesagt: Wenn Sie gdisk
die 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 gdisk
nicht gefragt wird, welche Partitionstabelle verwendet werden soll, können Sie die Sicherungstabelle möglicherweise trotzdem mit der c
Option 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/start
und /sys/block/nvme1n1/nvme1n1p1/size
Dateien 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 /boot
und Ihre Kernel dort gespeichert haben. Daher müssen Sie Ihre Kernelpakete mithilfe von chroot
oder auf andere Weise neu installieren. Das Gleiche gilt für Ihren Bootloader oder Bootmanager.
Antwort3
- Den Computer herunterfahren (sofort)
- Booten Sie es mit einem Rettungssystem.
- 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ätdd
und führen Sietestdisk
es 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 testdisk
und photorec
.