参考
Ubuntu 10.04内核源码树的编译和安装 – 源码巴士
ubuntu编译安装kernel教程。_ubuntu kernel_搜索:蓝易云的博客-CSDN博客
版本信息
vmware版本:VMware® Workstation 17 Pro 17.0.0 build-20800274
vmware安装包:VMware-workstation-full-17.0.0-20800274.exe,可到官网下载
ubuntu版本:ubuntu-22.04.3-desktop-amd64.iso,可到官网下载
对应内核:
root@daniel-virtual-machine:/home/daniel/code_test/led_drv# uname -r
6.2.0-26-generic
编译安装内核步骤
-
查询、下载、解压源码包
1、查询可用源码包
root@daniel-virtual-machine:~# apt-cache search linux-source
linux-source - Linux kernel source with Ubuntu patches
linux-source-5.15.0 - Linux kernel source for version 5.15.0 with Ubuntu patches
linux-source-5.19.0 - Linux kernel source for version 5.19.0 with Ubuntu patches
linux-source-6.2.0 - Linux kernel source for version 6.2.0 with Ubuntu patches
2、下载源码包到:/usr/src目录,也可以登录官网下载后上传到/usr/src目录。
root@daniel-virtual-machine:/usr/src# apt-get install linux-source-6.2.0
3、解压
root@daniel-virtual-machine:/usr/src# tar -xjvf linux-source-2.6.35.tar.bz2
root@daniel-virtual-machine:/usr/src# ll
total 412964
drwxr-xr-x 5 root root 4096 8月 28 17:23 ./
drwxr-xr-x 14 root root 4096 8月 8 06:52 ../
drwxr-xr-x 7 root root 4096 8月 8 06:54 linux-headers-6.2.0-26-generic/
drwxr-xr-x 26 root root 4096 8月 8 06:54 linux-hwe-6.2-headers-6.2.0-26/
drwxrwxr-x 30 root root 4096 8月 29 15:19 linux-source-6.2.0/
-rw-r--r-- 1 root root 422850166 8月 28 17:23 linux-source-6.2.0.tar.bz2
编译内核
1、安装构建内核所需的依赖项。
sudo apt-get install build-essential libncurses-dev bison flex libssl-dev libelf-dev bc
2、配置内核,复制当前系统正在使用的内核配置文件到新的内核源代码目录下
root@daniel-virtual-machine:/usr/src/linux-source-6.2.0#cp /boot/config-$(uname -r) .config
如果想更改待编译内核的配置,可以执行如下命令:
root@daniel-virtual-machine:/usr/src/linux-source-6.2.0#make menuconfig
一般情况下,沿用当前正在运行的内核的配置即可。
3、编译内核
root@daniel-virtual-machine:/usr/src/linux-source-6.2.0#make -j$(nproc)
4、安装内核
root@daniel-virtual-machine:/usr/src/linux-source-6.2.0# make modules_install
root@daniel-virtual-machine:/usr/src/linux-source-6.2.0# make install
5、更新引导加载程序(GRUB)配置:
root@daniel-virtual-machine:/usr/src/linux-source-6.2.0# update-grub
6、完成后,重新启动计算机,并在引导时选择新安装的内核。
请注意,编译和安装内核可能会对系统产生不可预见的影响,并且在这个过程中可能会遇到错误。
备注:如果只是想编译内核驱动模块,不更换内核版本,4-6步可以不做。
编译内核驱动模块
1、在编译完成的内核目录,执行如下命令可以编译某个内核驱动模块
root@daniel-virtual-machine:/usr/src/linux-source-6.2.0# make -C /usr/src/linux-source-6.2.0/ M=/usr/src/linux-source-6.2.0/drivers/nvme/host/
2、加载驱动KO
Aug 29 15:23:26 daniel-virtual-machine kernel: [12993.382614] nvme_core: disagrees about version of symbol module_layout
加载失败的原因是:编译驱动的内核源码版本与当前正在运行的内核版本不一致,将make时的-C参数修改为正在运行的内核版本的目录。
root@daniel-virtual-machine:/usr/src/linux-source-6.2.0# make -C /usr/src/linux-headers-6.2.0-26-generic/ M=/usr/src/linux-source-6.2.0/drivers/nvme/host/
还是加载失败,看日志是有部分函数的符号找不到。
原因是新版本的内核NVMe驱动增加了一个common目录,对应nvme-common.ko,先编译和加载这个KO,再加载nvme-core.ko即可。