0%

周谈(50)- 内核编译打包

前言

最近在技术支持的时候,需要在客户机器上编译驱动代码,遇到了一个问题,客户机器上面没有相应的内核头文件编译环境,没办法编译。

后面由同事通过安装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,这样就无法编译自己的内# 核模块(虽然可以通过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,沟通交流。

欢迎关注

博客地址: https://fishmwei.github.io

掘金主页: https://juejin.cn/user/2084329776486919