Tam sistem belleğini nasıl boşaltabilirim?


9

VirtualBox'ı başlattıktan sonra bilgisayar durgunlaştı ve daha sonra OOM nedeniyle tamamen asıldı. Genellikle, OOM biraz yer açmak için öldürme süreçlerine başlamalıdır, ancak bu olmadı (bunu ikinci kez yaşadım).

Bir metin düzenleyicide kaydedilmemiş bazı önemli işlerim vardı, bu yüzden mevcut konsoldaki tüm işlemleri SysRq+ kullanarak öldürdükten sonra sistem RAM'inde bulmayı umuyordum K. Söz konusu makine, hedef disk olarak bir SSD ile Linux x86_64 3.7.5 çalıştıran 8 GiB RAM'li bir dizüstü bilgisayardır.

İlk denemem dd if=/dev/mem of=memory, ancak 1MiB veri okuduktan sonra başarısız oldu. Sonra, denedim dd if=/dev/fmem of=memory bs=1M, ama bu 3010461696 bayt (tam olarak 2871 MiB) okuduktan sonra durdu. Baktıktan sonra /proc/mtrr(aşağıda gösterilmiştir) eklemeyi denemeye karar verdim skip=4096. Bu nihayetinde yavaşladı, sadece 3 MiB / sn hızında okudum, bu yüzden kesintiye uğradım (5.8 GiB dosyası vererek). (en azından dosyanın son 100 MiB'si FFs içerir )

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

Saatlerce açık olan verileri metin editöründe bulamadım, bu yüzden dökümü yaparken biraz bellek atladığımı düşünüyorum. Bu nedenle, hedefim (kullanıcı alanı programlarından veri kurtarma) verildiğinde, sistem belleğini bir dosyaya dökmenin en etkili yöntemi nedir? Böyle bir çöplükte dikkat edilmesi gereken bazı noktalar nelerdir?


Siz de / proc / kmem denediniz mi? Çok değerli değil çünkü tho kopyalarken değişiyor.
ott--

@ ott-- CONFIG_DEVKMEMdevre dışı, kaynak koduna bakıldığında sınırsız erişime izin veriyor gibi görünüyor, ancak bunun bunun için en iyi yol olduğuna ikna olmadım (IO mem erişimi?)
Lekensteyn

2
Belki editörün hafızasını aldın ama tanımadın. Bir bellek dökümünden veri yapılarının yeniden yapılandırılması zor olabilir. Yapmanız gereken ilk şey, ilgilendiğiniz sürecin sanal belleğini elde etmek için çekirdek veri yapılarından (muhtemelen bunun için mevcut adli araçlar vardır) bellek eşlemesini yeniden yapılandırmaktır. fiziksel bellekteki birçok ayrık 4kB sayfasının etrafına yayılmış). Daha sonra metin bir ardışık blobda olmayabilir ve UCS4 veya diğer sunumları kullanabilir ve satırları veya diğer blokları ayrı parçalar halinde saklayabilir.
Gilles 'SO- kötü olmayı bırak'

1
@Gilles +1, süreç öldürüldüğünde, çekirdeğin görev tanımlayıcılarını serbest bırakmasını beklerdim -> adres alanı eşlemesini unutun. Veri temsili gelince, kolayca bir ağaç olabilir (JVM tarafından tahsis edilen yeterli şans ile :)).
peterph

Yani orada bile olmayan birkaç kb metin arayan gigabaytlarca veriyi inceleyeceksiniz. İğne, samanlıkta buluş. Bunun için harcadığınız sürede metni yeniden yazmış olabilirsiniz. İlk etapta bu kadar çok şey varsa, metin düzenleyicinizin düzenli olarak bir yedeği kaydetmek için yapılandırıldığından emin olmalısınız, böylece çökerse çok fazla kaybetmezsiniz.
psusi

Yanıtlar:


4

Bu projeyi kontrol edin: foriana

Foriana (FOrensic Ram Görüntüsü ANAlyzer)

giriş: (fiziksel) RAM çıkışının dökümü: çeşitli bilgiler

Sürüm 1.0, i386 / x86_64 / arm linux / bsd çekirdeklerinin bellek dökümünden işlemleri ve modülleri listeleyebilir ve dökümlerden doğrusal belleği okuma seçeneği sunabilir.

Bir çekirdek modülü fmem var:

Fmem / dev / fmem aygıtını oluşturan çekirdek sürücüsüdür. / dev / fmem, / dev / mem (fiziksel belleğe doğrudan erişim) ile aynı şekilde davranır, ancak / dev / mem ile ilgili sınırlara sahip değildir. Tüm fiziksel belleği / dev / fmem aracılığıyla dökmek mümkündür.

Ben kullanmak var, oldukça kolay derlemek.


Asker denedi /dev/fmem.
Tobu

3

ddrescueErişilemeyen verileri atlayabilen veya benzeri bir program kullanmak isteyebilirsiniz . dd conv=noerrorçok yardımcı olabilir. Ayrıca süper kullanıcıda bu soruyu kontrol edin .

Daha da önemlisi, kendinizi bir OOM durumuna soktuysanız, durgunluğun, çekirdeğin, istekte bulunan uygulamadan başka bir şeyden sayfaları değiştirmesinden kaynaklanması muhtemeldir. Bu nedenle verilerinizi istiyorsanız, bunun yerine swapı kontrol edin /dev/mem. Benzer şekilde, OOM katili devreye girmezse ve süreçleri elle öldürürseniz, örneğin editörünüz ilk kez öldürüldüğünde, bellek aç işlemi yine de bu sayfaları kapmak için biraz zaman alabilir.

Yorumunda Gilles tarafından belirtildiği gibi bu kolayca öldüren sürecin adres alanı eşleştirmeleri yeniden yönetmek bile onları bulmak mümkün olmayacaktır böylece, verilerin kolayca, bazı özel yapıda olabilir ve gerekli tüm bulmak için yeterli şans sayfalar hala sağlam.


1
SU'nun daha önce cevap verdiğini gördüm, fmem'i böyle buldum. ddrescue256 sayfa (1 MiB) sabit kodlu bir sınır olduğu için bana yardımcı olmayacak. Bir OOM durumuna girmeyi beklerdim, ancak OOM katili devreye girmedi ( pastebin.com/DvYTCcRK ). Bir hafta önce, aynı sorunu yaşadım (hala Linux 3.7.5, yeniden başlatmadım, sadece koç askıya alındı). SSD'm olduğundan takas dosyası / bölüm yok. (swappiness = 60 (varsayılan)).
Lekensteyn
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.