文章来源: http://raspberry.dns8844.cn/documentation
构建内核
操作系统预装的默认编译器和链接器被配置为构建在该操作系统上运行的可执行文件。 原生编译 使用这些默认编译器和链接器。交叉编译 是为运行编译过程的目标之外的目标编译代码的过程。
Raspberry Pi 内核的交叉编译允许你从 32 位操作系统构建 64 位内核,反之亦然。或者,你也可以从 Raspberry Pi 以外的设备交叉编译 32 位或 64 位 Raspberry Pi 内核。
交叉编译内核
首先,你需要一台合适的 Linux 交叉编译主机。我们倾向于使用 Ubuntu;因为 Raspberry Pi OS 也是 Debian 发行版,所以编译命令也类似。
安装所需的依赖项和工具链
要构建用于交叉编译的源代码,请在设备上安装所需的依赖项。运行以下命令安装大部分依赖项:
$ sudo apt install bc bison flex libssl-dev make libc6-dev libncurses5-dev
然后,针对要构建的内核架构安装适当的工具链:
- 要安装 64 位工具链以构建 64 位内核,请运行以下命令:
$ sudo apt install crossbuild-essential-arm64
- 要安装 32 位工具链以构建 32 位内核,请运行以下命令:
$ sudo apt install crossbuild-essential-armhf
构建配置
本节介绍如何在构建内核时应用默认配置。您还可以通过以下方式配置内核:
输入以下命令以创建源文件和设备树文件:
[cols=“8,<.^20a,60a”]
|===
| Target Architecture | Target Model | Command
.10+.| 64-bit
| Raspberry Pi 3
.9+.^| [source,console]
$ cd linux
$ KERNEL=kernel8
$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig
| Raspberry Pi Compute Module 3
| Raspberry Pi 3+
| Raspberry Pi Compute Module 3+
| Raspberry Pi Zero 2 W
| Raspberry Pi 4
| Raspberry Pi 400
| Raspberry Pi Compute Module 4
| Raspberry Pi Compute Module 4S
.^| Raspberry Pi 5
.1+.^|
$ cd linux
$ KERNEL=kernel_2712
$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2712_defconfig
.14+.| 32-bit
| Raspberry Pi 1
.4+.^| [source,console]
$ cd linux
$ KERNEL=kernel
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcmrpi_defconfig
| Raspberry Pi Compute Module 1
| Raspberry Pi Zero
| Raspberry Pi Zero W
| Raspberry Pi 2
.6+.^|
$ cd linux
$ KERNEL=kernel7
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
| Raspberry Pi 3
| Raspberry Pi Compute Module 3
| Raspberry Pi 3+
| Raspberry Pi Compute Module 3+
| Raspberry Pi Zero 2 W
| Raspberry Pi 4
.4+.^|
$ cd linux
$ KERNEL=kernel7l
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2711_defconfig
| Raspberry Pi 400
| Raspberry Pi Compute Module 4
| Raspberry Pi Compute Module 4S
|===
使用 LOCALVERSION
自定义内核版本
为防止内核覆盖 /lib/modules
中的现有模块,并在 uname
输出中表明运行的是自己的内核,请调整 LOCALVERSION
内容。
要修改 LOCALVERSION
,请修改 .config
中的此行:
CONFIG_LOCALVERSION="-v7l-MY_CUSTOM_KERNEL"
TIP: 你也可以在 General setup > Local version - append to kernel release 中使用 menuconfig
以图形方式更改这一设置。有关 menuconfig
的更多信息,请参阅 内核配置说明。
Build
- 运行以下命令构建 64 位内核:
$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs
- 运行以下命令构建 32 位内核:
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs
安装内核
创建内核后,您需要将其复制到 Raspberry Pi 启动介质(可能是 SD 卡或 SSD)上,然后安装模块。
查找启动介质
首先,运行 lsblk
。然后,连接启动媒体。再次运行 lsblk
;新设备代表启动介质。你应该会看到类似下面的输出:
sdb
sdb1
sdb2
如果 sdb
代表启动介质,则 sdb1
代表 FAT32
格式的 启动分区,而 sdb2
代表(可能是 ext4
格式的)根分区。
首先,将这些分区挂载为 mnt/boot
和 mnt/root
,调整分区代号以匹配启动介质的位置:
$ mkdir mnt
$ mkdir mnt/boot
$ mkdir mnt/root
$ sudo mount /dev/sdb1 mnt/boot
$ sudo mount /dev/sdb2 mnt/root
安装
接下来,将内核模块安装到启动介质上:
- 对于 64 位内核:
$ sudo env PATH=$PATH make -j12 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=mnt/root modules_install
- 对于 32 位内核:
$ sudo env PATH=$PATH make -j12 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/root modules_install
TIP: 在多核设备上 make -j<n>
选项可在各核之间分配工作。这会大大加快编译速度。运行 nproc
查看你有多少个处理器;我们建议使用处理器数量的 1.5 倍。
接下来,将内核和设备树 blob 安装到启动分区,并备份原始内核。
安装 64 位内核:
- 运行以下命令创建当前内核的备份镜像,安装新的内核镜像、overlays、README,并卸载分区:
$ sudo cp mnt/boot/$KERNEL.img mnt/boot/$KERNEL-backup.img
$ sudo cp arch/arm64/boot/Image mnt/boot/$KERNEL.img
$ sudo cp arch/arm64/boot/dts/broadcom/*.dtb mnt/boot/
$ sudo cp arch/arm64/boot/dts/overlays/*.dtb* mnt/boot/overlays/
$ sudo cp arch/arm64/boot/dts/overlays/README mnt/boot/overlays/
$ sudo umount mnt/boot
$ sudo umount mnt/root
安装 32 位内核:
. 运行以下命令创建当前内核的备份镜像,并安装新的内核镜像:
$ sudo cp mnt/boot/$KERNEL.img mnt/boot/$KERNEL-backup.img
$ sudo cp arch/arm/boot/zImage mnt/boot/$KERNEL.img
. 根据你的 内核版本,运行以下命令安装设备树 blobs:
** 适用于 6.4 及以下版本的内核:
$ sudo cp arch/arm/boot/dts/*.dtb mnt/boot/
** 适用于 6.5 及以上版本的内核:
+
$ sudo cp arch/arm/boot/dts/broadcom/*.dtb mnt/boot/
. 最后,安装overlays和 README,并卸载分区:
$ sudo cp arch/arm/boot/dts/overlays/*.dtb* mnt/boot/overlays/
$ sudo cp arch/arm/boot/dts/overlays/README mnt/boot/overlays/
$ sudo umount mnt/boot
$ sudo umount mnt/root
最后,将启动媒体连接到 Raspberry Pi,并接通电源,运行新编译的内核。
或者,用不同的文件名复制内核(如 kernel-myconfig.img
),而不是覆盖 kernel.img
文件。然后,编辑启动分区中的 config.txt
以选择内核:
kernel=kernel-myconfig.img
将此方法与自定义的 LOCALVERSION
相结合,可将自定义内核与系统管理的原版内核映像分开。有了这种方法,当你的内核无法启动时,你就可以迅速恢复到原版内核。
上一篇 – 树莓派超全系列教程文档–(44)如何在树莓派上编译树莓派内核
下一篇 – 树莓派超全系列教程文档–(46)如何配置内核功能