Bagaimana saya bisa membuang memori sistem penuh?

9

Setelah memulai VirtualBox, komputer menjadi lamban dan kemudian digantung sepenuhnya karena OOM. Biasanya, OOM harus memulai proses pembunuhan untuk membebaskan beberapa ruang, tetapi ini tidak terjadi (ini adalah kedua kalinya saya mengalami ini).

Saya memiliki beberapa pekerjaan penting yang belum disimpan dalam editor teks, jadi saya berharap untuk menemukannya kembali di sistem RAM setelah membunuh semua proses di konsol saat ini menggunakan SysRq+ K. Mesin yang dimaksud adalah laptop dengan 8 GiB RAM yang menjalankan Linux x86_64 3.7.5 dengan SSD sebagai disk target.

Upaya pertama saya adalah dd if=/dev/mem of=memory, tetapi ini gagal setelah membaca 1MiB data. Selanjutnya, saya mencoba dd if=/dev/fmem of=memory bs=1M, tetapi ini berhenti setelah membaca 3010461696 byte (tepatnya 2871 MiB). Setelah melihat /proc/mtrr(ditunjukkan di bawah), saya memutuskan untuk mencoba menambahkan skip=4096. Ini akhirnya melambat, membaca dengan kecepatan hanya 3 MiB / detik, jadi saya memotongnya (menghasilkan file 5,8 GiB). (setidaknya 100 MiB file terakhir berisi 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

Saya tidak dapat menemukan data yang saya buka selama beberapa jam di editor teks, jadi saya yakin saya telah melewatkan beberapa memori saat melakukan dump. Jadi, mengingat tujuan saya (pemulihan data dari program userspace), metode apa yang paling efisien untuk membuang memori sistem ke file? Apa saja poin yang harus dipertimbangkan saat melakukan dump seperti itu?

Lekensteyn
sumber
Sudahkah Anda mencoba / proc / kmem juga? Ini tidak berharga karena itu berubah saat Anda menyalinnya.
ott--
@ ott-- CONFIG_DEVKMEMdinonaktifkan, mencari dalam kode sumber sepertinya mengizinkan akses tidak terbatas, tapi saya masih tidak yakin bahwa ini adalah cara terbaik untuk melakukannya (IO mem akses?)
Lekensteyn
2
Mungkin Anda memang mendapatkan memori editor tetapi Anda tidak mengenalinya. Merekonstruksi struktur data dari dump memori mungkin sulit. Hal pertama yang perlu Anda lakukan adalah merekonstruksi pemetaan memori dari struktur data kernel (mungkin ada alat forensik yang ada) untuk mendapatkan memori virtual dari proses yang Anda minati (yang kemungkinan besar akan tersebar di banyak halaman 4kB terpisah dalam memori fisik). Maka teks mungkin tidak berada dalam satu gumpalan berturut-turut dan dapat menggunakan UCS4 atau representasi lainnya dan dapat menyimpan garis atau blok lain dalam potongan terpisah.
Gilles 'SO- stop being evil'
1
@Gilles +1, setelah proses ini dimatikan saya akan mengharapkan kernel untuk membebaskan deskriptor tugas -> lupakan semua tentang pemetaan ruang alamatnya. Adapun representasi data, dapat dengan mudah menjadi pohon (dengan keberuntungan yang cukup dialokasikan oleh JVM :)).
peterph
Jadi, Anda akan menggali melalui gigabyte data mencari beberapa kb teks yang bahkan mungkin tidak ada di sana? Jarum, temui tumpukan jerami. Dalam waktu yang Anda habiskan untuk ini, Anda bisa mengetik ulang teks. Jika ada banyak di tempat pertama, maka Anda harus memastikan editor teks Anda dikonfigurasi untuk secara berkala menyimpan cadangan sehingga Anda tidak kehilangan banyak jika crash.
psusi

Jawaban:

4

Periksa proyek ini: foriana

Foriana adalah (FOrensic Ram Image ANAlyzer)

input: dump (fisik) output RAM: berbagai informasi

Versi 1.0 dapat mendaftar proses dan modul dari dump memori kernel i386 / x86_64 / arm linux / bsd, dan menyediakan opsi untuk membaca memori linear dari dump.

Ada modul modul kernel:

Fmem adalah driver kernel, yang menciptakan perangkat / dev / fmem. / dev / fmem berperilaku dengan cara yang sama dengan / dev / mem (akses langsung ke memori fisik), tetapi tidak memiliki batasan yang dimiliki / dev / mem. Dimungkinkan untuk membuang seluruh memori fisik melalui / dev / fmem.

Saya sudah menggunakannya, kompilasi cukup mudah.

stackterminator
sumber
Penanya memang mencoba /dev/fmem.
Tobu
3

Anda mungkin ingin menggunakan ddrescueatau program serupa, yang dapat melewati data yang tidak dapat diakses. dd conv=noerrormungkin bisa membantu juga. Periksa juga pertanyaan ini pada pengguna super .

Lebih penting lagi, jika Anda masuk ke dalam situasi OOM, kelesuan sangat mungkin disebabkan oleh kernel yang mengganti halaman dari hal lain selain dari aplikasi yang meminta. Karenanya jika Anda menginginkan data Anda, periksa swap alih-alih /dev/mem- kemungkinan itu akan ada di sana. Demikian pula, jika pembunuh OOM tidak menendang dan Anda membunuh proses dengan tangan, sekali misalnya editor Anda terbunuh pertama kali proses lapar memori mungkin masih terjadi untuk mendapatkan waktu untuk mengambil halaman-halaman itu.

Seperti yang disebutkan oleh Gilles dalam komentar, data dapat dengan mudah berada dalam beberapa struktur khusus, sehingga Anda tidak akan dapat menemukan mereka dengan mudah bahkan jika Anda berhasil merekonstruksi pemetaan ruang alamat proses yang telah dimatikan dan cukup beruntung untuk menemukan semua yang dibutuhkan. halaman masih utuh.

peterph
sumber
1
Saya telah melihat jawaban SU sebelumnya, itulah bagaimana saya menemukan fmem. ddrescuetidak akan membantu saya karena 256 halaman (1 MiB) adalah batas kode keras. Saya akan berharap untuk masuk ke dalam kondisi OOM, tetapi pembunuh OOM tidak menendang ( pastebin.com/DvYTCcRK ). Satu minggu yang lalu, saya memiliki masalah yang sama (masih Linux 3.7.5, saya belum reboot, hanya ditangguhkan untuk ram) Tidak ada swap file / partisi karena saya punya SSD. (swappiness = 60 (default)).
Lekensteyn