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 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
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?
sumber
CONFIG_DEVKMEM
dinonaktifkan, mencari dalam kode sumber sepertinya mengizinkan akses tidak terbatas, tapi saya masih tidak yakin bahwa ini adalah cara terbaik untuk melakukannya (IO mem akses?)Jawaban:
Periksa proyek ini: foriana
Ada modul modul kernel:
Saya sudah menggunakannya, kompilasi cukup mudah.
sumber
/dev/fmem
.Anda mungkin ingin menggunakan
ddrescue
atau program serupa, yang dapat melewati data yang tidak dapat diakses.dd conv=noerror
mungkin 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.
sumber
ddrescue
tidak 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)).