前言
最近在技术支持的时候,需要在客户机器上编译驱动代码,遇到了一个问题,客户机器上面没有相应的内核头文件编译环境,没办法编译。
后面由同事通过安装deb包的形式把头文件之类的安装后,就可以正常编译了。
在我之前的理解中,要替换内核的话,只能在目标机器上编译内核,然后按照之前编译内核的文章讲的步骤替换内核。
现在发现,内核也是可以通过软件包的方式安装的,自己动手走一下打包流程。
打包
关于内核打包的方法在网络上找到了一些文章,本人也实践了一下,确实可行,主要流程如下:
# 下载内核源码, 并编译, 提前编译可以加快后面打包速度
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
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,这样就无法编译自己的内# 核模块(虽然可以通过apt-get来安装,但是通过这个方式安装的不一定是自己正在使用的内核版本)。
# --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,沟通交流。
博客地址: fishmwei.github.io
掘金主页: juejin.cn/user/208432…