Як я можу скинути повну системну пам'ять?


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? Це не сильно, оскільки воно змінюється, коли ви копіюєте це тхо.
ott--

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

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

1
@Gilles +1, як тільки процес буде вбитий, я б очікував, що ядро ​​звільнить дескриптори завдань -> забуде все про відображення адресного простору. Що стосується подання даних, то це може бути легко дерево (при цьому достатньо удачі, виділеної JVM :)).
петерф

Тож ви збираєтесь копати гігабайти даних, шукаючи кілька кбіт тексту, якого може навіть не бути там? Голка, зустрінь сіно. За час, який ви витратили на це, ви могли просто ввести текст. Якщо в першу чергу було стільки, то слід переконатися, що ваш текстовий редактор налаштований періодично зберігати резервну копію, щоб не втратити багато, якщо вона вийде з ладу.
psusi

Відповіді:


4

Перевірте цей проект: foriana

Foriana є (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 не забиває, і ви вбиваєте процеси вручну, коли, наприклад, ваш редактор загине спочатку, процес голодного пам’яті все одно може отримати деякий час, щоб захопити ці сторінки.

Як зазначає Жил у коментарі, дані можуть легко знаходитися в якійсь спеціальній структурі, тому ви не зможете їх легко знайти, навіть якщо вам вдасться реконструювати відображення адресного простору вбитого процесу та матимете достатньо удачі знайти все необхідне сторінки все ще недоторкані.


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