Nach dem Start von VirtualBox wurde der Computer träge und blieb aufgrund von OOM vollständig hängen. Normalerweise sollte OOM damit beginnen, Prozesse zu beenden, um Speicherplatz freizugeben, aber dies ist nicht geschehen (dies war das zweite Mal, dass ich dies erlebte).
Ich hatte einige nicht gespeicherte wichtige Arbeiten in einem Texteditor, also hoffte ich, sie wieder im System-RAM zu finden, nachdem ich alle Prozesse in der aktuellen Konsole mit SysRq+ beendet hatte K. Bei dem fraglichen Computer handelt es sich um einen Laptop mit 8 GB RAM unter Linux x86_64 3.7.5 mit einer SSD als Zielfestplatte.
Mein erster Versuch war dd if=/dev/mem of=memory
, aber dies schlug fehl, nachdem ich 1 MB Daten gelesen hatte. Als nächstes habe ich es versucht dd if=/dev/fmem of=memory bs=1M
, aber dies hörte auf, nachdem ich 3010461696 Bytes (genau 2871 MiB) gelesen hatte. Nachdem /proc/mtrr
ich mir (siehe unten) angesehen hatte, beschloss ich, es hinzuzufügen skip=4096
. Dies verlangsamte sich schließlich und las mit einer Geschwindigkeit von nur 3 MiB / s, so dass ich es unterbrach (was eine Datei von 5,8 GiB ergab). (mindestens die letzten 100 MiB der Datei enthalten FF
s)
reg01: base=0x000000000 ( 0MB), size= 2048MB, count=1: write-back
reg02: base=0x080000000 ( 2048MB), size= 1024MB, count=1: write-back
reg03: base=0x100000000 ( 4096MB), size= 4096MB, count=1: write-back
reg04: base=0x200000000 ( 8192MB), size= 1024MB, count=1: write-back
reg05: base=0x23c000000 ( 9152MB), size= 64MB, count=1: uncachable
reg06: base=0x0b4000000 ( 2880MB), size= 64MB, count=1: uncachable
reg07: base=0x0b8000000 ( 2944MB), size= 128MB, count=1: uncachable
Ich konnte die Daten, die ich einige Stunden lang geöffnet hatte, nicht im Texteditor finden, daher glaube ich, dass ich beim Ausführen eines Speicherauszugs etwas Speicher übersprungen habe. Was ist angesichts meines Ziels (Wiederherstellung von Daten aus Userspace-Programmen) die effizienteste Methode, um den Systemspeicher in eine Datei zu kopieren? Was sind einige Punkte, die bei einem solchen Dump berücksichtigt werden müssen?
quelle
CONFIG_DEVKMEM
ist deaktiviert, im Quellcode scheint es uneingeschränkten Zugriff zu erlauben, aber ich bin immer noch nicht davon überzeugt, dass dies der beste Weg ist (IO-Mem-Zugriff?)Antworten:
Überprüfen Sie dieses Projekt: foriana
Es gibt ein Kernelmodul fmem:
Ich habe es benutzt, kompiliere ziemlich einfach.
quelle
/dev/fmem
.Möglicherweise möchten Sie ein
ddrescue
ähnliches Programm verwenden, mit dem unzugängliche Daten übersprungen werden können.dd conv=noerror
könnte auch hilfreich sein. Überprüfen Sie diese Frage auch auf Superuser .Noch wichtiger ist jedoch, dass, wenn Sie sich in eine OOM-Situation geraten, die Trägheit sehr wahrscheinlich dadurch verursacht wurde, dass der Kernel Seiten von etwas anderem als der anfordernden Anwendung austauscht. Wenn Sie also Ihre Daten haben möchten, überprüfen Sie den Swap anstelle von
/dev/mem
- wahrscheinlich ist er dort. Wenn der OOM-Killer nicht einschaltet und Sie Prozesse von Hand beenden, kann es vorkommen, dass der speicherhungrige Prozess nach dem Abschalten Ihres Editors noch einige Zeit benötigt, um diese Seiten abzurufen.Wie von Gilles im Kommentar erwähnt, können die Daten leicht in einer speziellen Struktur vorliegen, sodass Sie sie nicht so leicht finden können, selbst wenn Sie es schaffen, die Adressraumzuordnungen des getöteten Prozesses zu rekonstruieren und genug Glück haben, um alle benötigten zu finden Seiten noch intakt.
quelle
ddrescue
wird mir nicht helfen, da 256 Seiten (1 MiB) ein fest codiertes Limit sind. Ich würde erwarten, in einen OOM-Zustand zu geraten, aber der OOM-Killer trat nicht ein ( pastebin.com/DvYTCcRK ). Vor einer Woche hatte ich das gleiche Problem (immer noch Linux 3.7.5, ich habe nicht neu gestartet, nur zum RAM ausgesetzt). Es gibt keine Auslagerungsdatei / Partition, da ich eine SSD habe. (Swappiness = 60 (Standard)).