लिनक्स फाइलें कैसे बनाई जाती हैं?


112

लिनक्स में विशेष फाइलें हैं जो वास्तव में फाइलें नहीं हैं।

इनमें से सबसे उल्लेखनीय और स्पष्ट उदाहरण devफ़ोल्डर में हैं, "फाइलें" जैसे:

  • /dev/null - आपके द्वारा फाइल में लिखी गई किसी भी चीज को इग्नोर करें
  • /dev/random - एक फ़ाइल की सामग्री के बजाय यादृच्छिक डेटा आउटपुट
  • /dev/tcp - नेटवर्क पर इस फ़ाइल में आपके द्वारा लिखा गया कोई भी डेटा भेजता है

सबसे पहले, इन प्रकार की "फाइलों" का नाम क्या है जो वास्तव में किसी प्रकार की स्क्रिप्ट या भेस में बाइनरी हैं?

दूसरा, वे कैसे बनाए जाते हैं? क्या इन फ़ाइलों को एक कर्नेल स्तर पर सिस्टम में बनाया गया है, या क्या "मैजिक फाइल" खुद बनाने का एक तरीका है (कैसे के बारे में /dev/rickroll)?


1
मुझे इस सवाल का कोई सुराग नहीं था, खासकर जब से मैं जो खोज रहा हूं उसका नाम मुझे नहीं पता। किसी भी प्रासंगिक टैग में संपादित करने के लिए स्वतंत्र महसूस करें।
IQAndreas

15
BTW, यह यूनिक्स और यूनिक्स जैसे ऑपरेटिंग सिस्टम के डिजाइन का एक बुनियादी हिस्सा है: (लगभग) सब कुछ एक फाइल है, या एक फाइल की तरह दिखने के लिए बनाया जा सकता है।
कैस

5
इसे भी देखें: mknod (2) man 2 mknod
रोबर्टएल

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

10
सभी फाइलें, यहां तक ​​कि "वास्तविक" फाइलें, सॉफ्टवेयर कलाकृतियां हैं। हर डिवाइस, फ़ाइल, सॉकेट, विशेष फ़ाइल, या कुछ और अभी तक का आविष्कार किया जा करने के लिए पीछे सॉफ्टवेयर कार्यों को संभालने के लिए की एक तालिका प्रदान करता है open(), read(), close(), आदि उसके बाद, यह सॉफ्टवेयर पर निर्भर है
waltinator

जवाबों:


101

/dev/zeroएक "विशेष फ़ाइल" का उदाहरण है - विशेष रूप से, एक "डिवाइस नोड"। आम तौर पर इन distro स्थापना प्रक्रिया के द्वारा बनाई गई हो, लेकिन आप कर सकते हैं पूरी तरह से उन्हें स्वयं बनाते यदि आप चाहते हैं।

यदि आप के lsबारे में पूछें /dev/zero:

# ls -l /dev/zero
crw-rw-rw- 1 root root 1, 5  Nov 5 09:34 /dev/zero

शुरुआत में "सी" आपको बताता है कि यह एक "चरित्र उपकरण" है; अन्य प्रकार "ब्लॉक डिवाइस" ( ls"बी" के रूप में मुद्रित ) है। बहुत मोटे तौर पर, हार्डडिस्क जैसे रैंडम-एक्सेस डिवाइस ब्लॉक डिवाइस होते हैं, जबकि टेप ड्राइव या आपके साउंड कार्ड जैसी अनुक्रमिक चीजें चरित्र डिवाइस होती हैं।

"1, 5" भाग "प्रमुख डिवाइस नंबर" और "मामूली डिवाइस नंबर" है।

इस जानकारी के साथ, हम mknodअपने बहुत ही डिवाइस नोड बनाने के लिए कमांड का उपयोग कर सकते हैं :

# mknod foobar c 1 5

यह foobarवर्तमान फ़ोल्डर में नाम से एक नई फ़ाइल बनाता है , जो बिल्कुल वैसा ही काम करता है /dev/zero। (यदि आप चाहें तो आप निश्चित रूप से इस पर अलग-अलग अनुमतियाँ सेट कर सकते हैं।) यह सब "फ़ाइल" वास्तव में ऊपर तीन आइटम है - डिवाइस का प्रकार, प्रमुख संख्या, मामूली संख्या। आप lsअन्य उपकरणों के लिए कोड देखने के लिए उपयोग कर सकते हैं और उन्हें फिर से बना सकते हैं। जब आप ऊब जाते हैं, rmतो बस आपके द्वारा बनाए गए डिवाइस नोड्स को हटाने के लिए उपयोग करें।

मूल रूप से प्रमुख संख्या लिनक्स कर्नेल को बताती है कि किस डिवाइस ड्राइवर से बात करनी है, और छोटी संख्या डिवाइस ड्राइवर को बताती है कि आप किस डिवाइस के बारे में बात कर रहे हैं। (उदाहरण के लिए, आपके पास संभवतः एक SATA नियंत्रक है, लेकिन शायद कई हार्डडिस्क इसमें प्लग किए गए हैं।)

यदि आप कुछ नया करने वाले नए उपकरणों का आविष्कार करना चाहते हैं ... अच्छी तरह से, आपको लिनक्स कर्नेल के लिए स्रोत कोड को संपादित करने और अपने स्वयं के कस्टम कर्नेल को संकलित करने की आवश्यकता होगी। तो चलो ऐसा नहीं है! :-) लेकिन आप उन डिवाइस फ़ाइलों को जोड़ सकते हैं, जिन्हें आपने पहले ही ठीक कर लिया है। Udv जैसी स्वचालित प्रणाली मूल रूप से केवल डिवाइस ईवेंट और कॉलिंग mknod/ rmस्वचालित रूप से आपके लिए देख रही है । इससे ज्यादा मैजिक कुछ नहीं।

अभी भी अन्य प्रकार की विशेष फाइलें हैं:

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

  • एक सिमलिंक एक विशेष फ़ाइल है। (लेकिन एक कड़ी कड़ी नहीं है।) आप ln -sकमांड का उपयोग करके सहानुभूति बना सकते हैं । (इसके लिए मैनपेज देखें।)

  • एक "नामित पाइप" या "एफआईएफओ" (पहली-इन, पहली-आउट कतार) नामक एक चीज भी है। आप के साथ एक बना सकते हैं mkfifo। एक एफआईएफओ एक जादुई फाइल है जिसे एक साथ दो कार्यक्रमों द्वारा खोला जा सकता है - एक रीडिंग, एक राइटिंग। जब ऐसा होता है, तो यह एक सामान्य शेल पाइप की तरह काम करता है। लेकिन आप प्रत्येक कार्यक्रम को अलग से शुरू कर सकते हैं ...

एक फाइल जो किसी भी तरह से "विशेष" नहीं है, उसे "नियमित फ़ाइल" कहा जाता है। आप कभी-कभी यूनिक्स दस्तावेज़ में इसका उल्लेख देखेंगे। इसका यही अर्थ है; एक फ़ाइल जो एक डिवाइस नोड या एक सिमलिंक या जो कुछ भी नहीं है। बस एक सामान्य, हर दिन कोई जादुई गुण वाली फ़ाइल।


4
एक और प्रकार की विशेष फ़ाइल भी है, एक यूनिक्स डोमेन सॉकेट जो कि फाइल सिस्टम के लिए बाध्य है।
ब्रायन बी

8
यदि आप के साथ खेलना चाहते हैं mknod, तो cat /proc/devicesसभी ड्राइवरों के लिए प्रमुख संख्याएँ देखें। जो हमें एक और तरह की विशेष फाइल /procफाइल सिस्टम में लाती है ( यह उत्तर इसके बारे में बात करता है)।
21

8
अन्य यूनियनों ने अपनी विशेष फाइलों का आविष्कार किया है, जैसे कि सोलारिस के दरवाजे थे
केविन

6
माइनर नाइटपिक: आपको एक नया चरित्र / ब्लॉक डिवाइस लिखने के लिए कर्नेल को फिर से जोड़ने की जरूरत नहीं है :) crashcourse.ca/introduction-linux-kernel-programming/… अन्यथा यह वास्तव में एक अच्छा जवाब है, +1!
कमांडर धनिया सलामंदर

1
@ मैमेटेमिकलऑर्चिड: एक कदम आपका उत्तर गायब है (या कम से कम केवल अंतर्निहित रूप से बताते हुए) यह तथ्य है कि उन विशेष फ़ाइलों को प्रच्छन्न शेल स्क्रिप्ट या बायनेरी बिल्कुल भी नहीं है (जैसा कि प्रश्न निहित है), लेकिन मौजूद कार्यक्षमता तक पहुंचने के लिए एक इंटरफ़ेस है। OS कर्नेल में।
सपने देखने वाला

34

अधिकांश /devप्रविष्टियाँ ब्लॉक डिवाइस इनोड या कैरेक्टर डिवाइस इनोड हैं। विकिपीडिया में इसके बारे में कई विवरण हैं, जिन्हें मैं दोहराने नहीं जा रहा हूं।

लेकिन /dev/tcpआपके प्रश्न में जो उल्लेख किया गया है, वह किसी भी मौजूदा उत्तर द्वारा नहीं समझाया गया है। /dev/tcpऔर /dev/udpअधिकांश अन्य /devप्रविष्टियों से अलग हैं । ब्लॉक और चरित्र उपकरणों गिरी द्वारा कार्यान्वित किया जाता है, लेकिन /dev/tcpऔर /dev/udpउपयोगकर्ता मोड में लागू किया जाता है।

बैश शेल एक प्रोग्राम है जिसका कार्यान्वयन /dev/tcpऔर /dev/udp(से कॉपी किया हुआ ksh93) है। जब आप बैश पुनर्निर्देशन ऑपरेटरों के साथ नीचे एक रास्ता खोलने की कोशिश करते हैं, तो यह एक साधारण openसिस्टम कॉल नहीं करेगा । इसके बजाय bash एक TCP सॉकेट बनाएगा और इसे निर्दिष्ट पोर्ट से जोड़ेगा।

इसे उपयोगकर्ता मोड में लागू किया जाता है और केवल कुछ कार्यक्रमों में जैसा कि निम्नलिखित उदाहरण में देखा जा सकता है जो कि खोलने bashऔर catखोलने के प्रयास के बीच के अंतर को प्रदर्शित करता है/dev/tcp/::1/22

$ cat /dev/tcp/::1/22
cat: /dev/tcp/::1/22: No such file or directory
$ cat < /dev/tcp/::1/22
SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.3

इसके साथ एक अंतर ksh93यह है कि bashकेवल उन टीसीपी कनेक्शनों को पुनर्निर्देशन ऑपरेटरों के साथ किया जाएगा, अन्य जगहों पर नहीं जहां यह फाइल sourceया .बिलिन जैसी फाइलें खोल सकता है ।


इसके अलावा, GNU gawkइसी तरह के विशेष मामलों को जागृत करता है /inet{,4,6}/{tcp,udp}/$port/$remote/$rport, क्योंकि 2010 के आसपास कहीं भी (मुझे ठीक से याद नहीं है और जारी नोट नहीं मिल सकते हैं)।
dave_thompson_085

6
IMO, बिंदु के बारे /dev/tcpमें बताने का एक बेहतर तरीका यह है कि यह फ़ाइल नहीं है। इसमें कभी कोई फाइल नहीं होती है । कुर्सियां ​​खोलने के लिए बैश का सिंटैक्स /dev/tcp/addressएक फ़ाइल नाम की तरह स्ट्रिंग का उपयोग करता है , लेकिन इसे "उपयोगकर्ता स्थान में लागू की गई फ़ाइल" कहना अजीब लगता है। दिलचस्प है कि kshसब कुछ के लिए उन फ़ाइल नाम हुक, न केवल पुनर्निर्देशित, हालांकि। यह "एक फ़ाइल को लागू करने" के करीब है।
पीटर कॉर्डेस

@PeterCordes मेरा मानना ​​है कि UWIN इन्हें वास्तविक फाइलों के रूप में सेट करता है। और मुझे लगता है कि 3dfs वही करता है। याद रखें, bashकेवल इस व्यवहार की नकल की है, लेकिन यह कहीं और उत्पन्न होता है।
मिकसेर

19

अन्य जवाबों में समझाया गया डिवाइस नोड्स के अलावा ( mknod (2) के साथ बनाया गया है या कुछ devfs द्वारा आपूर्ति की गई है ), लिनक्स में अन्य "जादुई" फाइलें हैं, जो विशेष वर्चुअल फ़ाइल सिस्टम द्वारा प्रदान की जाती हैं , विशेष रूप से /proc/(देखें खरीद (5) , procfs के बारे में पढ़ें ) और /sys/( sysfs के बारे में पढ़ें )।

ये छद्म फाइलें (जो स्टेट- ऑफ स्टेट (2) - साधारण फाइलों के रूप में, उपकरणों के रूप में नहीं) कर्नेल द्वारा प्रदान की गई एक आभासी दृश्य हैं; विशेष रूप से, /proc/(जैसे कि cat /proc/$$/maps, या खुले में (2) -अपने /proc/self/statusप्रोग्राम में) से पढ़ना आम तौर पर डिस्क या नेटवर्क से किसी भी शारीरिक I / O को शामिल नहीं करता है, इसलिए यह काफी तेज है।

कुछ अतिरिक्त छद्म फ़ाइल में बनाने के लिए /proc/आप आमतौर पर अपने स्वयं के लिखना चाहिए कर्नेल मॉड्यूल और इसे लोड (देखें उदाहरण के लिए इस )।


3
AFAIK को बढ़ाने / खरीदने की जानकारी पुरानी है। जबकि तकनीकी रूप से अभी भी संभव है, / खरीद (या बल्कि खरीद) केवल चल रही प्रक्रियाओं पर जानकारी रखना चाहिए। अन्य सभी छद्म फाइलें जिनमें कर्नेल के लिए रनटाइम जानकारी या कॉन्फ़िगरेशन विकल्प शामिल हैं, उन्हें / sys (sysfs) में जाना चाहिए। संगतता कारणों से अभी भी कुछ गैर-प्रक्रिया-संबंधित छद्म फाइलें / खरीद (उदाहरण के लिए मेमिनोफ, क्यूपिनो) हैं, लेकिन नई छद्म फाइलें sysfs में जानी चाहिए।
सपने देखने वाला

13

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

अन्य "विशेष" फ़ाइल प्रकार भी हैं, जिनमें नामित पाइप और पोज़ोस और सॉकेट शामिल हैं।


9

जैसा कि अन्य उपयोगकर्ताओं ने पहले से ही महान विस्तार से समझाया है, विशेष फ़ाइलों को उन्हें वापस करने के लिए कोड की आवश्यकता होती है। हालाँकि, किसी ने यह उल्लेख नहीं किया है कि लिनक्स उस कोड को यूजरस्पेस में लिखने के कई तरीके प्रदान करता है:

फ्यूज (यूज़रस्पेस में फ़ाइल) आप की तरह कुछ लिखने की अनुमति देता /procगिरी दुर्घटनाग्रस्त के जोखिम के बिना और यह अपनी पसंद का एक भाषा / क्रम, इस तरह के रूप में क्या जाओ , Node.js , पर्ल , पीएचपी , अजगर , रूबी , जंग , आदि

इसका यह भी लाभ है कि FUSE फाइलसिस्टम बिना माउंट किए जा सकते हैं sudoक्योंकि वे बढ़ते उपयोगकर्ता के रूप में चलते हैं।

यहाँ उन चीजों के कुछ उदाहरण दिए गए हैं जिन्हें लोगों ने FUSE के उपयोग से लिखा है:

  • MP3fs (अपनी FLAC फ़ाइलों को MP3 फ़ाइलों के रूप में देखें, जो आपके द्वारा अपने MP3 प्लेयर पर कॉपी / क्लिक-ड्रैग करने पर ऑन-द-फ्लाई बन जाती हैं)
  • PyTagsFS (मेटाडाटा टैग से निर्मित आभासी फ़ोल्डरों के पेड़ में अपना मीडिया देखें)
  • फ्यूज-जिप (माउंट जिप फाइल को फोल्डर के रूप में)
  • फ़्यूज़िसो (रूट अनुमति के बिना माउंट आईएसओ)
  • iFUSE (माउंट iDevices)
  • फ्यूसेडाव (माउंट वेबदाव शेयर)
  • फ़्यूज़-एक्सफ़ैट (माउंट एक्सफ़ैट -स्वरूपित फ़ाइल सिस्टम)
  • NTFS-3 जी ( लिनक्स NTFS ड्राईवर)

B. यदि आप एक कीबोर्ड, माउस, जॉयस्टिक आदि जैसे वर्चुअल इनपुट डिवाइस बनाना चाहते हैं (उदाहरण के लिए, जिस USB डिवाइस का आप उपयोग करने के लिए बात कर रहे हैं, उसके लिए एक यूजरस्पेस ड्राइवर लिखना है libusb), तो uinput है

इसके लिए बाइंडिंग कठिन है, लेकिन मुझे पता है कि वे गो (कीबोर्ड-ओनली), पायथन और रूबी (2) के लिए मौजूद हैं

वास्तविक विश्व यूनीपुट उपयोग के उदाहरणों में शामिल हैं:

  • G15Daemon (एलसीडी और गेमिंग यूनिट के लिए लिनक्स ड्राइवर, Logitech G15 गेमिंग कीबोर्ड पर)
  • ds4drv (सोनी डुअलशॉक 4 कंट्रोलर्स के लिए ड्राइवर)
  • Xboxdrv (वैकल्पिक XBox 360 कंट्रोलर ड्राइवर और लिनक्स x360ce के समान बुरी तरह से डिज़ाइन किए गए गेम जैसे Runner2: फ्यूचर लेजेंड ऑफ़ रिदम एलियन सोच सकते हैं कि वे असली XBox कंट्रोलर से बात कर रहे हैं जब वे नहीं होते)
  • पुराने Wiimote ड्राइवर जैसे cwiid , जिन्हें किसी को अंतिम रूप से कर्नेल Wiimote ड्राइवर लिखना आवश्यक था, इसलिए डिफ़ॉल्ट रूप से समर्थन उपलब्ध होगा।

C. सामान्य वर्ण उपकरणों के लिए, CUSE ( USErspace में वर्ण उपकरण) है। हालांकि यह बहुत कम लोकप्रिय है।

: क्यूस एपीआई के केवल उपयोगकर्ता है कि मैं व्यक्तिगत रूप से की के बारे में पता कर रहा हूँ एक ही प्रोग्राम है जो इसके निर्माण के लिए प्रेरित किया है osspd है, जो लागू करता है /dev/dsp, /dev/adspऔर /dev/mixerयूज़रस्पेस में (ओएसएस ऑडियो एपीआई) तो वे पल्सऑडियो या dmix के माध्यम से रूट किया जा सकता है।

एकमात्र CUSE बाइंडिंग जो मैं पा रहा था वह cusepy है , जिसे 2010 से अपडेट नहीं किया गया है।

D. आपको किसी नई विशेष फ़ाइल की आवश्यकता नहीं हो सकती है।

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


1
cusepy को शायद थोड़ी देर में अपडेट नहीं किया गया है (वास्तव में, यह कभी भी अपडेट नहीं किया गया है; इसमें केवल एक ही प्रतिबद्ध है!), लेकिन कुछ सप्ताह पहले cusepy का उपयोग करके केवल एक चरित्र उपकरण लिखा है, मैं पुष्टि कर सकता हूं कि यह अभी भी ठीक काम करता है। इसे लागू करने से संबंधित कुछ फ़ंक्शन याद आ रहे थे poll, लेकिन चूंकि cusepy ctypes का उपयोग करता है और बाइ हेडिंग C हेडर फ़ाइलों के आधार पर ऑटोजेनरेटेड होते हैं, इसलिए किसी भी लापता फ़ंक्शंस को ठीक करना वांछित फ़ंक्शन का नाम निर्यात किए गए फ़ंक्शन की सूची में जोड़ने की बात है setup.py
अलेक्सई तोरोमो

1
FUSE उपयोग का एक और दिलचस्प उदाहरण sshfs है । यह आपको दूरस्थ फ़ाइल सिस्टम को ब्राउज़ करने की अनुमति देता है जैसे कि यह SSH कनेक्शन के नीचे स्थानीय था।
श्री डेथलेस

@ Mr.Deathless हाँ। मैं वास्तव में इसका उपयोग करता हूं और इसका उल्लेख करना चाहता हूं लेकिन मैं भूल गया।
ssokolow 18

6

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

उदाहरण के लिए, /dev/nullबाइट को नजरअंदाज करते हुए, केवल लिखने के लिए फ़ंक्शन कुछ भी नहीं करता है। के लिए पढ़ने के समारोह /dev/randomरिटर्न एक यादृच्छिक संख्या।


1

mount -t devtmpfs

यह देखना भी दिलचस्प है कि आधुनिक प्रणालियों में, /devसामान्य रूप से फाइलसिस्टम प्रकार होता है जिसे आप जहां चाहें वहां माउंट किया जा सकता है। उबंटू 16.04:

mkdir d
sudo mount -t devtmpfs none d
head -c 10 d/random
sudo umount d

यह सक्षम है CONFIG_DEVTMPFS=y, और कर्नेल को आवश्यकतानुसार डिवाइस फ़ाइलों को बनाने और नष्ट करने की अनुमति देता है।

CONFIG_DEVTMPFS_MOUNT=y

यह विकल्प कर्नेल ऑटो-माउंट devtmpfs ऑन करता है /dev

drivers/base/Kconfig दस्तावेज:

config DEVTMPFS_MOUNT
    bool "Automount devtmpfs at /dev, after the kernel mounted the rootfs"
    depends on DEVTMPFS
    help
      This will instruct the kernel to automatically mount the
      devtmpfs filesystem at /dev, directly after the kernel has
      mounted the root filesystem. The behavior can be overridden
      with the commandline parameter: devtmpfs.mount=0|1.
      This option does not affect initramfs based booting, here
      the devtmpfs filesystem always needs to be mounted manually
      after the rootfs is mounted.
      With this option enabled, it allows to bring up a system in
      rescue mode with init=/bin/sh, even when the /dev directory
      on the rootfs is completely empty.

file_operations

अंत में, आपको वास्तव में क्या चल रहा है, यह देखने के लिए आपको अपना चरित्र डिवाइस कर्नेल मॉड्यूल बनाना चाहिए।

यहाँ एक न्यूनतम रननीय उदाहरण है: अंडरस्टैंडिंग कैरेक्टर डिवाइस (या कैरेक्टर स्पेशल) फाइल्स

सबसे महत्वपूर्ण कदम, file_operationsसंरचना की स्थापना कर रहा है , जैसे:

static const struct file_operations fops = {
    .owner = THIS_MODULE,
    .read = read,
    .open = open,
};

static int myinit(void)
{
    major = register_chrdev(0, NAME, &fops);
    return 0;
}

जिसमें फ़ंक्शन पॉइंटर्स होते हैं जो प्रत्येक फ़ाइल-संबंधित सिस्टम कॉल के लिए कॉल किए जाते हैं।

फिर यह स्पष्ट हो जाता है कि आप जो चाहें फाइल-संबंधित सिस्टम कॉल को ओवरराइड कर सकते हैं, और इस तरह से कर्नेल उपकरणों को पसंद करते हैं /dev/zero

/devबिना स्वचालित रूप से प्रविष्टियाँ बनाएँmknod

अंतिम रहस्य यह है कि कर्नेल स्वचालित रूप से कैसे /devप्रविष्टियां बनाता है ।

तंत्र को एक कर्नेल मॉड्यूल बनाकर देखा जा सकता है जो कि अपने आप को जैसा दिखाया गया है: https://stackoverflow.com/questions/5970595/how-to-create-a-device-node-from-the-init-module- कोड-ऑफ-ए-लाइनक्स-कर्नेल-मॉड्यूल / 45531867 # 45531867 और device_createकॉल करने के लिए नीचे आता है ।


OpenBSD में एक स्क्रिप्ट MAKEDEV है जो इसे थोड़ा सरल करता है, man.openbsd.org/MAKEDEV.8 देखें, यह निश्चित रूप से नहीं है कि लिनक्स के पास इसके अलावा और जटिल क्यों नहीं है। शायद भागों को अनुकूलित किया जा सकता है। आप उदाहरण के लिए MKNOD ट्टी कह सकते हैं और यह विवरण को संभालता है।
एलन कोरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.