लिनक्स कर्नेल-निर्माण प्रक्रिया के प्रत्येक चरण में क्या होता है?


27

मैंने उन कस्टम कर्नेल और बूट उबंटू का निर्माण करने के बारे में कई ट्यूटोरियल पढ़े हैं, और उन गुठली का उपयोग करके, और सफलतापूर्वक गाइड और बूट किए गए कस्टम कर्नेल का पालन किया है, लेकिन मुझे इस बारे में कोई समझ नहीं है कि गाइड में प्रत्येक कमांड क्या करती है और वास्तव में क्या हो रहा है प्रत्येक आदेश।

प्रक्रिया पर वर्णित उबंटू की साइट के साथ बहुत काम करता है fakeroot, dpkg, make-kpkg, कुछ initramfs, और अन्य भयानक सामान है कि काम करता है, लेकिन बस में मदद नहीं करता मुझे समझने क्या चल रहा है।

  • makeएक लिनक्स कर्नेल निर्देशिका में आउटपुट क्या है ?
  • क्या यह "संपीड़ित कर्नेल छवि" बनाता है?
  • "संपीड़ित कर्नेल छवि" फ़ाइल का नाम क्या है और इसे कहाँ रखा गया है?
  • क्या करता make modulesहै?
  • make modulesपहले या बाद में किया जाना चाहिए make?
  • makeस्वचालित रूप से मेरे मॉड्यूल का निर्माण नहीं करता है ?
  • बूट किए गए गुठली की सूची में नवनिर्मित गुठली जोड़ने की प्रक्रिया (अंग्रेजी में, न केवल आदेशों की सूची) क्या है?
  • क्या करता make installहै?
  • make installइसे बूट करने योग्य कर्नेल की मेरी सूची में जोड़ देगा ताकि मुझे और कुछ करने की ज़रूरत न पड़े?
  • क्या कोई समकक्ष है make modules_install?

इसे कई प्रश्नों में विभाजित किया जाना चाहिए।
सिरो सेंटिल्ली 新疆 改造 i i 事件 '

जवाबों:


34

ऊपर से...

  • makeसंकलन और कर्नेल छवि को जोड़ता है। यह एक सिंगल फाइल है जिसका नाम है vmlinuz
  • make modulesMकर्नेल कॉन्फ़िगरेशन के दौरान आपके द्वारा पूछे गए प्रत्येक प्रश्न के लिए अलग-अलग फ़ाइलों को संकलित करता है । ऑब्जेक्ट कोड आपके हौसले से बनाए गए कर्नेल के खिलाफ जुड़ा हुआ है। (सवालों के जवाब के लिए Y, ये पहले से ही का हिस्सा हैं vmlinuz, और सवालों के जवाब के लिए Nउन्हें छोड़ दिया जाता है)।
  • make installआपके द्वारा निर्मित कर्नेल को स्थापित करता है /vmlinuz
  • make modules_installकरने के लिए अपने कर्नेल मॉड्यूल स्थापित करता है /lib/modulesया /lib/modules/<version>

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

उबंटू प्रलेखन में अतिरिक्त "भयानक सामान" एक debपैकेज बनाने के लिए अतिरिक्त सामान है । जब आप इसे अपने से अधिक के लिए कर रहे हैं तो इसे पैकेज करना कहीं बेहतर है। आप समय में बदल देंगे।

कर्नेल और मॉड्यूल का निर्माण अलग रखा जाता है क्योंकि जिन लोगों को (यानी, कर्नेल डेवलपर्स) की आवश्यकता होती है, वे अक्सर केवल एक मॉड्यूल में बदलाव कर रहे हैं। वे अपने परिवर्तन लागू कर सकते हैं, पुनर्निर्माण कर सकते हैं और बस मॉड्यूल स्थापित कर सकते हैं। यह बहुत समय बचाता है जब इसे दिन में 20 बार करना पड़ता है। यह एक भी make everythingआदेश के लिए अद्यतन नहीं किया जाएगा । आप इसके बजाय, make && make modules && make install && make modules_install जैसे दस्तावेज़ कहते हैं , वैसे ही चलाएं । निर्माण प्रक्रिया कर्नेल डेवलपर्स का पक्षधर है, आप नहीं। और यही तरीका होना चाहिए।

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

ऐसा नहीं है कि मैं आपको अपना कर्नेल बनाने से रोक रहा हूं, मैं वास्तव में आपको इसे करने के लिए प्रोत्साहित करता हूं। मुझे लगता है कि खरोंच से अपने कर्नेल का निर्माण करना सीखने के लिए एक अमूल्य अभ्यास है कि यह कैसे काम करता है। भाग में, क्योंकि शायद एक दिन तुम जाएगा अपवाद है कि करने की जरूरत हो। लेकिन यह आपको सामान्य रूप से कर्नेल और बूट प्रक्रिया के बारे में बहुत कुछ सिखाता है। आप इसे करने के लिए एक बेहतर व्यक्ति होंगे।


1
प्रक्रिया के मानव-पठनीय विवरण के लिए बहुत बहुत धन्यवाद। मुझे कुछ संदेह है। मेरी कर्नेल संकलन ने vmlinux का उत्पादन किया और vmlinuz का नहीं। मुझे लगता है कि अंतर संपीड़न है। क्या मुझे छवि को मैन्युअल रूप से संपीड़ित करना चाहिए? है /vmlinuzरूट फ़ोल्डर में एक निर्देशिका? जब मैं एक मेक इन इंस्टाल करता हूं तो क्या यह डायरेक्टरी बनाई जाएगी और नए कर्नेल को वहां रखा जाएगा? make modules_installमेरे वर्तमान में स्थापित मॉड्यूल को बदल देगा ? मान लीजिए कि मैं अपना vmlinux / बूट डायरेक्टरी में रखता हूं, तो क्या मुझे कुछ और करने की ज़रूरत है (जैसे ग्रब कॉन्फ़िगरेशन फ़ाइलों को संपादित करें और उसके बाद ग्रब-अपडेट या कुछ और करें?)
अंकुरज

3
आप सही हैं, अंतर संपीड़न है। कमांड make bzimageवही है जो करता है। /vmlinuzएक बाइनरी फ़ाइल है, निर्देशिका नहीं है। मैं पिछले 5 वर्षों से केवल पैकेज्ड कर्नेल बना रहा हूं, इसलिए मुझे modules_installसीधे स्थापित कर्नेल के लिए व्यवहार बिल्कुल याद नहीं है । ग्रब आपकी /bootमदद के बिना कर्नेल को ढूंढेगा । हाँ, आपको grub-updateएक नया कर्नेल स्थापित करने के बाद हमेशा चलना चाहिए ।
bahamat

तो मुझे make bzimageइसके बजाय क्या करना चाहिए था make? क्या मुझे बार make clean- make bzimageबार करने की आवश्यकता है ? तक /vmlinuzआप फ़ाइल मतलब है रूट निर्देशिका में या लिनक्स कर्नेल स्रोत निर्देशिका में बनाया जाएगा?
अंकुरज

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

1
@GuyAvraham मॉड्यूल के जवाब Yमें संकलित किया गया है (यानी, वे vmlinuz का हिस्सा हैं)। उत्तर Mदिए गए मॉड्यूल लोड करने योग्य मॉड्यूल के रूप में संकलित किए गए हैं। उत्तर Nदिए गए मॉड्यूल संकलित नहीं हैं। make modules_installकेवल उन लोगों के लिए लागू होता है जिनका उत्तर दिया गया है M
bahamat
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.