एक खराब `rm` के बाद मेरी फ़ाइलों को बचाने के लिए मेरी मशीन को पावर डाउन क्यों किया?


31

शास्त्रीय स्थिति: मैं एक बुरा भाग गया rmऔर तुरंत बाद में महसूस किया कि मैंने गलत फाइलें निकाल दी हैं। (कुछ भी महत्वपूर्ण नहीं है और मेरे पास हाल ही में बैकअप था, लेकिन अभी भी कष्टप्रद है।)

यह जानते हुए कि आगे डिस्क गतिविधि मेरा दुश्मन था अगर मैं extundeleteइस तरह के उपकरणों के साथ फ़ाइलों को पुनर्प्राप्त करना चाहता था , तो मैंने तुरंत मशीन को भौतिक रूप से संचालित किया (यानी, पावर बटन के साथ, haltया इस तरह के किसी भी कमांड के साथ नहीं )। यह एक लैपटॉप था जिसमें कोई महत्वपूर्ण कार्य नहीं चल रहा था या कुछ भी खुला था, इसलिए यह एक स्वीकार्य ऑपरेशन था। (वैसे, मैंने तब से सीखा कि ऐसी स्थिति में पहली बात यह होगी कि सबसे पहले अनुमान लगाना होगा कि क्या लापता फाइलें अभी भी एक प्रक्रिया द्वारा खोली जा सकती हैं https://unix.stackexchange.com/a/101247 - यदि वे हैं, तो आपको मशीन को बिजली देने के बजाय इस तरह से पुनर्प्राप्त करना चाहिए।]

फिर भी, एक बार मशीन संचालित होने के बाद मैंने कुछ समय के लिए सोचा और तय किया कि फाइलें उचित फोरेंसिक के लिए लाइव सिस्टम को बूट करने के समय के निवेश के लायक नहीं हैं। इसलिए मैंने मशीन को वापस संचालित किया। और फिर मुझे पता चला कि मेरी फाइलें अभी भी डिस्क पर बैठी हुई थीं: rmडिस्क को मेरे द्वारा संचालित करने से पहले प्रचारित नहीं किया गया था। मैंने थोड़ा नृत्य किया और अपनी अप्रत्याशित माफी के लिए सिसड्मिन के देवता को धन्यवाद दिया।

मेरा सवाल अब यह समझना है कि यह कैसे संभव था, और rmवास्तव में डिस्क पर प्रचारित होने से पहले विशिष्ट देरी क्या है । मुझे पता है कि डिस्क IO को तुरंत फ्लश नहीं किया जाता है, लेकिन यह कुछ समय के लिए मेमोरी में बैठता है, लेकिन मैंने सोचा कि डिस्क जर्नल जल्दी से सुनिश्चित करेगा कि लंबित संचालन पूरी तरह से खो न जाए। https://unix.stackexchange.com/a/78766 गंदे पन्नों को फ्लश करने और जर्नल ऑपरेशंस को फ्लश करने के लिए एक अलग तंत्र पर संकेत देता है, लेकिन इस बारे में पर्याप्त विवरण नहीं देता है कि पत्रिका किस तरह से शामिल होगी rm, और पहले देरी होने की उम्मीद है संचालन को बाधित किया जाता है।

कुछ और विवरण: डेटा एक LUKS मात्रा के अंदर एक ext4 विभाजन में था, और जब मशीन को बूट कर रहा था तो मैंने निम्नलिखित को देखा syslog:

Sep 24 10:24:58 gamma kernel: [   11.457007] EXT4-fs (dm-0): 1 orphan inode deleted
Sep 24 10:24:58 gamma kernel: [   11.458393] EXT4-fs (dm-0): recovery complete
Sep 24 10:24:58 gamma kernel: [   11.482475] EXT4-fs (dm-0): mounted filesystem with ordered data mode. Opts: (null)

लेकिन मुझे विश्वास नहीं है कि यह संबंधित है rm

एक अन्य प्रश्न यह होगा कि क्या कर्नेल को यह बताने का कोई तरीका है कि मशीन को कम करने के बजाय लंबित डिस्क संचालन में से कोई भी कार्य न करें (बल्कि कहें, उन्हें कहीं डंप करें)। (बेशक, यह लंबित संचालन नहीं करने के लिए खतरनाक लगता है, लेकिन यह तब होता है जब मशीन को किसी भी तरह से पावर डाउन किया जाता है, और यह कुछ मामलों में यह आपको बचा सकता है।) यह निश्चित रूप से "क्लीनर" होगा, और दिलचस्प भी। उदाहरण के लिए दूरस्थ सर्वर जहां भौतिक शक्तिपात एक आसान विकल्प नहीं है।

जवाबों:


22

ऐसा लगता है कि आपको क्या हुआ है पर एक सभ्य समझ मिली है।

हां, क्योंकि आप डिस्क में परिवर्तन करने से पहले सिस्टम को हार्ड-संचालित करते हैं, वे वहां थे जब आपने बैक अप बूट किया था।

सिस्टम कैश को डिस्क से फ्लश करने से पहले लिखता है। कई विकल्प हैं जो इस व्यवहार को नियंत्रित करते हैं, सभी /proc/sys/vm/dirty_* [ कर्नेल डॉक्टर ] पर स्थित हैं । जब तक एक फ्लश को स्पष्ट रूप से fsync() [ आदमी 2 fsync ] के माध्यम से किसी एप्लिकेशन द्वारा नहीं किया जाता है , डेटा तब प्रतिबद्ध होता है जब वह या तो काफी पुराना हो, या राइट कैश भर जाए।
ऊपर उपयोग किए गए "डेटा" की परिभाषा में फ़ाइल को हटाने के लिए निर्देशिका प्रविष्टि में संशोधन शामिल है।

अब, जैसा कि पत्रिका के लिए है, यह एक आम गलतफहमी है कि पत्रिका क्या है। किसी पत्रिका का उद्देश्य यह सुनिश्चित करना नहीं है कि परिवर्तन फिर से हो, या वह डेटा खो न जाए। एक पत्रिका का उद्देश्य फाइल सिस्टम के भ्रष्टाचार को रोकना है, न कि इसमें मौजूद फाइलों को। पत्रिका में केवल परिवर्तनों के बारे में जानकारी होती है, और आम तौर पर परिवर्तन का पूरा डेटा नहीं होता है। सटीक विवरण फाइल सिस्टम और जर्नल मोड पर निर्भर हैं। Ext3 / 4 के लिए, में dataमाउंट विकल्प देखें man 8 mount


रिबूट के बिना लंबित लेखन को रोकने का एक तरीका है या नहीं, आपके पूरक प्रश्न का उत्तर देने के लिए:

कर्नेल स्रोत कोड के माध्यम से एक त्वरित रीडिंग करने से, ऐसा लगता है कि आप एक आपातकालीन रिमाउंट-रीड-ओनली ऑपरेशन करने के लिए मैजिक sysrq uकमांड ([ विकिपीडिया ], [ कर्नेल डॉक्टर ]) का उपयोग कर सकते हैं । ऐसा प्रतीत होता है कि यह बिना किसी सिंक ऑपरेशन के केवल पढ़ने के लिए सभी संस्करणों को तुरंत हटा देगा ।

इसका उपयोग करने के लिए, बस Alt+ SysRq+ दबाएँ u


1
इस उत्तर के लिए धन्यवाद! मैं अभी भी पत्रिका के बारे में थोड़ा उलझन में हूं: क्या मुझे इसके बारे में कुछ ऐसा सोचना चाहिए जो केवल तब शामिल हो जाता है जब परिवर्तन डिस्क में प्रवाहित हो जाता है, ताकि लेखन कैशिंग केवल प्रासंगिक तंत्र rmहै जो लिखे जाने से पहले अनुग्रह समय का अनुमान लगा सकता है? दूसरे शब्दों में, चीजें केवल पत्रिका के लिए प्रतिबद्ध होती हैं जब एक लेखन सिर्फ प्रदर्शन के बारे में होता है? या क्या चित्र उससे अधिक जटिल है? Alt-sysrq-u के लिए, यह एक बहुत साफ विचार है। क्या आपके पास "यह प्रतीत होता है" दावे के लिए एक संदर्भ है? (यह आपके द्वारा दिए गए लिंक्स से नहीं लगता है।) धन्यवाद! :)
a3nm

इसके अलावा, जादू sysrq की सीमा भी है कि आप अभी भी इसे रिमोट मशीन पर नहीं कर सकते हैं।
a3nm

3
@ a3nm आप रिमोट मशीन पर sysrq का उपयोग कर सकते हैं। echo u > /proc/sysrq-trigger(आपको इसे पहले सक्रिय करने की आवश्यकता हो सकती है)।
पाउलो अल्मीडा

पत्रिका केवल फ़ाइल सिस्टम मेटाडेटा के साथ फ़ाइल सामग्री (डिफ़ॉल्ट रूप से, इसे पूरी तरह से प्रकाशित किया जा सकता है) के साथ सौदा नहीं करता है, लेकिन इस मामले में यह फ़ाइल को हटा सकता है , क्योंकि हम निर्देशिका प्रविष्टि को हटाने के साथ काम कर रहे हैं। इस प्रकार, पत्रिका को यह सुनिश्चित करना चाहिए कि या तो फ़ाइल मौजूद है (इसकी पिछली सामग्री के साथ, यह मानते हुए कि उनके पास कोई अन्य परिवर्तन नहीं था) या यह नहीं है।
Ángel

@ a3nm अपनी पत्रिका टिप्पणी के संबंध में। लेखन कैश जर्नल और डिस्क के बीच बैठता है। जब आप फाइलसिस्टम को लिखते हैं, तो जर्नल अपडेट किया जाता है, फिर फाइलसिस्टम, लेकिन न तो डिस्क के लिए प्रतिबद्ध होता है।
पैट्रिक

2

प्रेषक: https://www.kernel.org/doc/Documentation/filesystems/ext4.txt

प्रतिबद्ध = nrsec (*) Ext4 को अपने सभी डेटा और मेटाडेटा को प्रत्येक 'nrsec' सेकंड में सिंक करने के लिए कहा जा सकता है। डिफ़ॉल्ट मान 5 सेकंड है। इसका मतलब यह है कि यदि आप अपनी शक्ति खो देते हैं, तो आप काम के नवीनतम 5 सेकंड के रूप में ज्यादा खो देंगे (जर्नलिंग के लिए धन्यवाद, हालांकि आपका फाइल सिस्टम क्षतिग्रस्त नहीं होगा)। यह डिफ़ॉल्ट मान (या कोई भी कम मान) प्रदर्शन को प्रभावित करेगा, लेकिन यह डेटा-सुरक्षा के लिए अच्छा है। इसे 0 पर सेट करने का डिफ़ॉल्ट (5 सेकंड) पर इसे छोड़ने के समान प्रभाव पड़ेगा। इसे बहुत बड़े मूल्यों पर सेट करने से प्रदर्शन में सुधार होगा।

यह भी देखें कि उन्हें कैसे फ्लश करें: आप लिनक्स सिस्टम पर बफ़र्स और कैश को कैसे खाली करते हैं?

उपरोक्त लिंक से उद्धृत:

नोट: अनावश्यक चीजों (Kernerl 2.6.16 या नए) की स्मृति को साफ करें। हमेशा उपयोगी चीजों को डिस्क से बाहर फ्लश करने के लिए सबसे पहले सिंक चलाना सुनिश्चित करें !!!

To free pagecache:

$ echo 1 > /proc/sys/vm/drop_caches

To free dentries and inodes:

$ echo 2 > /proc/sys/vm/drop_caches

To free pagecache, dentries and inodes:

$ echo 3 > /proc/sys/vm/drop_caches

इस उत्तर के लिए धन्यवाद! हालाँकि, मुझे यह समझ में नहीं आता है: इस "सिंक" के लिए जिसका उल्लेख किया गया है commit=nrsec, क्या यह कुछ ऐसा है जो कर्नेल द्वारा मेमोरी से डिस्क में परिवर्तन को फ्लश करने का निर्णय लेने के बाद होगा ? या सेटिंग यह commit=1गारंटी देती है कि सभी परिवर्तन 1 सेकंड के बाद dirty_expire_centisecsऔर dirty_writeback_centisecsसेटिंग्स के बावजूद फ्लश हो जाएंगे ?
a3nm

कर्नेल किसी भी कैश / बफ़र्स को डिस्क पर (1) सेकंड के लिए फ्लश (सिंक) करेगा commit=1। जहां तक ​​मैं इसे समझता हूं, syncवर्चुअल मेमोरी सेटिंग्स की परवाह किए बिना सब कुछ होने के लिए मजबूर करता है, हालांकि यह जल्द ही हो सकता है।
डेविड

प्रदर्शन कारणों के लिए भी, (और भंडारण दीर्घायु) डिफ़ॉल्ट से कम करने के लिए प्रतिबद्ध है अनुशंसित नहीं है।
डेविड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.