मैं पूर्ण सिस्टम मेमोरी को कैसे डंप कर सकता हूं?


9

VirtualBox शुरू करने के बाद, कंप्यूटर सुस्त हो गया और फिर OOM के कारण पूरी तरह से लटका दिया गया। आमतौर पर, ओओएम को कुछ जगह खाली करने के लिए हत्या की प्रक्रिया शुरू करनी चाहिए, लेकिन ऐसा नहीं हुआ (यह दूसरी बार जब मैंने अनुभव किया)।

मैं किसी पाठ संपादक में कुछ न सहेजे गए महत्वपूर्ण काम था, इसलिए मैं प्रणाली रैम में वापस का उपयोग कर मौजूदा कंसोल में सभी प्रक्रियाओं की हत्या के बाद यह पता लगाने के लिए उम्मीद कर रही थी SysRq+ K। विचाराधीन मशीन 8 GiB RAM वाला लैपटॉप है जिसमें लक्ष्य डिस्क के रूप में SSD के साथ लिनक्स x86_64 3.7.5 है।

मेरा पहला प्रयास था dd if=/dev/mem of=memory, लेकिन 1MiB डेटा पढ़ने के बाद यह विफल रहा। अगला, मैंने कोशिश की dd if=/dev/fmem of=memory bs=1M, लेकिन यह 3010461696 बाइट्स (2871 MiB) पढ़ने के बाद बंद हो गया। देखने के बाद /proc/mtrr(नीचे दिखाया गया है), मैंने जोड़ने की कोशिश करने का फैसला किया skip=4096। यह अंततः धीमा हो गया, केवल 3 MiB / सेकंड की गति से पढ़ना, इसलिए मैंने इसे बाधित कर दिया (5.8 GiB की एक फ़ाइल उपज)। (फ़ाइल के कम से कम अंतिम 100 MiB में 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

मुझे पाठ संपादक में कुछ घंटों के लिए खुला डेटा नहीं मिला, इसलिए मुझे विश्वास है कि मैंने डंप करते समय कुछ मेमोरी को छोड़ दिया है। तो, मेरा लक्ष्य (उपयोगकर्ताओं के कार्यक्रमों से डेटा की वसूली) को देखते हुए, सिस्टम मेमोरी को फ़ाइल में डंप करने का सबसे कुशल तरीका क्या है? ऐसे कुछ बिंदु हैं जो इस तरह के डंप करते समय विचार किए जाने चाहिए?


क्या आपने भी कोशिश की है / खरीद / kmem? यह बहुत लायक नहीं है क्योंकि जब आप इसे कॉपी कर रहे हैं तो यह बदल जाता है।
ott--

@ ott-- CONFIG_DEVKMEMअक्षम है, स्रोत कोड को देखते हुए यह अप्रतिबंधित पहुंच की अनुमति देता है, लेकिन मुझे अभी भी यकीन नहीं है कि यह ऐसा करने का सबसे अच्छा तरीका है (IO मेम एक्सेस?)
Lekensteyn

2
हो सकता है कि आपको संपादक की स्मृति मिल गई हो, लेकिन आपने उसे नहीं पहचाना। मेमोरी डंप से डेटा संरचनाओं का पुनर्निर्माण कठिन हो सकता है। पहली चीज जो आपको करने की आवश्यकता है वह कर्नेल डेटा संरचनाओं से मेमोरी मैपिंग को फिर से संगठित करना है (संभवत: इसके लिए मौजूदा फोरेंसिक टूल हैं) ताकि जिस प्रक्रिया में आपकी रुचि हो (जो होने की संभावना हो) की वर्चुअल मेमोरी प्राप्त करने के लिए भौतिक स्मृति में कई अपमान 4kB पृष्ठों के आसपास)। तब पाठ लगातार एक बूँद में नहीं हो सकता है और UCS4 या अन्य अभ्यावेदन का उपयोग कर सकता है और अलग-अलग हिस्सों में लाइनों या अन्य ब्लॉकों को संग्रहीत कर सकता है।
गिलेस एसओ- बुराई को रोकना '

1
@ गाइल्स +1, इस प्रक्रिया के मारे जाने के बाद मैं कर्नेल को कार्य विवरणकर्ताओं को मुक्त करने की अपेक्षा करूंगा -> इसके पते के स्थान मैपिंग के बारे में सब भूल जाऊंगा। डेटा प्रतिनिधित्व के लिए, यह आसानी से एक पेड़ हो सकता है (जेवीएम द्वारा आवंटित पर्याप्त भाग्य के साथ :))।
पेट्रफ

तो आप डेटा के गीगाबाइट के माध्यम से खोदने जा रहे हैं जो कुछ केबी के पाठ की तलाश में है जो कि हो भी नहीं सकता है? सुई, धड़ से मिलना। इस समय आपके द्वारा बिताए गए समय में आप केवल पाठ को पुनः प्राप्त कर सकते हैं। यदि पहली जगह में इतना कुछ था, तो आपको यह सुनिश्चित करना चाहिए कि आपका पाठ संपादक समय-समय पर बैकअप सहेजने के लिए कॉन्फ़िगर किया गया है ताकि आप क्रैश होने पर ज्यादा न खोएं।
psusi

जवाबों:


4

इस परियोजना की जाँच करें: foriana

फोरियाना है (फ़ॉरेन्सिक राम छवि ANAlyzer)

इनपुट: (भौतिक) रैम आउटपुट का डंप: विभिन्न जानकारी

संस्करण 1.0 i386 / x86_64 / arm linux / bsd कर्नेल की मेमोरी डंप से प्रक्रियाओं और मॉड्यूल को सूचीबद्ध कर सकता है, और डंप से रैखिक मेमोरी पढ़ने के लिए विकल्प प्रदान कर सकता है।

कर्नेल मॉड्यूल femem है:

Fmem कर्नेल ड्राइवर है, जो / dev / fmem डिवाइस बनाता है। / dev / fmem उसी तरह का व्यवहार करते हैं जैसे कि / dev / mem (भौतिक स्मृति तक सीधी पहुंच), लेकिन इसमें ऐसी सीमाएँ नहीं हैं जो / dev / mem हैं। संपूर्ण भौतिक स्मृति को / dev / fmem के माध्यम से डंप करना संभव है।

मैं इसे इस्तेमाल करते हैं, बहुत आसान संकलन।


पूछने वाले ने कोशिश की /dev/fmem
टोबू

3

आप ddrescueप्रोग्राम या समान प्रोग्राम का उपयोग करना चाह सकते हैं , जो दुर्गम डेटा को छोड़ सकता है। dd conv=noerrorसहायक भी हो सकता है। सुपरसुसर पर भी इस प्रश्न की जाँच करें ।

इससे भी महत्वपूर्ण बात यह है कि अगर आप अपने आप को एक OOM स्थिति में ले आते हैं, तो सुस्ती बहुत ही संभावित होती है, जो अनुरोध वाले एप्लिकेशन के अलावा किसी और चीज़ के पेज को स्वैप करने से होती है। इसलिए यदि आप अपना डेटा चाहते हैं, तो स्वैप की जांच करें /dev/mem- संभावना है कि यह वहां होगा। इसी तरह, अगर OOM किलर किक नहीं करता है और आप हाथ से प्रक्रियाओं को मारते हैं, तो एक बार जैसे आपके संपादक को पहली बार मार दिया जाता है, वैसे ही उन पृष्ठों को हथियाने के लिए कुछ समय पाने के लिए मेमोरी हंगर प्रक्रिया हो सकती है।

जैसा कि टिप्पणी में गिल्स ने कहा है, डेटा आसानी से कुछ विशेष संरचना में हो सकता है, इसलिए आप उन्हें आसानी से नहीं ढूंढ पाएंगे, भले ही आप मारे गए प्रक्रिया के पता स्थान मैपिंग को फिर से व्यवस्थित करने के लिए प्रबंधित करें और सभी आवश्यक को खोजने के लिए पर्याप्त भाग्य हो। पेज अभी भी बरकरार हैं।


1
मैंने देखा है कि एसयू जवाब पहले, कि कैसे मैं fmem पाया है। ddrescue256 पेज (1 MiB) एक हार्ड-कोडित सीमा के बाद से मेरी मदद करने वाला नहीं है। मैं OOM कंडीशन में आने की उम्मीद करूंगा, लेकिन OOM किलर ने ( pastebin.com/DvYTCcKK ) को किक नहीं मारी । एक सप्ताह पहले, मेरे पास एक ही मुद्दा था (अभी भी लिनक्स 3.7.5, मैंने रिबूट नहीं किया है, केवल रैम को निलंबित कर दिया गया है)। SSD होने के बाद से कोई स्वैप फ़ाइल / विभाजन नहीं है। (स्वपनदोष = ६० (डिफ़ॉल्ट))।
लेकेन्स्टाइन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.