linux為什么編譯內(nèi)核

原因:新的內(nèi)核修訂了舊內(nèi)核的bug,并增加了許多新的特性;如果用戶想要使用這些新特性,或想根據(jù)自己的系統(tǒng)度身定制一個(gè)更高效,更穩(wěn)定的內(nèi)核,就需要重新編譯linux內(nèi)核。通常,更新的內(nèi)核會(huì)支持更多的硬件,具備更好的進(jìn)程管理能力,運(yùn)行速度更快、 更穩(wěn)定,并且一般會(huì)修復(fù)老版本中發(fā)現(xiàn)的許多漏洞等,經(jīng)常性地選擇升級(jí)更新的系統(tǒng)內(nèi)核是Linux使用者的必要操作內(nèi)容。

linux為什么編譯內(nèi)核

本教程操作環(huán)境:Ubuntu 18.04系統(tǒng)、Dell G3電腦。

為什么要編譯Linux內(nèi)核?

新的內(nèi)核修訂了舊內(nèi)核的bug,并增加了許多新的特性。如果用戶想要使用這些新特性,或想根據(jù)自己的系統(tǒng)度身定制一個(gè)更高效,更穩(wěn)定的內(nèi)核,就需要重新編譯Linux內(nèi)核。

通常,更新的內(nèi)核會(huì)支持更多的硬件,具備更好的進(jìn)程管理能力,運(yùn)行速度更快、 更穩(wěn)定,并且一般會(huì)修復(fù)老版本中發(fā)現(xiàn)的許多漏洞等,經(jīng)常性地選擇升級(jí)更新的系統(tǒng)內(nèi)核是Linux使用者的必要操作內(nèi)容。

為了正確的合理地設(shè)置內(nèi)核編譯配置選項(xiàng),從而只編譯系統(tǒng)需要的功能的代碼,一般主要有下面四個(gè)考慮:

  • (1)自己定制編譯的內(nèi)核運(yùn)行更快(具有更少的代碼)

  • (2)系統(tǒng)將擁有更多的內(nèi)存(內(nèi)核部分將不會(huì)被交換到虛擬內(nèi)存中)

  • (3)不需要的功能編譯進(jìn)入內(nèi)核可能會(huì)增加被系統(tǒng)攻擊者利用的漏洞

  • (4) 將某種功能編譯為模塊方式會(huì)比編譯到內(nèi)核內(nèi)的方式速度要慢一些

這類編譯的目的主要是通過(guò)編譯來(lái)了解Linux內(nèi)核編譯的過(guò)程,熟悉內(nèi)核的工作原理,甚至還可以嘗試進(jìn)行一些修改。
編譯只是將源碼編譯成程序,不會(huì)替換當(dāng)前的系統(tǒng),也不會(huì)影響當(dāng)前系統(tǒng)的運(yùn)行。

編譯內(nèi)核可能是出于某種需求,比如對(duì)內(nèi)核大小有要求,去掉內(nèi)核中某些用不到的部分,這種場(chǎng)景往往是嵌入式系統(tǒng)。
或者自己修改了某部分內(nèi)核代碼,需要編譯后驗(yàn)證功能。

模塊編譯時(shí)將某些功能模塊編譯成 .ko 可以在不重新編譯內(nèi)核的情況下,insmod xxx.ko 到系統(tǒng)中使用編寫(xiě)的代碼功能。
編譯內(nèi)核后不會(huì)替換當(dāng)前內(nèi)核,編譯后的新內(nèi)核往往在類似下面的目錄下,名字大都是 bzImage

/usr/src/kernels/3.xx.x-.x86_64/arch/x86/boot/

然后可以編輯系統(tǒng)的 grub list 添加最新的內(nèi)核來(lái)用它

新內(nèi)核集成了新驅(qū)動(dòng),比如Intel核顯:??? /lib/modules/`uname -r`/kernel/drivers/gpu/drm/i915/i915.ko

一個(gè)系統(tǒng)可以安裝多個(gè)內(nèi)核,比如啟動(dòng)文件,新內(nèi)核不會(huì)覆蓋舊內(nèi)核:?

/boot/vmlinuz-VERSION /boot/initrd.img-VERSION

安裝新內(nèi)核過(guò)程中,一些內(nèi)核模塊需要重新編譯,比如VirtualBox:

/lib/modules/`uname?-r`/updates/dkms/vboxdrv.ko

如果新內(nèi)核運(yùn)行不正常,可以在開(kāi)機(jī)GRUB引導(dǎo)里選擇舊內(nèi)核啟動(dòng)。

也可以這樣改回原來(lái)使用的內(nèi)核:

ln?-sf?/boot/vmlinuz-VERSION?/vmlinuz ln?-sf?/boot/initrd.img-VERSION?/initrd.img

?其中VERSION是原來(lái)內(nèi)核的版本。

編譯一個(gè)Linux內(nèi)核?

整個(gè)內(nèi)核編譯的過(guò)程非常簡(jiǎn)單,但是內(nèi)核編譯需要花費(fèi)比較長(zhǎng)的時(shí)間。這主要是因?yàn)閮?nèi)核的代碼非常多。當(dāng)然,如果你的計(jì)算機(jī)性能強(qiáng)勁,時(shí)間會(huì)短很多。另外需要注意的是,建議在虛擬機(jī)環(huán)境下編譯,這樣避免錯(cuò)誤導(dǎo)致系統(tǒng)問(wèn)題。如果在虛擬機(jī)測(cè)試,建議系統(tǒng)分區(qū)和內(nèi)核源代碼分區(qū)的大小大于20GB。

Step 1: 下載源代碼

1、 進(jìn)入Linux 內(nèi)核的官網(wǎng),下載最新版本,或者其它版本的內(nèi)核代碼。這里是源代碼的壓縮包。

linux為什么編譯內(nèi)核

2、假設(shè)我們現(xiàn)在在一個(gè)Linux操作系統(tǒng)中,在命令行輸入如下命令就可以下載內(nèi)核了。

wget?鏈接(由于鏈接會(huì)被認(rèn)為是廣告,本文省略鏈接,請(qǐng)自行復(fù)制)

在下載的過(guò)程中可以看到下載進(jìn)度,下載完成后信息大致如下所示。

linux為什么編譯內(nèi)核

Step 2: 解壓源代碼

壓縮包下載完成后,可以通過(guò)tar命令解壓。

tar?xvf?linux-5.9.6.tar.xz

在解壓的時(shí)候可以看到文件列表,這個(gè)會(huì)很多,可能需要等一會(huì)兒。

linux為什么編譯內(nèi)核

Step 3: 安裝需要的軟件包

安裝編譯工具以及其它一下依賴的軟件包,在Ubuntu 18.04環(huán)境下執(zhí)行如下命令。

sudo?apt-get?install?git?fakeroot?build-essential?ncurses-dev?xz-utils?libssl-dev?bc?flex?libelf-dev?bison

如果一切順利,大概安裝輸出信息如下所示。

linux為什么編譯內(nèi)核

Step 4: 配置內(nèi)核代碼

在編譯內(nèi)核之前,我們可以對(duì)內(nèi)核源代碼進(jìn)行配置。配置的目的主要是確定哪些模塊會(huì)編譯到內(nèi)核當(dāng)中。

1. 進(jìn)入源代碼目錄

cd?linux-5.9.6

2. 從當(dāng)前機(jī)器的啟動(dòng)目錄拷貝配置信息到源代碼目錄。這步操作的意思是我們編譯內(nèi)核的配置采用用當(dāng)前環(huán)境一致的配置。

cp?-v?/boot/config-$(uname?-r)?.config
linux為什么編譯內(nèi)核

3. 可以通過(guò)如下命令啟動(dòng)配置界面

make?menuconfig

該命令會(huì)運(yùn)行一些腳本,然后打開(kāi)一個(gè)配置界面

linux為什么編譯內(nèi)核

4. 下面是打開(kāi)的配置界面。可以看出里面包含所有的內(nèi)核組件,包括文件系統(tǒng),網(wǎng)絡(luò),IO棧,虛擬化和設(shè)備驅(qū)動(dòng)等等。如果你不熟悉,可以不做任何修改。

linux為什么編譯內(nèi)核

Step 5: 編譯內(nèi)核

1. 通過(guò)如下命令就可以編譯內(nèi)核了

make?-j?10

上面參數(shù)是并發(fā)數(shù)量,通常可以是CPU的2倍。

linux為什么編譯內(nèi)核

2. 安裝模塊

sudo?make?modules_install
linux為什么編譯內(nèi)核

3. 安裝內(nèi)核

sudo?make?install

安裝完成后會(huì)有如下提示信息。

linux為什么編譯內(nèi)核

Step 6: 重啟,驗(yàn)證版本

當(dāng)上述步驟都沒(méi)有出錯(cuò)的情況下,我們重啟一下計(jì)算機(jī),然后運(yùn)行如下命令。

uname?-mrs

此時(shí)就可以看到內(nèi)核版本已經(jīng)是我們編譯的版本了。

linux為什么編譯內(nèi)核

結(jié)論?

通過(guò)上面幾步,我們可以很簡(jiǎn)單的編譯一個(gè)內(nèi)核。如果后面開(kāi)發(fā)內(nèi)核模塊,也是要基于內(nèi)核代碼樹(shù)的,因此這個(gè)是內(nèi)核開(kāi)發(fā)的基礎(chǔ)。

可能遇到的問(wèn)題?

編譯內(nèi)核的時(shí)候可能會(huì)遇到這個(gè)問(wèn)題:

沒(méi)有規(guī)則可制作目標(biāo)
debian/certs/debian-uefi-certs.pem,由certs/x509_certificate_list需求停止

在要編譯的內(nèi)核目錄下編輯一下配置文件即可。簡(jiǎn)單的方式是執(zhí)行如下命令

vim?.config

然后找到
CONFIG_SYSTEM_TRUSTED_KEYS,將其設(shè)置為空,也就是下面這個(gè)樣子。

CONFIG_SYSTEM_TRUSTED_KEYS=”

相關(guān)推薦:《Linux視頻教程

以上就是

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊11 分享