Compile Linux Kernel
编译实践1:
学习Linux内核模块开发,需要增加一个FORCE_UNLOADING
feature 以避免安装的模块崩溃时可以强行卸载而不必重启。而好像只有OpenSuSE可以通过修改配置文件来动态修改内核配置,而其他发行版只能重新编译内核。
默认环境 当前目录: kernel源目录
Ubuntu
注意源文件的下载,不要在系统目录比如/usr/src
下进行,而要在用户空间内进行,而apt source
,apt-get source
, 不需要也不能使用sudo
, 会错误得造成源文件的用户组变为root。对于>= 20.04,没有官方更新的wiki讲如何使用debian/rules,直接从linux上游源代码处获取。
= 18.04
参考这篇文章
= 19.04
参考官方wiki
= 20.04 (or maybe upper than it)
参考这篇文章
-
下载源代码
-
安装依赖
sudo apt install asciidoc autoconf bc binutils-dev bison build-essential crash dkms fakeroot flex gawk gcc kernel-wedge kexec-tools libelf-dev libiberty-dev libncurses5-dev libncurses-dev libssl-dev libudev-dev makedumpfile openssl pciutils-dev
(
pciutils-dev
is replaced bylibpci-dev
in the later version) -
配置参考下面tips
-
make -jn deb-pkg
-
cd .. && sudo apt ./linux-*.deb
-
sudo update-grub
Tips:
-
Linux 68%的代码是驱动相关代码,当然大部分的编译时间也是在编译驱动上,而这一部分也是容易出问题,往往花了几个小时编译发现,后来发现在这里出了错误,这就很难受,需要提前仔细配置。个人经验是不使用
/boot/config-`uname -r`
作为初始配置,而是使用make localmodconfig
创建初始配置:.config
文件,使用默认的配置,确保驱动的编译不出问题。然后使用make menuconfig
(shell text) ormake xconfig
(qt5 gui) 配置内核其他部分。 -
make 使用
-j
启用多核编译很重要,如果宿主机器在编译的同时需要运行其他任务,建议少用一个核心,避免机器down掉(然后比如当前用户直接被强制logout)。 -
如果make过程中因为什么原因中途停掉了,可以再次启动,但是第一次会报错:
"dpkg-source: unrepresentable changes to source"
, 只要把相关报错文件删除掉重新运行即可。 -
= 20.04, 可能需要的额外依赖包:
dwarves # tmp_vmlinux.btf: pahole (pahole) is not available
Select Kernel
重启的时候按住shift
进入grup界面,选择需要的版本内核启动。
修改默认启动内核,参考华为云的这篇文章和askubuntu的这个回答
修改配置文件/etc/default/grub
的 GRUB_DEFAULT
的值为启动项的序号:
0,正常启动
1>y, 高级启动项,y start from 0
查看高级启动项的序号(Ubuntu为例):
sudo grub-mkconfig | grep -iE "menuentry 'Ubuntu, with Linux" | awk '{print i++ " : "$1, $2, $3, $4, $5, $6, $7}'
不要忘记最后运行sudo update-grup
来更新配置。