前言
最近在技术支持的时候,需要在客户机器上编译驱动代码,遇到了一个问题,客户机器上面没有相应的内核头文件编译环境,没办法编译。
后面由同事通过安装deb包的形式把头文件之类的安装后,就可以正常编译了。
在我之前的理解中,要替换内核的话,只能在目标机器上编译内核,然后按照之前编译内核的文章讲的步骤替换内核。
现在发现,内核也是可以通过软件包的方式安装的,自己动手走一下打包流程。
打包
关于内核打包的方法在网络上找到了一些文章,本人也实践了一下,确实可行,主要流程如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| # 下载内核源码, 并编译, 提前编译可以加快后面打包速度 wget https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.10.tar.xz
tar xvf linux-5.10.tar.xz
cd linux-5.10
# 方便起见,直接使用当前的配置
cp /boot/config-5.15.56 .config
make menuconfig
make -j 8
# 准备打包环境 sudo apt install build-essential sudo apt install kernel-package sudo apt install dwarves
# 在内核源码目录中执行以下命令 cd linux-5.10 sudo make-kpkg --initrd --revision 001 --append-to-version -20230823 kernel_image kernel_headers --config menuconfig
# make-kpkg 用于为内核源码打包debian包, 这个命令需要在内核源码根目录下运行,打包结束后会在上层目录生成目标文件。 # --initrd:选项会让make-kpkg自动帮我们生成initramfs。 # --revision:会给生成的deb文件加上一个版本信息,这个参数只是影响到文件名,如果不指定,默认会是“10.00.Custom”。 # --append-to-version:是一种版本信息,它不仅出现在deb安装包的文件名里,也会影响到kernel的名称,比如本例中,内核更新完成之后,用“uname -r”查看会得到 5.10.0-20230823 # kernel_image:表示生成内核和默认模块的安装包。 # kernel_headers:表示生成一个内核头文件的安装包;如果不生成这个deb包,那么我们就无法在/usr/src目录下生成linux-headers-x.x.x,这样就无法编译自己的内 # --config=menuconfig:表示以menuconfig的方式编译。
# 编译完成后,会在linux-5.10的上一级目录生成2个文件,一个是image的,一个是headers的
linux-headers-5.10.0-20230823_001_arm64.deb linux-image-5.10.0-20230823_001_arm64.deb
dpkg -i linux-headers-5.10.0-20230823_001_arm64.deb linux-image-5.10.0-20230823_001_arm64.deb
|
行动,才不会被动!
欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。
博客地址: https://fishmwei.github.io
掘金主页: https://juejin.cn/user/2084329776486919