前言
大部分公司的所谓的Linux内核工程师主要工作是基于社区开源内核进行定制化修改,基本不会有机会向上游提供patch,仅限于公司内部业务的修修补补。
作为内核开发工程师两年多,精力一直被公司业务消耗,所有的内核知识都来自于公司业务驱动学习,一切编译都在SDK环境下进行,从未自己进行社区版本的内核进行编译。
本专题主要记录自己的学习过程。
内核编译
0.查看内核版本
我本地的开发环境是全新安装的Ubuntu18.04,本次学习目标是替换内核版本。先查看当前的内核版本:
cat /proc/version
结果:Linux 5.3.0-28-generic
1.下载内核源码
链接: kernel官网
选一个和当前机器不同版本的内核下载进行编译、替换测试
2.解压
tar -xvf linux-5.10.219.tar.xz
3.编译
# 切换到源码目录
cd linux-5.10.219/
# 编译准备:机器刚装上系统还没有编译器
sudo apt install gcc
# 内核编译配置,生成.config文件,后续可以直接修改.config文件跳过此步骤直接进行编译
make menuconfg
# 编译,-j代表并行编译;开并行能显著提速,但是出错时得往前翻编译log(社区稳定版本一般不会有代码编译错误)
make -j$(nproc)
# 初次编译一般会报错,都是缺少一些依赖库导致的,复制报错信息查一下即可,以下是我遇到的报错以及解决方式
# 报错:Unable to find the ncurses package. recipe for target ‘scripts/kconfig/.mconf-cfg‘ failed
#sudo apt-get install libncurses5-dev
# 报错:fatal error: openssl/opensslv.h: No such file or directory
# sudo apt-get install libssl-dev
# 至此已经编译完成了,但是为了后续替换内核版本,继续执行如下指令
# 编译好的模块拷贝到系统目录下(默认是/lib/modules/)
make modules_install
# 安装
make install
4.查看编译结果
源码目录下已经生成了内核Image文件:
各个模块的目录,可以看到已经生成了*.o文件:
myname@myname-VirtualBox:~/file/linux-5.10.219/net/bridge$ ll
总用量 3596
drwxr-xr-x 3 myname myname 4096 6月 19 22:15 ./
drwxr-xr-x 72 myname myname 4096 6月 19 21:43 ../
-rw-r--r-- 1 myname myname 11685 6月 16 19:32 br_arp_nd_proxy.c
-rw-rw-r-- 1 myname myname 10400 6月 19 21:41 br_arp_nd_proxy.o
-rw-rw-r-- 1 myname myname 61147 6月 19 21:41 .br_arp_nd_proxy.o.cmd
-rw-r--r-- 1 myname myname 8994 6月 16 19:32 br.c
-rw-r--r-- 1 myname myname 11891 6月 16 19:32 br_device.c
-rw-rw-r-- 1 myname myname 17192 6月 19 21:40 br_device.o
......
切换到/lib/modules/下,随便进一个模块,可以看到ko产物已经拷贝到此目录下了
myname@myname-VirtualBox:/lib/modules/5.10.219/kernel/net/bridge$ ll
总用量 392
drwxr-xr-x 3 root root 4096 6月 18 20:50 ./
drwxr-xr-x 58 root root 4096 6月 18 20:50 ../
-rw-r--r-- 1 root root 355001 6月 18 20:50 bridge.ko
-rw-r--r-- 1 root root 31489 6月 18 20:50 br_netfilter.ko
drwxr-xr-x 2 root root 4096 6月 18 20:50 netfilter/
#清理编译产物
make clean