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 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
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?
la source
CONFIG_DEVKMEM
est 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?)Réponses:
Découvrez ce projet: foriana
Il existe un module noyau fmem:
Je l'ai utilisé, compiler assez facilement.
la source
/dev/fmem
.Vous voudrez peut-être utiliser
ddrescue
un programme similaire, qui peut ignorer les données inaccessibles.dd conv=noerror
pourrait 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.
la source
ddrescue
ne 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)).