Wie kann ich den gesamten Systemspeicher sichern?

9

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/mtrrich 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 FFs)

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?

Lekensteyn
quelle
Haben Sie auch / proc / kmem ausprobiert? Es ist nicht viel wert, weil es sich ändert, während Sie es kopieren.
ott--
@ ott-- CONFIG_DEVKMEMist 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?)
Lekensteyn
2
Vielleicht haben Sie die Erinnerung an den Editor erhalten, aber Sie haben sie nicht erkannt. Das Rekonstruieren von Datenstrukturen aus einem Speicherauszug kann schwierig sein. Das erste, was Sie tun müssen, ist die Speicherzuordnung aus den Kerneldatenstrukturen zu rekonstruieren (es gibt wahrscheinlich vorhandene forensische Tools dafür), um den virtuellen Speicher des Prozesses zu erhalten, an dem Sie interessiert sind (was wahrscheinlich der Fall ist) verteilt auf viele disjunkte 4-KB-Seiten im physischen Speicher). Dann befindet sich der Text möglicherweise nicht in einem aufeinanderfolgenden Blob und verwendet möglicherweise UCS4 oder andere Darstellungen und kann Zeilen oder andere Blöcke in separaten Blöcken speichern.
Gilles 'SO - hör auf böse zu sein'
1
@ Gilles +1, sobald der Prozess beendet ist, würde ich erwarten, dass der Kernel die Task-Deskriptoren freigibt -> alles über seine Adressraum-Zuordnung vergessen. Die Datendarstellung kann leicht ein Baum sein (mit genügend Glück von JVM :)).
Peterph
Sie werden also Gigabyte an Daten durchsuchen und nach ein paar KB Text suchen, der möglicherweise nicht einmal vorhanden ist? Nadel, Heuhaufen treffen. In der Zeit, die Sie dafür aufgewendet haben, hätten Sie den Text einfach erneut eingeben können. Wenn es an erster Stelle so viel gab, sollten Sie sicherstellen, dass Ihr Texteditor so konfiguriert ist, dass ein Backup regelmäßig gespeichert wird, damit Sie nicht viel verlieren, wenn es abstürzt.
Psusi

Antworten:

4

Überprüfen Sie dieses Projekt: foriana

Foriana ist (FOrensic Ram Image ANAlyzer)

Eingabe: Speicherauszug der (physischen) RAM-Ausgabe: verschiedene Informationen

Version 1.0 kann Prozesse und Module aus dem Speicherauszug von i386 / x86_64 / arm linux / bsd-Kerneln auflisten und bietet die Möglichkeit, linearen Speicher aus Speicherauszügen zu lesen.

Es gibt ein Kernelmodul fmem:

Fmem ist ein Kerneltreiber, der ein / dev / fmem-Gerät erstellt. / dev / fmem verhält sich genauso wie / dev / mem (direkter Zugriff auf den physischen Speicher), hat jedoch keine Einschränkungen für / dev / mem. Es ist möglich, den gesamten physischen Speicher über / dev / fmem zu sichern.

Ich habe es benutzt, kompiliere ziemlich einfach.

Stackterminator
quelle
Der Fragesteller hat es versucht /dev/fmem.
Tobu
3

Möglicherweise möchten Sie ein ddrescueähnliches Programm verwenden, mit dem unzugängliche Daten übersprungen werden können. dd conv=noerrorkö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.

Peterph
quelle
1
Ich habe diese SU-Antwort schon einmal gesehen, so habe ich fmem gefunden. ddrescuewird 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)).
Lekensteyn