首頁  >  文章  >  運維  >  linux為什麼編譯內核

linux為什麼編譯內核

青灯夜游
青灯夜游原創
2023-03-30 14:03:542157瀏覽

原因:新的核心修訂了舊核心的bug,並增加了許多新的特性;如果使用者想要使用這些新特性,或想根據自己的系統度身定制一個更有效率,更穩定的內核,就需要重新編譯Linux內核。通常,更新的核心會支援更多的硬件,具備更好的進程管理能力,運行速度更快、 更穩定,並且一般會修復舊版本中發現的許多漏洞等,經常性地選擇升級更新的系統內核是Linux使用者的必要操作內容。

linux為什麼編譯內核

本教學操作環境:Ubuntu 18.04系統、Dell G3電腦。

為什麼要編譯Linux核心?

新的核心修訂了舊核心的bug,並增加了許多新的功能。如果使用者想要使用這些新特性,或想根據自己的系統度身自訂更有效率,更穩定的內核,就需要重新編譯Linux內核。

通常,更新的核心會支援更多的硬件,具備更好的進程管理能力,運行速度更快、 更穩定,並且一般會修復舊版本中發現的許多漏洞等,經常性地選擇升級更新的系統核心是Linux使用者必要的操作內容。

為了正確的合理地設定內核編譯配置選項,從而只編譯系統需要的功能的程式碼,一般主要有以下四個考慮:

  • (1)自行自訂編譯的核心運行更快(具有更少的程式碼)

  • (2)系統將擁有更多的記憶體(核心部分將不會被交換到虛擬記憶體中)

  • (3)不需要的功能編譯進入核心可能會增加被系統攻擊者利用的漏洞

  • (4) 將某種功能編譯為模組方式會比編譯到核心內的方式速度慢一些

這類編譯的目的主要是透過編譯來了解Linux核心編譯的過程,熟悉核心的工作原理,甚至還可以嘗試進行一些修改。
編譯只是將原始碼編譯成程序,不會替換目前的系統,也不會影響目前系統的運作。

編譯核心可能是出於某種需求,例如對核心大小有要求,去掉核心中某些用不到的部分,這種場景往往是嵌入式系統。
或是自己修改了某部分核心程式碼,需要編譯後驗證功能。

模組編譯時將某些功能模組編譯成 .ko 可以在不重新編譯核心的情況下,insmod xxx.ko 到系統中使用編寫的程式碼功能。
編譯內核後不會替換當前內核,編譯後的新內核往往在類似下面的目錄下,名字大都是bzImage

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

然後可以編輯系統的grub list 添加最新的內核來用它

新核心整合了新驅動程式,例如Intel核顯:    /lib/modules/`uname -r`/kernel/drivers/gpu/drm/i915/i915.ko

#一個系統可以安裝多個核心,例如啟動檔案,新核心不會覆蓋舊核心: 

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

安裝新核心過程中,有些核心模組需要重新編譯,例如VirtualBox:

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

如果新核心運作不正常,可以在開機GRUB引導裡選擇舊核心啟動。

也可以這樣改回原來使用的核心:

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

 其中VERSION是原來核心的版本。

編譯一個Linux核心‍

整個核心編譯的過程非常簡單,但是核心編譯需要花費比較長的時間。這主要是因為核心的程式碼非常多。當然,如果你的電腦效能強勁,時間會短很多。另外要注意的是,建議在虛擬機器環境下編譯,這樣避免錯誤導致系統問題。如果在虛擬機器測試,建議系統分區和核心原始碼分區的大小大於20GB。

Step 1: 下載原始碼

#1、 進入Linux 內核的官網,下載最新版本,或其它版本的內核代碼。這裡是原始碼的壓縮包。

linux為什麼編譯內核

2、假設我們現在在一個Linux作業系統中,在命令列輸入如下指令就可以下載核心了。

wget 链接(由于链接会被认为是广告,本文省略链接,请自行复制)

在下載的過程中可以看到下載進度,下載完成後資訊大致如下所示。

linux為什麼編譯內核

#Step 2: 解壓縮原始碼

壓縮包下載完成後,可以透過tar指令解壓縮。

tar xvf linux-5.9.6.tar.xz

在解压的时候可以看到文件列表,这个会很多,可能需要等一会儿。

linux為什麼編譯內核

Step 3: 安装需要的软件包

安装编译工具以及其它一下依赖的软件包,在Ubuntu 18.04环境下执行如下命令。

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

如果一切顺利,大概安装输出信息如下所示。

linux為什麼編譯內核

Step 4: 配置内核代码

在编译内核之前,我们可以对内核源代码进行配置。配置的目的主要是确定哪些模块会编译到内核当中。

1. 进入源代码目录

cd linux-5.9.6

2. 从当前机器的启动目录拷贝配置信息到源代码目录。这步操作的意思是我们编译内核的配置采用用当前环境一致的配置。

cp -v /boot/config-$(uname -r) .config
linux為什麼編譯內核

3. 可以通过如下命令启动配置界面

make menuconfig

该命令会运行一些脚本,然后打开一个配置界面

linux為什麼編譯內核

4. 下面是打开的配置界面。可以看出里面包含所有的内核组件,包括文件系统,网络,IO栈,虚拟化和设备驱动等等。如果你不熟悉,可以不做任何修改。

linux為什麼編譯內核

Step 5: 编译内核

1. 通过如下命令就可以编译内核了

make -j 10

上面参数是并发数量,通常可以是CPU的2倍。

linux為什麼編譯內核

2. 安装模块

sudo make modules_install
linux為什麼編譯內核

3. 安装内核

sudo make install

安装完成后会有如下提示信息。

linux為什麼編譯內核

Step 6: 重启,验证版本

当上述步骤都没有出错的情况下,我们重启一下计算机,然后运行如下命令。

uname -mrs

此时就可以看到内核版本已经是我们编译的版本了。

1linux為什麼編譯內核

结论‍

通过上面几步,我们可以很简单的编译一个内核。如果后面开发内核模块,也是要基于内核代码树的,因此这个是内核开发的基础。

可能遇到的问题‍

编译内核的时候可能会遇到这个问题:

没有规则可制作目标
debian/certs/debian-uefi-certs.pem,由certs/x509_certificate_list需求停止

在要编译的内核目录下编辑一下配置文件即可。简单的方式是执行如下命令

vim .config

然后找到
CONFIG_SYSTEM_TRUSTED_KEYS,将其设置为空,也就是下面这个样子。

CONFIG_SYSTEM_TRUSTED_KEYS=”

相关推荐:《Linux视频教程

以上是linux為什麼編譯內核的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn