树莓派超全系列教程文档--(44)如何在树莓派上编译树莓派内核
文章来源: http://raspberry.dns8844.cn/documentation
原文网址
构建内核
操作系统预装的默认编译器和链接器被配置为构建在该操作系统上运行的可执行文件。 原生编译 使用这些默认编译器和链接器。交叉编译 是为运行编译过程的目标之外的目标编译代码的过程。
Raspberry Pi 内核的交叉编译允许你从 32 位操作系统构建 64 位内核,反之亦然。或者,你也可以从 Raspberry Pi 以外的设备交叉编译 32 位或 64 位 Raspberry Pi 内核。
下面的说明分为本地编译和交叉编译。选择适合你的情况的部分;虽然这两个过程有许多相同的步骤,但也有一些重要的区别。
下载内核源代码
在为任何目标构建之前,你都需要内核源代码。要获取内核源代码,你需要 Git。如果尚未安装 Git,请先在设备上安装:
$ sudo apt install git
接下来,下载最新 Raspberry Pi 内核的源代码:
$ git clone --depth=1 https://github.com/raspberrypi/linux
这可能需要几分钟时间。
上面的 git clone
命令下载的是当前活动分支,我们从该分支构建 Raspberry Pi 操作系统映像,不包含任何历史记录。省略 --depth=1
可以下载整个版本库,包括所有分支的完整历史。这需要更长的时间,占用的存储空间也更大。
要下载不带历史记录的其他分支,请在上述命令中添加 --branch
选项,并将 <branch>
替换为要下载的分支名称:
$ git clone --depth=1 --branch <branch> https://github.com/raspberrypi/linux
有关可用分支的完整列表,请查看 树莓派内核库。
现在你有了内核源代码,请通过 本机 或 交叉编译 构建一个新内核。
本地构建内核
本指南假设你的 Raspberry Pi 运行的是最新版本的 Raspberry Pi OS。
首先,安装构建依赖项:
$ sudo apt install bc bison flex libssl-dev make
构建配置
本节介绍如何在构建内核时应用默认配置。您还可以通过以下方式配置内核:
- 启用和禁用内核功能
- 从另一个源头添加补丁
要准备默认配置,请根据您的 Raspberry Pi 型号运行下表中的相应命令。
4 系列设备上的 32 位 Raspberry Pi OS 发行版使用 32 位用户态域,但使用 64 位内核。要构建 32 位内核,请设置 ARCH=arm
。要启动 32 位内核,请在 config.txt
中设置 arm_64bit=0
。
使用 LOCALVERSION
自定义内核版本
为防止内核覆盖 /lib/modules
中的现有模块,并在 uname
输出中说明运行的是自己的内核,请修改 LOCALVERSION
。
要修改 LOCALVERSION
,请修改 .config
中此行:
CONFIG_LOCALVERSION="-v7l-MY_CUSTOM_KERNEL"
TIP: 你也可以在 General setup > Local version - append to kernel release 中使用 menuconfig
以图形方式更改此设置。有关 menuconfig
的更多信息,请参阅 内核配置说明。
构建
接下来,构建内核。这一步可能需要很长时间,取决于你的 Raspberry Pi 型号。
- 运行以下命令构建 64 位内核:
$ make -j6 Image.gz modules dtbs
- 运行以下命令构建 32 位内核:
$ make -j6 zImage modules dtbs
提示:在多核 Raspberry Pi 型号上, make -j<n>
选项可在不同内核之间分配工作。这会大大加快编译速度。运行 nproc
查看你有多少个处理器;我们建议使用处理器乘以 1.5。
安装内核
接下来,将内核模块安装到启动介质上:
$ sudo make -j6 modules_install
然后,将内核和设备树 blobs 安装到启动分区,备份原始内核。
TIP: 如果不想在运行此命令的 Raspberry Pi 上安装刚编译好的内核,可将编译好的内核复制到另一个启动介质的启动分区,而不是 /boot/firmware/
。
安装 64 位内核:
- 运行以下命令创建当前内核的备份镜像,安装新的内核镜像、overlays、README,并卸载分区:
$ sudo cp /boot/firmware/$KERNEL.img /boot/firmware/$KERNEL-backup.img
$ sudo cp arch/arm64/boot/Image.gz /boot/firmware/$KERNEL.img
$ sudo cp arch/arm64/boot/dts/broadcom/*.dtb /boot/firmware/
$ sudo cp arch/arm64/boot/dts/overlays/*.dtb* /boot/firmware/overlays/
$ sudo cp arch/arm64/boot/dts/overlays/README /boot/firmware/overlays/
安装 32 位内核:
创建当前内核的备份,然后安装新的内核映像:
$ sudo cp /boot/firmware/$KERNEL.img /boot/firmware/$KERNEL-backup.img
$ sudo cp arch/arm/boot/zImage /boot/firmware/$KERNEL.img
根据你的 内核版本,运行以下命令:
** 适用于 6.4 及以下版本的内核:
$ sudo cp arch/arm/boot/dts/*.dtb /boot/firmware/
适用于 6.5 及以上版本的内核:
$ sudo cp arch/arm/boot/dts/broadcom/*.dtb /boot/firmware/
最后,复制 overlays 和 README:
$ sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/firmware/overlays/
$ sudo cp arch/arm/boot/dts/overlays/README /boot/firmware/overlays/
最后,运行以下命令重启 Raspberry Pi 并运行新编译的内核:
$ sudo reboot
或者,用不同的文件名复制内核(如 kernel-myconfig.img
),而不是覆盖 kernel.img
文件。然后,编辑启动分区中的 config.txt
以选择内核:
kernel=kernel-myconfig.img
将此方法与自定义的LOCALVERSION
相结合,可将自定义内核与系统管理的原版内核映像分开。有了这种安排,当你的内核无法启动时,你就可以迅速恢复到原版内核。