Как я могу сбросить всю системную память?


9

После запуска VirtualBox компьютер стал вялым, а затем полностью завис из-за OOM. Обычно OOM должен запускать процессы уничтожения, чтобы освободить место, но этого не произошло (это был второй раз, когда я испытывал это).

У меня была некоторая несохраненная важная работа в текстовом редакторе, поэтому я надеялся найти ее обратно в системной памяти после завершения всех процессов в текущей консоли с помощью SysRq+ K. Речь идет о ноутбуке с 8 ГБ ОЗУ под управлением Linux x86_64 3.7.5 с SSD в качестве целевого диска.

Моя первая попытка была dd if=/dev/mem of=memory, но это не удалось после чтения 1MiB данных. Затем я попытался dd if=/dev/fmem of=memory bs=1M, но это прекратилось после чтения 3010461696 байт (ровно 2871 МБ). Посмотрев /proc/mtrr(показано ниже), я решил попробовать добавить skip=4096. Это в конечном итоге замедлилось, чтение со скоростью всего 3 МБ / с, поэтому я прервал его (получив файл 5,8 ГБ). (по крайней мере последние 100 МБ файла содержат 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

Я не мог найти данные, которые у меня были открыты в течение нескольких часов, в текстовом редакторе, поэтому я считаю, что пропустил часть памяти при выполнении дампа. Итак, учитывая мою цель (восстановление данных из программ пользовательского пространства), какой самый эффективный способ вывести системную память в файл? Какие моменты нужно учитывать при выполнении такого дампа?


Вы тоже пробовали / proc / kmem? Это не стоит, потому что он меняется, пока вы копируете его.
ot--

@ ott-- CONFIG_DEVKMEMотключен, просматривая исходный код, он, кажется, разрешает неограниченный доступ, но я все еще не уверен, что это лучший способ сделать это (доступ к IO mem?)
Lekensteyn

2
Может быть, вы получили память редактора, но вы ее не узнали. Восстановление структур данных из дампа памяти может быть трудным. Первое, что вам нужно сделать, это восстановить отображение памяти из структур данных ядра (для этого, вероятно, существуют криминалистические инструменты), чтобы получить виртуальную память интересующего вас процесса (который, вероятно, будет распространяться вокруг множества непересекающихся страниц 4 КБ в физической памяти). Тогда текст может не находиться в одном последовательном двоичном объекте и может использовать UCS4 или другие представления и может хранить строки или другие блоки в отдельных фрагментах.
Жиль "ТАК - перестань быть злым"

1
@ Жиль +1, как только процесс будет завершен, я ожидаю, что ядро ​​освободит дескрипторы задач -> забудет все о своем отображении адресного пространства. Что касается представления данных, это легко может быть дерево (при достаточной удаче, выделенной JVM :)).
Петер

Итак, вы собираетесь копаться в гигабайтах данных в поисках нескольких килобайт текста, которых может даже не быть? Игла, встречай стог сена. За то время, которое вы потратили на это, вы могли бы просто перепечатать текст. Если в первую очередь было так много, то вам следует убедиться, что ваш текстовый редактор настроен на периодическое сохранение резервной копии, чтобы вы не потеряли много при ее сбое.
psusi

Ответы:


4

Проверить этот проект: foriana

Foriana is (FOrensic Ram Image ANAlyzer)

вход: дамп (физической) памяти; вывод: различная информация

Версия 1.0 может перечислять процессы и модули из дампа памяти ядер i386 / x86_64 / arm linux / bsd и предоставлять возможность чтения линейной памяти из дампов.

Есть модуль ядра fmem:

Fmem - драйвер ядра, который создает устройство / dev / fmem. / dev / fmem ведет себя так же, как / dev / mem (прямой доступ к физической памяти), но не имеет ограничений, которые имеет / dev / mem. Можно выгрузить всю физическую память через / dev / fmem.

Я использую его, компилировать довольно легко.


Аскер попробовал /dev/fmem.
Тобу

3

Возможно, вы захотите использовать ddrescueили аналогичную программу, которая может пропускать недоступные данные. dd conv=noerrorможет быть полезным Также проверьте этот вопрос на суперпользователя .

Что еще более важно, если вы попали в ситуацию с OOM, медлительность, скорее всего, была вызвана тем, что ядро ​​выгружало страницы из чего-либо еще, кроме запрашивающего приложения. Следовательно, если вы хотите, чтобы ваши данные, вместо свопа проверили /dev/mem- скорее всего, он там будет. Точно так же, если OOM Killer не включается и вы убиваете процессы вручную, однажды, например, ваш редактор будет убит в первую очередь, процесс, требующий памяти, может все же получить некоторое время для захвата этих страниц.

Как отметил Жиль в комментарии, данные могут легко находиться в какой-то особой структуре, поэтому вы не сможете их легко найти, даже если вам удастся восстановить сопоставления адресного пространства убитого процесса и у вас будет достаточно удачи, чтобы найти все необходимые данные. страницы все еще целы.


1
Я видел этот ответ SU прежде, вот как я нашел fmem. ddrescueне поможет мне, так как 256 страниц (1 МиБ) жестко ограничены. Я ожидал попасть в состояние OOM, но убийца OOM не включился ( pastebin.com/DvYTCcRK ). Неделю назад у меня была та же проблема (все еще Linux 3.7.5, я не перезагружался, только приостановлен для оперативной памяти). Там нет файла / раздела подкачки, так как у меня есть SSD. (swappiness = 60 (по умолчанию)).
Лекенстейн
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.