कर्नेल को फिर से जोड़ने का एक सरल तरीका क्या है?


41

मैं Ubuntu 12.04 x86 64 बिट के तहत एक नया कर्नेल संकलित करने में रुचि रखता हूं।

मुझे यह विकी पेज मिला, जो मूल रूप से इस ब्लॉग के लिए एक दर्पण है और इसमें बहुत सारे चरण ( गिट , इत्यादि) हैं जो मुझे बेकार लगते हैं।

पहले रिलीज़ / डिस्ट्रोस के साथ, मैं एक .configफ़ाइल बनाता था और Makefileयदि मुझे ज़रूरत थी तो उसे संशोधित करता था, फिर बस चलता है makeऔर यह पूरा हो गया है।

क्या उबंटू के तहत ऐसा करने का एक सरल तरीका है?


जवाबों:


39

1. apt-get sourceकर्नेल के Ubuntu संस्करण को डाउनलोड करने के लिए उपयोग करें

apt-get source linux-image-$(uname -r)

उदाहरण के लिए, एक फ़ोल्डर देता है:

linux-3.2.0 linux_3.2.0-26.41.dsc
 linux_3.2.0-26.41.diff.gz   linux_3.2.0.orig.tar.gz

बोल्ड किए गए अंतर में सभी उबंटू / डेबियन अनुकूलन शामिल हैं।

2. अपने खुद के साथ एक स्टॉक कर्नेल बनाने के .configलिए, "पुराने जमाने" डेबियन make-kpkgविधि का उपयोग करें

यह विकी में वर्णित पुराने ढंग का वैकल्पिक तरीका है :

sudo apt-get install kernel-package

यदि आप पहली बार कर्नेल संकलित कर रहे हैं:

sudo apt-get build-dep linux-image-$(uname -r)

फिर cdस्रोत निर्देशिका (यहां linux-3.2.0) में, और या तो अपने चलने वाले कर्नेल के कॉन्फ़िगरेशन के साथ फ़ाइल make oldconfigबनाने के लिए चलाएं .config, या .configइस निर्देशिका में तीसरे भाग की प्रतिलिपि बनाएँ ।

आप एक पाठ या चित्रमय विन्यास चाहते हैं पर निर्भर करता है, स्थापित करें:

(पाठ)

sudo apt-get install libncurses5 libncurses5-dev

(ग्राफ़िकल)

sudo apt-get install qt3-dev-tools libqt3-mt-dev

और फिर चलाएं:

(पाठ)

make menuconfig

(ग्राफ़िकल)

make xconfig

जब पूरा हो जाए, तो दौड़ें:

fakeroot make-kpkg -j N --initrd --append-to-version=my-very-own-kernel kernel-image kernel-headers

जहां Nसमानांतर में चलाने के लिए कितनी नौकरियां हैं (आमतौर पर आपके पास सीपीयू की संख्या), और my-very-own-kernelइस निर्माण की पहचान करने के लिए एक कस्टम स्ट्रिंग है।

जब किया जाता है, तो कर्नेल छवि और हेडर फाइलें माता-पिता की निर्देशिका में डीबीएस के रूप में तैयार होंगी; आप उन्हें स्थापित कर सकते हैं sudo dpkg -i, जिसमें GRUB प्रविष्टियाँ आदि जोड़ने का भी ध्यान रखा जाएगा।


क्यों वे आपको इस अंतर के बारे में कुछ नहीं बताते हैं, मेरे लिए एक अंतर सिर्फ एक अंतर है, इसमें सब कुछ हो सकता है।
user827992

मुझे नहीं पता, आपको उनसे (कैनन की कर्नेल टीम के लिए) पूछना होगा। मैंने आपको बस इसे बनाने का तरीका बताया था;)
ish

1
ठीक है, आखिरी सवाल, इस संपीड़ित अंतर को कैसे लागू किया जाए? : DI को linux-3.2.0डायरेक्टरी में जाना है और भागना है patch -p1 <../patch.diff?
user827992

1
अंतर को लागू करने की कोई आवश्यकता नहीं है ; apt-get source ...तुम्हारे लिए पहले से ही है!
ish

2
-1 आप इसे "पुराने जमाने का" कहते हैं, मैं इसे पुराना कहता हूं। fakeroot debian/rules editconfigs, fakeroot debian/rules clean, fakeroot debian/rules binaryसही, समस्या से मुक्त तरीका है।
Aleksandr Dubinsky

19

यहाँ कदम हैं। यह प्रक्रिया nixCraft की हाउ टू: कंपाइल लिनक्स कर्नेल 2.6 - लेकिन आधुनिकीकरण पर आधारित है।

जिस कर्नेल को आप बनाना चाहते हैं उसका सोर्स कोड डाउनलोड करें और निकालें।

आप kernel.org पर अपस्ट्रीम कर्नेल सोर्स कोड प्राप्त कर सकते हैं । संस्करण 3.16.1 (इस लेखन के रूप में नवीनतम स्थिर कर्नेल) का उपयोग यहां किया जाएगा। यदि आपको किसी भिन्न संस्करण का उपयोग कर रहे हैं, तो आपको इन आदेशों को संशोधित करने की आवश्यकता हो सकती है।

वर्तमान में कर्नेल स्रोत कोड प्रदान किया गया है। टारxz अभिलेखागार, इसलिए जो भी संस्करण आप चाहते हैं, उसके द्वारा "tar.xz" लिंक पर क्लिक करें:

kernel.org से स्क्रीनशॉट, डाउनलोड करने के लिए उपलब्ध कर्नेल स्रोत अभिलेखागार दिखा रहा है

cdउस निर्देशिका में शामिल होने के बाद जहां आपने संग्रह डाउनलोड किया है, आप इसे इसके साथ निकाल सकते हैं tar:

tar xf linux-3.16.1.tar.xz

आवश्यक बिल्ड टूल इंस्टॉल करें और कर्नेल कॉन्फ़िगरेशन करें।

उबंटू के प्राप्त करने के लिए toolchain ( gcc, make, और आगे) स्थापित निर्माण आवश्यकबिल्ड-एसेंशियल इंस्टॉल करें metapackage:

sudo apt-get update
sudo apt-get install build-essential

क्या आपके कर्नेल में चला जाता है कॉन्फ़िगर करने के लिए दो यथोचित उपयोगकर्ता के अनुकूल तरीके से प्रदान की जाती हैं makeलक्ष्यों xconfigऔर menuconfig

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

ग्राफिक रूप से कॉन्फ़िगर करने के लिए , libqt4-devLibqt4-dev स्थापित करें और pkg-configPkg-config इंस्टॉल करें इंस्टॉल करेंऔर चलाएंmake xconfig:

sudo apt-get install libqt4-dev pkg-config
make xconfig

टर्मिनल में कॉन्फ़िगर करने के लिए , इंस्टॉल करेंlibncurses5-dev(इस जानकारी केलिए हन्नू को धन्यवाद) और चलाएंmake menuconfig:

sudo apt-get install libncurses5-dev
make menuconfig

कॉन्फ़िगर किए गए कर्नेल का निर्माण करें।

कर्नेल को संकलित करने और बनाने के लिए पहले इसे चलाएं vmlinuz:

make

vmlinuz"कर्नेल है।" विशेष रूप से, यह कर्नेल छवि है जो असम्पीडित होगी और मेमोरी में GRUB या आपके द्वारा उपयोग किए जाने वाले अन्य बूट लोडर द्वारा लोड की जाएगी ।

फिर लोड करने योग्य कर्नेल मॉड्यूल बनाएं :

make modules

अपने नव निर्मित गिरी स्थापित करें।

उन makeआदेशों को सफलतापूर्वक पूरा करने पर, नए कर्नेल को स्थापित करने का समय आ गया है। पहले मॉड्यूल स्थापित करें:

sudo make modules_install

फिर कर्नेल को स्वयं स्थापित करें :

sudo make install

वह vmlinuz-3.16.1( vmlinuz), config-3.16.1(एक पाठ फ़ाइल को कर्नेल कॉन्फ़िगरेशन पैरामीटर को संग्रहीत करता है), और System.map-3.16.1( कर्नेल प्रतीक लुकअप तालिका ) में डालता है /boot। अधिक जानकारी के लिए, Hadron द्वारा इस comp.os.linux.misc पोस्ट को देखें और man installkernel

अंतिम सेटअप, ताकि कर्नेल को शुरू किया जा सके और सिस्टम को बूट किया जा सके:

यह खंड आंशिक रूप से कर्नेल / संकलन में जानकारी पर आधारित है ।

कर्नेल के साथ अब इसे कहाँ होना चाहिए, इसकी आवश्यकता है:

के साथ अपने initramfs उत्पन्न करेंmkinitramfs :

cd /boot
sudo mkinitramfs -ko initrd.img-3.16.1 3.16.1

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

sudo update-grub

अपनी गिरी को आजमाएं।

अब आप अपने नए कर्नेल का परीक्षण करने के लिए रीबूट कर सकते हैं। GRUB बूट मेनू देखने के लिए आपको बूट के दौरान नीचे दबाए रखने Shiftया प्रेस करने की आवश्यकता हो सकती है Escजहां आप स्थापित किए गए विभिन्न कर्नेल के बीच चयन कर सकते हैं।

अपने कर्नेल (या अन्य एक) को डिफ़ॉल्ट बनाने के लिए, मैं GRUB बूट ऑर्डर को कैसे बदलूं?


चरण 3, की make menuconfigआवश्यकता हैapt get install libncurses5-dev
हन्नू

@ हन्नू शुक्रिया, मैं सिर्फ इसका उल्लेख करना भूल गया। 64-बिट सिस्टम उपयोगकर्ताओं को चलाने के लिए 32-बिट प्रोग्राम के समर्थन के लिए "ia32-libs" की आवश्यकता हो सकती है।
नौसिखिया

एक संस्करण-स्वतंत्र पैकेज भी खोजना बेहतर हो सकता है ... मुझे यकीन नहीं है कि कोई भी है।
हन्नू

@EliahKagan धन्यवाद। क्या यह अब ठीक है या मुझे इसे पूरी तरह से हटा देना चाहिए? मुझे ऐसा करने में कोई समस्या नहीं है।
Novice

1
-1 यह उबंटू कर्नेल का उत्पादन नहीं करता है । यह .deb फ़ाइलों का उत्पादन भी नहीं करता है। यह समस्याओं का नुस्खा है।
अलेक्सांद्र डबिन्सकी

3

उबंटू कर्नेल (वेनिला के विपरीत) के निर्माण के त्वरित निर्देश यहां देखे जा सकते हैं: https://wiki.ubuntu.com/Kernel/BuildYourOwnK कर्नेल ।

मैं पूरी विकी को कॉपी नहीं करूंगा, लेकिन मैं उबंटू कर्नेल के संस्करण को संकलित करने के लिए न्यूनतम चरणों की सूची दूंगा जो आपने वर्तमान में स्थापित किए हैं। (सबसे हालिया संस्करण प्राप्त करने के लिए, आगामी उबंटू रिलीज के कर्नेल गिट रिपॉजिटरी को क्लोन करें।) उबंटू 16.04 पर परीक्षण किया गया।

# Get source code
apt-get source linux-image-$(uname -r)

# Install dependencies
sudo apt-get build-dep linux-image-$(uname -r)

# Compile
cd linux-4.4.0
fakeroot debian/rules clean
fakeroot debian/rules binary

# Install (obviously the versions will be different)
cd ..
sudo dpkg -i linux-image-4.4.0-38-generic_4.4.0-38.57_amd64.deb linux-headers-4.4.0-38_4.4.0-38.57_all.deb linux-headers-4.4.0-38-generic_4.4.0-38.57_amd64.deb
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.