जब वे मर जाते हैं तो ओपन फाइल हैंडल कहाँ जाते हैं?


15

उन फ़ाइलों का क्या होता है जो उनके द्वारा खोली गई फ़ाइल को खोलने के दौरान हटा दी जाती हैं?

जब से मैं MPlayer में खेल रहा था, तब तक मैं एक वीडियो फ़ाइल को हटा सकता था और यह अभी भी अंत तक खेलूंगा, यह मैं सोच रहा था । यह डेटा कहाँ से खींच रहा है? क्या यह अभी भी हार्ड ड्राइव से आ रहा है? क्या मैंने फ़ाइल को हटाए जाने के बाद RAM में कॉपी किया है?

यदि यह अभी भी हार्ड ड्राइव पर है, तो क्या होता है यदि मैं फाइल सिस्टम को भरता हूं, जबकि प्रोग्राम अनिवार्य रूप से अनलॉकेटेड स्पेस से रीडिंग चला रहा है? यदि यह RAM में बफ़र्ड है, तो क्या होगा यदि मैं बफ़र्स को फ़्लश करता हूँ?

यदि फ़ाइल NFS शेयर पर होती है, तो क्या यह सर्वर पर संग्रहीत होता है? (ऐसा नहीं है कि खुले दूरस्थ फ़ाइल हैंडल के टन द्वारा एक सुरक्षा जोखिम-DoS?)

lsof -n |grep '(deleted)'कभी-कभी करना दिलचस्प परिणाम देता है; यदि मैं उन पैकेजों को अपग्रेड कर रहा हूं जो साझा लाइब्रेरी फ़ाइलों को स्वैप करते हैं, तो उन पुस्तकालयों का उपयोग करने वाले प्रोग्राम चल रहे हैं, फिर भी उनका उपयोग कर पाएंगे क्योंकि कुछ भी नहीं बदला है।

बोनस प्रश्न: क्या इस स्थिति में मृतकों से डेटा वापस पाने का कोई तरीका है?

जवाबों:


13

इनोडेस अभी भी डिस्क पर बने रहते हैं, हालांकि इनोड्स में कोई और अधिक कड़ी मौजूद नहीं है। फ़ाइल डिस्क्रिप्टर बंद होने पर उन्हें हटा दिया जाएगा। तब तक, फ़ाइल को सामान्य, बारिंग ऑपरेशंस के रूप में संशोधित किया जा सकता है जिसके लिए फ़ाइल नाम / हार्ड लिंक की आवश्यकता होती है।

debugfs और इसी तरह के उपकरणों का उपयोग इनोड्स की सामग्री को पुनर्प्राप्त करने के लिए किया जा सकता है।


10
यह सही है, हालाँकि यदि फ़ाइल अभी भी खुली हुई है, तो आप इसे / proc / <PID> / fd पर जाकर वापस प्राप्त कर सकते हैं जहाँ PID एक प्रोग्राम का pid है जिसमें फ़ाइल अभी भी खुली है। इस निर्देशिका में प्रोग्राम के सभी खुले फ़ाइल विवरण शामिल हैं, और आप उन्हें सामान्य फ़ाइलों की तरह ही एक्सेस कर सकते हैं, इसलिए आप फ़ाइल को 'रिस्टोर' करने के लिए एक हार्ड लिंक बना सकते हैं।
पैट्रिक

ध्यान दें कि /procलिनक्स विशिष्ट (जैसा है debugfs)।
इग्नासियो वाज़क्वेज़-अब्राम्स

1
सोलारिस के पास / खरीद भी है और तकनीक वहां ठीक काम करती है। बीएसडी के बारे में नहीं जानते।
पैट्रिक

2
मुझे बस इतना जोड़ना है कि यह कमाल है।
n0pe

1
@ पैट्रिक: आप किसी फ़ाइल को 'रिस्टोर' करने के लिए एक हार्ड लिंक नहीं बना सकते हैं /proc। हार्ड-लिंक केवल एक ही फाइल सिस्टम पर काम करते हैं, फाइलसिस्टम के पार नहीं और चूंकि /procएक अलग गैर-लेखन योग्य फाइल सिस्टम है, इसलिए आप इस पर हार्ड लिंक नहीं बना सकते हैं। /procहालाँकि आप फ़ाइल को कॉपी कर सकते हैं ।
Camh

5

कर्नेल इनोड के संदर्भों पर संदर्भ गणना करता है। जब मैं बंद करता हूं तो मेरा जवाब देखें () एक फाइल डिस्क्रिप्टर?

खुली फ़ाइलों को हटाने की संभावना केवल खोलने वाली फ़ाइलों की तुलना में अधिक प्रभावी DOS तंत्र नहीं है। ulimitखुली फ़ाइलों पर इस डॉस प्रयास के खिलाफ कुछ संरक्षण प्रदान करता है। यह सभी खुली फाइलों पर लागू होता है, हटाए गए हैं या नहीं।


5

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

डेटा अभी भी ड्राइव पर है, लेकिन फ़ाइल को 0. की लिंक गणना के रूप में चिह्नित किया गया है। यदि सिस्टम क्रैश हो जाता है, तो अगले रिबूट पर fsck जानता है कि उसे डेटा को हटाना होगा। यह सेवा को अस्वीकार करने का कारण नहीं बनता है जो एक गैर-हटाए गए फ़ाइल से अधिक नहीं है।

जहाँ तक मुझे पता है (आप debugfsया तो इसी तरह की विधि के साथ फाइलसिस्टम ड्राइवर को दरकिनार कर सकते हैं), लेकिन आप सामग्री को आसानी से ठीक कर सकते हैं: cat /proc/12345/fd/42जहाँ 12345 प्रक्रिया आईडी है जिसमें फ़ाइल खुली है और 42 फाइल डिस्क्रिप्टर नंबर है।

NFS पर, जब आप किसी क्लाइंट में अभी भी खुली हुई किसी फ़ाइल को हटाते हैं, तो NFS सर्वर सर्वर पर फ़ाइल का नाम बदल देता है, लेकिन इसे तब तक नहीं हटाता, जब तक कि सभी क्लाइंट फ़ाइल को रिलीज़ नहीं कर देते। मेरे अनुभव में, नया नाम है .nfs…, हालांकि मुझे नहीं पता कि सभी एनएफएस कार्यान्वयन में नाम समान है या नहीं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.