Jak mogę zrzucić całą pamięć systemową?

9

Po uruchomieniu VirtualBox komputer stał się powolny, a następnie zawiesił się całkowicie z powodu OOM. Zwykle OOM powinien rozpocząć proces zabijania, aby zwolnić miejsce, ale tak się nie stało (po raz drugi tego doświadczyłem).

Miałem trochę niezapisanej ważnej pracy w edytorze tekstu, więc miałem nadzieję, że znajdę ją z powrotem w systemowej pamięci RAM po zabiciu wszystkich procesów w bieżącej konsoli za pomocą SysRq+ K. Wspomnianym komputerem jest laptop z 8 GiB RAM z systemem Linux x86_64 3.7.5 z dyskiem SSD jako dyskiem docelowym.

Moja pierwsza próba była dd if=/dev/mem of=memory, ale nie powiodło się po odczytaniu 1 MB danych. Następnie próbowałem dd if=/dev/fmem of=memory bs=1M, ale zatrzymało się to po odczytaniu 3010461696 bajtów (dokładnie 2871 MiB). Po zapoznaniu się z /proc/mtrr(pokazanym poniżej) postanowiłem spróbować dodać skip=4096. To ostatecznie zwolniło, czytając z prędkością zaledwie 3 MiB / s, więc przerwałem (dając plik 5,8 GiB). (przynajmniej ostatnie 100 MiB pliku zawiera 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

Nie mogłem znaleźć danych, które miałem otwarte przez kilka godzin w edytorze tekstu, więc uważam, że pominąłem trochę pamięci podczas zrzutu. Biorąc pod uwagę mój cel (odzyskiwanie danych z programów przestrzeni użytkownika), jaka jest najbardziej efektywna metoda zrzucenia pamięci systemowej do pliku? Jakie punkty należy wziąć pod uwagę podczas takiego zrzutu?

Lekensteyn
źródło
Czy próbowałeś / proc / kmem też? Nie jest to wiele warte, ponieważ zmienia się podczas kopiowania.
ott--
@ ott-- CONFIG_DEVKMEMjest wyłączony, patrząc w kodzie źródłowym wydaje się, że pozwala na nieograniczony dostęp, ale nadal nie jestem przekonany, że to najlepszy sposób, aby to zrobić (dostęp do
memu
2
Może dostałeś pamięć edytora, ale go nie rozpoznałeś. Rekonstrukcja struktur danych ze zrzutu pamięci może być trudna. Pierwszą rzeczą, którą musisz zrobić, to zrekonstruować mapowanie pamięci ze struktur danych jądra (prawdopodobnie istnieją do tego narzędzia kryminalistyczne), aby uzyskać wirtualną pamięć procesu, który Cię interesuje (co prawdopodobnie będzie rozłożone na wielu rozłącznych stronach 4kB w pamięci fizycznej). Wówczas tekst nie może znajdować się w jednym kolejnym obiekcie blob i może używać UCS4 lub innych reprezentacji oraz może przechowywać wiersze lub inne bloki w osobnych porcjach.
Gilles „SO- przestań być zły”
1
@Gilles +1, gdy proces zostanie zabity, spodziewam się, że jądro zwolni deskryptory zadań -> zapomnę o mapowaniu przestrzeni adresowej. Jeśli chodzi o reprezentację danych, może to być drzewo (przy odrobinie szczęścia przydzielonej przez JVM :)).
peterph
Więc zamierzasz przeszukać gigabajty danych w poszukiwaniu kilku kilobajtów tekstu, których może nawet nie być? Igła, spotkaj stogu siana. W czasie, który spędziłeś na tym, mogłeś po prostu przepisać tekst. Jeśli w ogóle było tego tyle, powinieneś upewnić się, że edytor tekstowy jest skonfigurowany do okresowego zapisywania kopii zapasowej, abyś nie stracił dużo, jeśli się zawiesi.
psusi

Odpowiedzi:

4

Sprawdź ten projekt: foriana

Foriana is (FOrensic Ram Image ANAlyzer)

input: zrzut (fizycznej) pamięci RAM: różne informacje

Wersja 1.0 może wyświetlać procesy i moduły ze zrzutu pamięci jąder i386 / x86_64 / arm linux / bsd oraz zapewnia opcję odczytu pamięci liniowej ze zrzutów.

Istnieje moduł jądra fmem:

Fmem to sterownik jądra, który tworzy urządzenie / dev / fmem. / dev / fmem zachowują się w taki sam sposób jak / dev / mem (bezpośredni dostęp do pamięci fizycznej), ale nie mają ograniczeń, które mają / dev / mem. Możliwe jest zrzucenie całej pamięci fizycznej przez / dev / fmem.

Korzystam z niego, kompilacja jest dość łatwa.

stackterminator
źródło
Pytający próbował /dev/fmem.
Tobu
3

Możesz użyć ddrescuelub podobnego programu, który może pominąć niedostępne dane. dd conv=noerrorteż może być pomocny. Sprawdź również to pytanie na superużytkowniku .

Co ważniejsze, jeśli wpadłeś w sytuację OOM, powolność była najprawdopodobniej spowodowana wymianą stron przez jądro z niczego innego niż aplikacja żądająca. Dlatego jeśli chcesz swoje dane, sprawdź swap zamiast /dev/mem- są szanse, że tam będzie. Podobnie, jeśli zabójca OOM nie uruchomi się i zabijesz procesy ręcznie, np. Gdy twój edytor zostanie zabity jako pierwszy, proces głodowania pamięci może się jeszcze zdarzyć, aby uzyskać trochę czasu na przechwycenie tych stron.

Jak wspomniano przez Gilles w komentarzu, dane mogą łatwo być w jakiejś specjalnej strukturze, dzięki czemu nie będą mogli znaleźć je tak łatwo, nawet jeśli uda się zrekonstruować przestrzeń adresowa mapowania zabity procesowego i mają wystarczająco dużo szczęścia, aby znaleźć wszystkie potrzebne strony wciąż nienaruszone.

Peter
źródło
1
Widziałem już tę odpowiedź SU, tak znalazłem fmem. ddrescuenie pomoże mi, ponieważ 256 stron (1 MiB) jest ustalonym limitem. Oczekiwałbym, że dostanę się do stanu OOM, ale zabójca OOM nie uruchomił się ( pastebin.com/DvYTCcRK ). Tydzień temu miałem ten sam problem (wciąż Linux 3.7.5, nie uruchomiłem się ponownie, tylko zawiesiłem na ram). Nie ma pliku wymiany / partycji, ponieważ mam dysk SSD. (swappiness = 60 (domyślnie)).
Lekensteyn