क्या ड्राइवर मॉड्यूल स्वचालित रूप से लोड और अनलोड हैं?


15

उबंटू 14.04 पर, मैंने पाया कि जब मैं अपने बाहरी वायरलेस एडाप्टर में प्लग नहीं करता हूं, तब rt2800usbभी इसके मॉड्यूल को दिखाया जाता है lsmod

  1. ड्राइवर मॉड्यूल को स्वचालित रूप से लोड करने पर क्या होता है? क्या यह तब होता है जब डिवाइस कंप्यूटर से जुड़ा होता है, या जब ओएस बूट होता है?

  2. ड्राइवर मॉड्यूल को स्वचालित रूप से उतारने पर क्या होता है? क्या यह तब होता है जब डिवाइस कंप्यूटर से डिस्कनेक्ट हो जाता है, या जब ओएस बंद हो जाता है?

जवाबों:


13

जब कर्नेल एक नए उपकरण का पता लगाता है, तो यह प्रोग्राम चलाता है modprobeऔर इसे एक नाम देता है जो डिवाइस की पहचान करता है। अधिकांश उपकरणों को एक वेंडर और मॉडल के लिए पंजीकृत संख्याओं के माध्यम से पहचाना जाता है, जैसे पीसीआई या यूएसबी पहचानकर्ता। modprobeकार्यक्रम मॉड्यूल उर्फ तालिका सलाह भी लेता है फ़ाइल जो उस विशेष डिवाइस के लिए ड्राइवर शामिल हैं के नाम खोजने के लिए। एक समान सिद्धांत उन ड्राइवरों के लिए लागू होता है जो हार्डवेयर डिवाइस नहीं हैं, जैसे कि फाइल सिस्टम और क्रिप्टोग्राफिक एल्गोरिदम। अधिक जानकारी के लिए, देखें कि रिबूट के बाद डेबियन सीरियल पीसीआईघड़ी कार्ड का पता नहीं लगाता है/lib/modules/VERSION/modules.alias

एक बार modprobe ने पहचान लिया कि किस मॉड्यूल फ़ाइल ( .ko) में अनुरोधित ड्राइवर है, यह मॉड्यूल फ़ाइल को कर्नेल में लोड करता है: मॉड्यूल कोड को गतिशील रूप से कर्नेल में लोड किया जाता है। यदि मॉड्यूल सफलतापूर्वक लोड किया जाता है, तो यह सूची में से दिखाई देगा lsmod

मॉड्यूल की स्वचालित लोडिंग तब होती है जब कर्नेल नए हॉटप्लगबल हार्डवेयर का पता लगाता है, जैसे कि जब आप USB परिधीय कनेक्ट करते हैं। ऑपरेटिंग सिस्टम उन सभी हार्डवेयरों की गणना करने का एक पास भी करता है जो स्टार्टअप के दौरान सिस्टम पर मौजूद हैं, ताकि बूट समय पर मौजूद बाह्य उपकरणों के लिए ड्राइवरों को लोड किया जा सके।

मैन्युअल रूप से modprobeया insmodकमांड के साथ मॉड्यूल को लोड करने का अनुरोध करना भी संभव है । अधिकांश वितरणों में एक स्टार्टअप स्क्रिप्ट शामिल होती है जो सूचीबद्ध मॉड्यूल को लोड करती है /etc/modules। मॉड्यूल लोड होने के लिए एक और तरीका है यदि वे मॉड्यूल की निर्भरता हैं: यदि मॉड्यूल A मॉड्यूल B पर निर्भर करता है, तो modprobe AA लोड करने से पहले B को लोड करता है।

एक बार एक मॉड्यूल लोड होने के बाद, यह स्पष्ट रूप से अनलोड किए जाने तक लोड रहता है, भले ही उस ड्राइवर का उपयोग करने वाले सभी डिवाइस काट दिए गए हों। बहुत समय पहले, अप्रयुक्त मॉड्यूल को स्वचालित रूप से अनलोड करने के लिए एक तंत्र था, लेकिन इसे हटा दिया गया था, अगर मुझे सही याद है, जब udv दृश्य पर आया था। मुझे संदेह है कि स्वचालित मॉड्यूल उतारना एक सामान्य विशेषता नहीं है क्योंकि जिन प्रणालियों को इसकी आवश्यकता होती है वे ज्यादातर डेस्कटॉप पीसी होते हैं जिनकी वैसे भी बहुत सारी मेमोरी होती है (चालक कोड के पैमाने पर)।


धन्यवाद। मैंने संशोधित नहीं किया है /etc/modulesrt2800usbके आउटपुट में है lsmod, और इसका मतलब यह है कि मैंने बूट करने से पहले अपने डिवाइस को अपने कंप्यूटर से कनेक्ट किया है?
टिम

1
@ अगर मॉड्यूल लोड किया गया है, और आपने इसे स्पष्ट रूप से लोड नहीं किया है, और यह सूचीबद्ध नहीं है /etc/modules, तो हाँ, संभवतः कारण लोड किया गया है क्योंकि डिवाइस किसी बिंदु पर मौजूद था।
गिल्स एसओ- बुराई को रोकें '

5

मोड्यूल तब लोड किए जाते हैं जब सिस्टम बूट इनिशियल रैम डिस्क aka initrd के माध्यम से बूट होता है । औचित्य अनुभाग बताता है:

कई लिनक्स वितरण एक एकल, सामान्य लिनक्स कर्नेल छवि को जहाज करते हैं - एक जो वितरण के डेवलपर्स विशेष रूप से हार्डवेयर की एक विस्तृत विविधता पर बूट करने के लिए बनाते हैं। इस सामान्य कर्नेल छवि के लिए डिवाइस ड्राइवरों को लोड करने योग्य कर्नेल मॉड्यूल के रूप में शामिल किया गया है क्योंकि सांख्यिकीय रूप से कई ड्राइवरों को एक कर्नेल में संकलित करने से कर्नेल की छवि बहुत बड़ी हो जाती है, शायद सीमित मेमोरी वाले कंप्यूटरों पर बूट करने के लिए बहुत बड़ी है। इसके बाद बूट समय पर रूट फ़ाइल सिस्टम को माउंट करने के लिए आवश्यक मॉड्यूल का पता लगाने और लोड करने की समस्या को उठाया जाता है, या उस मामले के लिए, जहां या क्या रूट फाइल सिस्टम है, को घटाता है।

कई अन्य वितरणों की तरह, उबंटू हर डिवाइस ड्राइवर को इस initrd में लोड करने का विकल्प चुनता है, भले ही ड्राइवर की जरूरत हो या नहीं, और यह भी परवाह किए बिना कि डिवाइस सिस्टम पर मौजूद है या नहीं। जैसा कि जाइल्स ने बताया, पूरी चीज को रैम में लोड किया गया है, और फिर स्टार्टअप में उपयोग किए गए मॉड्यूल का पता लगाया जाता है, और अप्रयुक्त लोगों को रैम से हटा दिया जाता है। इस दृष्टिकोण का उपयोग करना सुनिश्चित करता है कि उबंटू हमेशा सेटअप की परवाह किए बिना किसी भी सिस्टम पर शुरू होगा। उबंटू सूक्ष्म कर्नेल निर्माणों का उपयोग करके एक अखंड कर्नेल की नकल कर रहा है। कारण इस काम को देखें


  1. मॉड्यूल rt2800usbको हमेशा बूटअप पर लोड किया जाएगा क्योंकि मॉड्यूल को उन इनट्रॉम्फ में शामिल किया गया था जिसे गिल्स ने संदर्भित किया था। Initramfs initrd का उत्तराधिकारी है, इसलिए इसे हमेशा दिखाया जाएगा lsmod। ध्यान दें कि आप modprobeमॉड्यूल नाम के बाद एक नए संकलित मॉड्यूल को कर्नेल में सम्मिलित कर सकते हैं ।

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

  1. किसी सिस्टम के चलने के दौरान मॉड्यूल को हटाने के लिए, आप कमांड का उपयोग कर सकते हैं जैसे कि rmmod, या modprobe -rमॉड्यूल नाम के बाद। अगले बूट पर मॉड्यूल को फिर से लोड किया जाएगा। ऊपर देखो। ज्यादातर मामलों में एक मॉड्यूल को गतिशील रूप से नहीं हटाया जाता है, क्योंकि यह हॉटप्लगिंग को अक्षम कर देगा, अर्थात जब एक मॉड्यूल को हटा दिया जाता है, तो इसका उपयोग करने पर डिवाइस को फिर से पता नहीं लगाया जा सकता है।

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


3
आप रैम को रैम में डिस्क के हिस्से के रूप में फ़ाइल लोड करने में भ्रमित कर रहे हैं और लोडिंग कर्नेल में मॉड्यूल को डायनामिक रूप से लिंक कर रहे हैं। मॉड्यूल को अस्थायी रूप से मेमोरी में लोड किया जाता है - कर्नेल में नहीं - initrd से (आजकल तकनीकी रूप से एक initramfs), लेकिन असली रूट के माउंट होने के बाद उन्हें मेमोरी से हटा दिया जाता है। मॉड्यूल केवल कर्नेल में लोड किए जाते हैं जब उनका उपयोग करने वाला उपकरण पता लगाया जाता है (कुछ अपवादों के साथ)।
गिलेस एसओ- बुराई को रोकना '

जब भी मैं यहां सहमत हूं, वह एक मॉड्यूल को उतारने और लोड करने के बारे में बात कर रहा था जो तब तक नहीं किया जा सकता जब तक कि वह उबंटू रैम डिस्क को फिर से कॉन्फ़िगर करने का विकल्प न चुन ले, जिसकी अनुशंसा नहीं की जाती है क्योंकि उबंटू रैम के सभी मॉड्यूल को हर कर्नेल अपडेट में लोड करने का विकल्प चुनता है। सभी मॉड्यूल हर बार लोड किए जाते हैं, वे बस सभी उपयोग नहीं किए जाते हैं।
eyoung100

2
नहीं, सवाल कर्नेल में एक मॉड्यूल को लोड करने और उतारने के बारे में है। न तो आपका मूल उत्तर और न ही आपका संशोधित उत्तर पते। Initramfs इस प्रश्न के लिए अप्रासंगिक (या अधिक परिधीय रूप से प्रासंगिक) है।
गाइल्स 'एसओ- बुराई को रोकना'

@ क्या यह बेहतर है ??
eyoung100

1
@ eyoung100, मैं गाइल्स से सहमत हूं। Initramfs की चर्चा प्रश्न के लिए प्रासंगिक नहीं है। मॉड्यूल आमतौर पर उपकरणों को एन्यूमरेट करके /sysऔर उन उपकरणों के लिए लोड किया जाता है जो वास्तव में सिस्टम में पाए जाते हैं। ऐसा होता है कि डिवाइस बूट पर मौजूद है या बाद में प्लग किया गया है। udevinitramfs / initrd की तुलना में इसके साथ करने के लिए बहुत कुछ है, और सभी या अधिकांश, या केवल कुछ मॉड्यूल को initramfs में कॉपी किया जाता है (एक कॉन्फ़िगरेशन विकल्प /etc/initramfs-tools/initramfs.conf) विशेष रूप से प्रासंगिक नहीं है।
सेलाडा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.