Comment puis-je vider la mémoire système complète?


9

Après avoir démarré VirtualBox, l'ordinateur est devenu lent et s'est ensuite complètement bloqué en raison du MOO. Habituellement, le MOO devrait commencer à tuer des processus afin de libérer de l'espace, mais cela ne s'est pas produit (c'était la deuxième fois que j'expérimentais cela).

J'avais un travail important non enregistré dans un éditeur de texte, alors j'espérais le retrouver dans la RAM du système après avoir tué tous les processus de la console actuelle en utilisant SysRq+ K. La machine en question est un ordinateur portable avec 8 Go de RAM exécutant Linux x86_64 3.7.5 avec un SSD comme disque cible.

Ma première tentative a été dd if=/dev/mem of=memory, mais cela a échoué après avoir lu 1 Mo de données. Ensuite, j'ai essayé dd if=/dev/fmem of=memory bs=1M, mais cela s'est arrêté après avoir lu 3010461696 octets (exactement 2871 Mio). Après avoir regardé /proc/mtrr(illustré ci-dessous), j'ai décidé d'essayer d'ajouter skip=4096. Cela a finalement ralenti, lisant à une vitesse de seulement 3 Mio / sec, donc je l'ai interrompu (donnant un fichier de 5,8 Gio). (au moins les 100 derniers Mo du fichier contiennent 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

Je n'ai pas pu trouver les données que j'avais ouvertes pendant quelques heures dans l'éditeur de texte, donc je crois que j'ai sauté de la mémoire lors d'un vidage. Donc, étant donné mon objectif (récupération des données des programmes de l'espace utilisateur), quelle est la méthode la plus efficace pour vider la mémoire système dans un fichier? Quels sont les points à prendre en compte lors d'un tel vidage?


Avez-vous également essayé / proc / kmem? Cela ne vaut pas grand-chose car il change pendant que vous le copiez.
ott--

@ ott-- CONFIG_DEVKMEMest désactivé, en regardant dans le code source, il semble autoriser un accès illimité, mais je ne suis toujours pas convaincu que c'est la meilleure façon de le faire (accès mem IO?)
Lekensteyn

2
Vous avez peut-être eu la mémoire de l'éditeur mais vous ne l'avez pas reconnue. La reconstruction des structures de données à partir d'un vidage de mémoire peut être difficile. La première chose que vous devrez faire est de reconstruire le mappage de la mémoire à partir des structures de données du noyau (il existe probablement des outils médico-légaux pour cela) afin d'obtenir la mémoire virtuelle du processus qui vous intéresse (qui est susceptible d'être répartis sur de nombreuses pages disjointes de 4 Ko dans la mémoire physique). Ensuite, le texte peut ne pas être dans un blob consécutif et peut utiliser UCS4 ou d'autres représentations et peut stocker des lignes ou d'autres blocs dans des blocs séparés.
Gilles 'SO- arrête d'être méchant'

1
@Gilles +1, une fois le processus tué, je m'attendrais à ce que le noyau libère les descripteurs de tâches -> oubliez tout de son mappage d'espace d'adressage. Quant à la représentation des données, elle peut facilement être un arbre (avec assez de chance allouée par JVM :)).
peterph

Vous allez donc fouiller dans des gigaoctets de données à la recherche de quelques ko de texte qui ne sont peut-être même pas là? Aiguille, rencontrez une botte de foin. Pendant le temps que vous y avez consacré, vous auriez pu retaper le texte. S'il y en avait beaucoup en premier lieu, vous devez vous assurer que votre éditeur de texte est configuré pour enregistrer périodiquement une sauvegarde afin de ne pas perdre grand-chose en cas de panne.
psusi

Réponses:


4

Découvrez ce projet: foriana

Foriana est (FOrensic Ram Image ANAlyzer)

entrée: vidage de la mémoire RAM (physique): informations diverses

La version 1.0 peut répertorier les processus et les modules du vidage de mémoire des noyaux i386 / x86_64 / arm linux / bsd et fournir une option pour lire la mémoire linéaire à partir des vidages.

Il existe un module noyau fmem:

Fmem est le pilote du noyau, qui crée le périphérique / dev / fmem. / dev / fmem se comporte de la même manière que / dev / mem (accès direct à la mémoire physique), mais n'a pas de limites que / dev / mem. Il est possible de vider toute la mémoire physique via / dev / fmem.

Je l'ai utilisé, compiler assez facilement.


Le demandeur a essayé /dev/fmem.
Tobu

3

Vous voudrez peut-être utiliser ddrescueun programme similaire, qui peut ignorer les données inaccessibles. dd conv=noerrorpourrait aussi être utile. Vérifiez également cette question sur le superutilisateur .

Plus important encore, si vous vous retrouvez dans une situation de MOO, la lenteur est probablement due au fait que le noyau a échangé des pages depuis autre chose que l'application demandeuse. Par conséquent, si vous voulez vos données, vérifiez l'échange au lieu de /dev/mem- il y a de fortes chances qu'elles soient là. De même, si le tueur OOM ne se déclenche pas et que vous tuez les processus à la main, une fois que votre éditeur est tué en premier, le processus gourmand en mémoire peut encore avoir le temps de récupérer ces pages.

Comme mentionné par Gilles en commentaire, les données peuvent facilement être dans une structure spéciale, donc vous ne pourrez pas les trouver aussi facilement même si vous parvenez à reconstruire les mappages de l'espace d'adressage du processus tué et que vous avez assez de chance pour trouver tous les éléments nécessaires pages encore intactes.


1
J'ai déjà vu cette réponse SU, c'est ainsi que j'ai trouvé fmem. ddrescuene va pas m'aider puisque 256 pages (1 Mio) est une limite codée en dur. Je m'attendrais à entrer dans une condition OOM, mais le tueur OOM ne s'est pas déclenché ( pastebin.com/DvYTCcRK ). Il y a une semaine, j'ai eu le même problème (toujours Linux 3.7.5, je n'ai pas redémarré, seulement suspendu pour ramer). Il n'y a pas de fichier / partition d'échange car j'ai un SSD. (swappiness = 60 (par défaut)).
Lekensteyn
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.