मैं लिनक्स में एक फाइल सिस्टम ड्राइवर ड्राइवर कैसे लागू करूं? [बन्द है]


15

मान लें कि मैंने एक नई फ़ाइल प्रणाली का आविष्कार किया है, और अब मैं इसके लिए एक फ़ाइल सिस्टम ड्राइवर बनाना चाहता हूं।

मैं इस फ़ाइल सिस्टम ड्राइवर को कैसे लागू करूंगा, क्या यह कर्नेल मॉड्यूल का उपयोग करके किया गया है?

और फ़ाइल सिस्टम ड्राइवर हार्ड डिस्क तक कैसे पहुंच सकता है, क्या फ़ाइल सिस्टम ड्राइवर को हार्ड डिस्क तक पहुंचने के लिए कोड होना चाहिए, या क्या लिनक्स में एक डिवाइस ड्राइवर होता है जो सभी फ़ाइल सिस्टम ड्राइवरों द्वारा उपयोग किए जाने वाले हार्ड डिस्क तक पहुंचता है?

जवाबों:


24

हां, लिनक्स में फाइल सिस्टम को कर्नेल मॉड्यूल के रूप में लागू किया जा सकता है। लेकिन FUSE (USErspace में फाइलसिस्टम) इंटरफ़ेस भी है, जो एक नियमित उपयोगकर्ता-अंतरिक्ष प्रक्रिया को फाइलसिस्टम चालक के रूप में कार्य करने की अनुमति दे सकता है। यदि आप एक नई फाइल सिस्टम का प्रोटोटाइप बना रहे हैं, तो इसे पहले FUSE इंटरफ़ेस का उपयोग करके लागू करना परीक्षण और विकास को आसान बना सकता है। एक बार जब आपके पास फ़ाइल सिस्टम का इंटर्न्स FUSE रूप में काम करता है, तो आप इसके बाद एक प्रदर्शन-अनुकूलित कर्नेल मॉड्यूल संस्करण लागू करना शुरू कर सकते हैं।

कर्नेल स्थान के भीतर एक फाइल सिस्टम को लागू करने के बारे में कुछ बुनियादी जानकारी यहाँ दी गई है। यह बल्कि पुराना है (1996 से!), लेकिन कम से कम आपको उस तरह की चीजों के लिए एक बुनियादी विचार देना चाहिए जो आपको करने की आवश्यकता होगी।

यदि आप FUSE मार्ग पर जाना चुनते हैं, तो यहां का libfuse, FUSE इंटरफ़ेस के उपयोक्ता पक्ष का संदर्भ कार्यान्वयन है।

फाइलसिस्टम चालक कर्नेल मॉड्यूल के रूप में

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

जब एक फाइलसिस्टम आरोहित हो रहा होता है, और या तो आपके सिस्टम से मेल करने के लिए फाइलसिस्टम प्रकार निर्दिष्ट किया जाता है, या फाइलसिस्टम टाइप ऑटो-डिटेक्शन परफॉर्म किया जा रहा होता है, तो कर्नेल का वर्चुअल फाइलसिस्टम (VFS फॉर शॉर्ट) लेयर उस फंक्शन को कॉल करेगा। यह मूल रूप से कहता है "यहां एक मानक लिनक्स ब्लॉक डिवाइस के कर्नेल-स्तरीय प्रतिनिधित्व के लिए एक संकेतक है। इस पर एक नज़र डालें, देखें कि क्या यह कुछ ऐसा है जिसे आप संभाल सकते हैं, और फिर मुझे बताएं कि आप इसके साथ क्या कर सकते हैं।"

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

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

VFS परत VFS परत को कई मानक कार्य उपलब्ध कराने के लिए फाइलसिस्टम ड्राइवर की अपेक्षा करती है; VFS लेयर के लिए फाइल सिस्टम के साथ कुछ भी सार्थक करने के लिए इनमें से कुछ अनिवार्य हैं, अन्य वैकल्पिक हैं और आप ऐसे वैकल्पिक फ़ंक्शन के लिए पॉइंटर के स्थान पर NULL वापस कर सकते हैं।


1
यह एक बहुत अच्छा जवाब है, हालांकि इस सवाल का पूरी तरह से जवाब देने के लिए कहा गया है कि आपको उस ब्लॉक डिवाइस लेयर को फाइल सिस्टम लेयर के निर्माण के लिए प्रदान की जाने वाली कार्यक्षमता के बारे में थोड़ा सा कहना होगा।
कास्परड

मुझे लगता है कि "यहाँ एक मानक ब्लॉक डिवाइस के लिए एक सूचक है" बिट के साथ, लेकिन अच्छी बात है; मैंने उस पर विस्तार किया।
टेल्कम

यह उत्तर, विशेष रूप से किस क्रम में होता है, का वर्णन दिव्य है। क्या कोई ऐसी पुस्तक / वेबसाइट है जिसे मैं पढ़ सकता हूं जिसमें "कैसे काम करता है" जैसे सभी विवरण हैं?
एडम बार्न्स

आप लिनक्स कर्नेल इंटरनेशनल या लिनक्स डिवाइस ड्राइवर्स, 3 डी एडिशन में दिलचस्पी ले सकते हैं । और निश्चित रूप से, वास्तविक स्रोत कोड को पढ़ने का विकल्प है।
टेल्कोम

5

हां एक कर्नेल ड्राइवर एक फाइल-सिस्टम का प्रबंधन कर सकता है।

फ़ाइल-सिस्टम को प्रोटोटाइप करने के लिए सबसे अच्छा समाधान है, FUSE का उपयोग करना। और आप इसे कर्नेल ड्राइवर में बदलने के बारे में सोच सकते हैं।

विकिपीडिया => https://en.wikipedia.org/wiki/Filesystem_in_Userpace

स्रोत => https://github.com/libfuse/libfuse

एक ट्यूटोरियल => https://developer.ibm.com/articles/l-fuse/


0

हां, यह आमतौर पर एक कर्नेल ड्राइवर का उपयोग करके किया जाएगा जिसे या तो कर्नेल मॉड्यूल के रूप में लोड किया जा सकता है या कर्नेल में संकलित किया जा सकता है।

आप समान फाइल सिस्टम ड्राइवरों की जांच कर सकते हैं और वे यहां कैसे काम करते हैं

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


0

आप उपयोगकर्ता-भूमि फ़ाइल-सिस्टम बनाने के लिए फ्यूज का उपयोग कर सकते हैं, या कर्नेल मॉड्यूल लिख सकते हैं। फ्यूज के साथ करना आसान है, क्योंकि आपके पास भाषाओं का विकल्प है, और कर्नेल को क्रैश नहीं करेगा (और इसलिए पूरे सिस्टम को)।

कर्नेल मॉड्यूल तेज़ हो सकते हैं, लेकिन अनुकूलन का पहला नियम है: जब तक आपने कार्य कोड का परीक्षण नहीं किया है, तब तक ऐसा न करें। दूसरा यह जैसा है: ऐसा तब तक न करें जब तक कि आपके पास यह सबूत न हो कि यह बहुत धीमा है। और तीसरा: इसे तब तक न रखें जब तक आपके पास सबूत न हो कि यह इसे तेज / छोटा बनाता है।

और हाँ कर्नेल में पहले से ही हार्डवेयर के लिए ड्राइवर हैं, आप उन्हें फिर से लागू नहीं करते हैं।


प्रदर्शन के अलावा FUSE के लिए प्रमुख डाउनसाइड हैं: अपने रूट फाइल सिस्टम के लिए इसका उपयोग करना कठिन है। (शायद एक initrd के साथ संभव है, लेकिन FUSE बाइनरी को बूट करने के बाद मुक्त नहीं किया जा सका क्योंकि यह अभी भी रैमडिस्क से निष्पादित होगा।)
पीटर कॉर्डेस

1
@PeterCordes इसे मुक्त नहीं किया जा सका , लेकिन इसका मतलब यह नहीं है कि इसे अनलिंक नहीं किया जा सकता। यदि अभी भी इसका कोई संदर्भ है, तो यह ध्यान में रखा जाएगा कि क्या आपने इनट्रामरफ़्स को छोड़ दिया है या अंतर्निहित बाइनरी को हटा दिया है।
वन

@forest: सही है, इसलिए आप initrd को अनमाउंट नहीं कर सकते pivot_root, क्योंकि initramfs में अभी भी व्यस्त इनोड हैं।
पीटर कॉर्ड्स

एक /initinitramfs से शुरू होने वाली एक सामान्य (मुझे लगता है) pivot_root के /initबाद निष्पादित होती है, वास्तविक रूट FS के नियंत्रण को स्थानांतरित करने के लिए /init। लेकिन FUSE बाइनरी कर्नेल को जवाब देने वाले FUSE प्रक्रिया पर निर्भर रूट FS तक पहुंच होने पर, एफ़आईई बाइनरी खुद को निष्पादित नहीं कर सकता है। अच्छी तरह से हो सकता है कि पहले पेजकेस को पहले से ही प्राइम कर रहा हो, लेकिन यह विश्वसनीय नहीं लगता।
पीटर कॉर्ड्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.