माउंट-रिम रिमाउंट, आरओ / वास्तव में क्या करता है (हुड के तहत)


7

केवल पढ़ने के लिए एक माउंटेड फाइल सिस्टम को रिमूव करने के लिए, मैं निम्नलिखित कमांड का उपयोग कर सकता हूं:

mount -o remount,ro /foo

यह शटडाउन अनुक्रम में उदाहरण के लिए उपयोग किया जाता है, जहां रूट फाइलसिस्टम ( /) को केवल पढ़ने से पहले लिखा गया halt/rebootहै।

वास्तव में केवल-पढ़ने के लिए क्या उल्लेखनीय है? क्या यह कर्नेल में कुछ "ध्वज" को बदल देता है, जिससे कि लिखने से इनकार किया जाता है?

कितना मुश्किल होगा खुद का प्रोग्राम लिखना जो कुछ और नहीं बल्कि किसी दिए गए फाइल सिस्टम को केवल पढ़ने के लिए बताए?

जवाबों:


11

फाइलसिस्टम को माउंट करना या रिमूव करना mount(2)सिस्कल का उपयोग करके किया जाता है । रीमाउंट करते समय, यह लक्ष्य स्थान (माउंटपॉइंट), माउंट ऑपरेशन में उपयोग किए जाने वाले झंडे और इसमें शामिल विशिष्ट फ़ाइल सिस्टम के लिए उपयोग किए जाने वाले किसी भी अतिरिक्त डेटा को लेता है। जब केवल पढ़ने योग्य रिमूव किया जाता है, तो उपयोग किए जाने वाले झंडे होते हैं MS_RDONLYऔर MS_REMOUNT; आप किसी अन्य झंडे को भी प्रदान करने वाले हैं जिसका उपयोग तब किया गया था जब फाइलसिस्टम पहली बार माउंट किया गया था।

एक फाइल-सिस्टम को केवल पढ़ने के लिए रिमूव करना, वास्तव में कर्नेल के फाइलसिस्टम डेटा स्ट्रक्चर्स में एक झंडे को सेट करता है, कुछ क्लीन-अप करने के बाद (मूल रूप से किसी भी बकाया लेखन को पूरा करने के बाद)। आप देख सकते हैं कि यह कैसे में संभाला है स्रोत कोड : अगर एक फाइल सिस्टम लगाया गया है पढ़ने-लिखने की और उसके बाद remounted केवल पढ़ने के लिए, फाइल सिस्टम सिंक हो जाता है, कोटा निलंबित कर रहे हैं, और superblock संरचना में फाइल सिस्टम इंगित करने के लिए अद्यतन किया जाता है है केवल पढ़ने के लिए । यह तब लिखने से इनकार करने के लिए कर्नेल में उपयोग किया जाता है; उदाहरण के लिए देखें जो केवल पढ़ने के लिए फाइल सिस्टम पर लिखने की पहुंच को रोकता है।ext4ext4s_flagssb_permission

यदि आप स्वयं ऐसा करना चाहते हैं, तो आप mount()ऊपर दिए गए मैनपेज के अनुसार उचित विकल्पों के साथ कॉल करने का प्रयास कर सकते हैं। एक पूर्ण समाधान के लिए मेरा मानना ​​है कि आपको वर्तमान माउंट फ़्लैग को निर्धारित करने और उन्हें अपडेट करने की आवश्यकता होगी, लेकिन आप अपने फाइल सिस्टम को वर्तमान में माउंट किए जाने वाले मैच के लिए एक सरल प्रोग्राम को हार्ड-कोड कर सकते हैं ...


क्या मुझे अपने साधारण प्रोग्राम में खुद को सुपरकॉक स्ट्रक्चर में फाइलसिस्टम का सस्पेंशन, कोटा सस्पेंड करना और s_flags सेट करना है, या एक बार mount()syscall कॉल करने पर कर्नेल मेरे लिए नहीं करता है ?
मार्टिन वेगाटर

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