linux系统为什么要编译内核
原因:新的内核修订了旧内核的bug,并增加了许多新的特性;如果用户想要使用这些新特性,或想根据自己的系统度身定制一个更高效,更稳定的内核,就需要重新编译Linux内核。通常,更新的内核会支持更多的硬件,具备更好的进程管理能力,运行速度更快、 更稳定,并且一般会修复老版本中发现的许多漏洞等,经常性地选择升级更新的系统内核是Linux使用者的必要操作内容。
为什么要编译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 /vmlinuzln -sf /boot/initrd.img-VERSION /initrd.img
其中VERSION是原来内核的版本。
编译一个Linux内核
整个内核编译的过程非常简单,但是内核编译需要花费比较长的时间。这主要是因为内核的代码非常多。当然,如果你的计算机性能强劲,时间会短很多。另外需要注意的是,建议在虚拟机环境下编译,这样避免错误导致系统问题。如果在虚拟机测试,建议系统分区和内核源代码分区的大小大于20GB。
Step 1: 下载源代码
1、 进入Linux 内核的官网,下载最新版本,或者其它版本的内核代码。这里是源代码的压缩包。
2、假设我们现在在一个Linux操作系统中,在命令行输入如下命令就可以下载内核了。
wget 链接(由于链接会被认为是广告,本文省略链接,请自行复制)
在下载的过程中可以看到下载进度,下载完成后信息大致如下所示。
Step 2: 解压源代码
压缩包下载完成后,可以通过tar命令解压。
tar xvf linux-5.9.6.tar.xz
在解压的时候可以看到文件列表,这个会很多,可能需要等一会儿。
Step 3: 安装需要的软件包
安装编译工具以及其它一下依赖的软件包,在Ubuntu 18.04环境下执行如下命令。
sudo apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison
如果一切顺利,大概安装输出信息如下所示。
Step 4: 配置内核代码
在编译内核之前,我们可以对内核源代码进行配置。配置的目的主要是确定哪些模块会编译到内核当中。
1. 进入源代码目录
cd linux-5.9.6
2. 从当前机器的启动目录拷贝配置信息到源代码目录。这步操作的意思是我们编译内核的配置采用用当前环境一致的配置。
cp -v /boot/config-$(uname -r) .config
3. 可以通过如下命令启动配置界面
make menuconfig
该命令会运行一些脚本,然后打开一个配置界面
4. 下面是打开的配置界面。可以看出里面包含所有的内核组件,包括文件系统,网络,IO栈,虚拟化和设备驱动等等。如果你不熟悉,可以不做任何修改。
Step 5: 编译内核
1. 通过如下命令就可以编译内核了
make -j 10
上面参数是并发数量,通常可以是CPU的2倍。
2. 安装模块
sudo make modules_install
3. 安装内核
sudo make install
安装完成后会有如下提示信息。
Step 6: 重启,验证版本
当上述步骤都没有出错的情况下,我们重启一下计算机,然后运行如下命令。
uname -mrs
此时就可以看到内核版本已经是我们编译的版本了。
结论
通过上面几步,我们可以很简单的编译一个内核。如果后面开发内核模块,也是要基于内核代码树的,因此这个是内核开发的基础。
可能遇到的问题
编译内核的时候可能会遇到这个问题:
没有规则可制作目标
debian/certs/debian-uefi-certs.pem,由certs/x509_certificate_list需求停止
在要编译的内核目录下编辑一下配置文件即可。简单的方式是执行如下命令
vim .config
然后找到
CONFIG_SYSTEM_TRUSTED_KEYS,将其设置为空,也就是下面这个样子。
CONFIG_SYSTEM_TRUSTED_KEYS=”