Linux内核
介绍
Raspberry Pi 内核 托管在 GitHub 上;更新滞后于上游 Linux内核。上游内核会持续更新,而 Raspberry Pi 会将 Linux 内核的长期版本整合到 Raspberry Pi 内核中。我们在 raspberrypi/firmware中为每个长期发布的 Linux 内核生成一个 next
分支。经过广泛的测试和讨论后,我们会将每个 next
分支合并到版本库的主分支中。
升级
通常的 Raspberry Pi OS 更新进程会自动将内核更新到最新的稳定版本。如果你想尝试最新的不稳定测试内核,可以 手动更新。
构建内核
操作系统随附的默认编译器和链接器被配置为构建在该操作系统上运行的可执行文件。原生编译使用这些默认编译器和链接器。交叉编译是为运行编译过程的目标之外的目标编译代码的过程。
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 运行最新版本的 Raspberry Pi OS。
首先,安装编译依赖项:
sudo apt install bc bison flex libssl-dev make
构建配置
本节介绍如何在构建内核时应用默认配置。你也可以通过以下方式配置内核:
要准备默认配置,请根据您的 Raspberry Pi 型号运行下表中的相应命令。
架构 | 型号 | 命令 |
64位 | Raspberry Pi 3 |
|
Raspberry Pi CM 3 | ||
Raspberry Pi 3+ | ||
Raspberry Pi CM 3+ | ||
Raspberry Pi Zero 2 W | ||
Raspberry Pi 4 | ||
Raspberry Pi 400 | ||
Raspberry Pi CM 4 | ||
Raspberry Pi CM 4S | ||
Raspberry Pi 5 |
| |
32位 | Raspberry Pi 1 |
|
Raspberry Pi CM 1 | ||
Raspberry Pi Zero | ||
Raspberry Pi Zero W | ||
Raspberry Pi 2 |
| |
Raspberry Pi 2 | ||
Raspberry Pi 3 | ||
Raspberry Pi CM 3 | ||
Raspberry Pi 3+ | ||
Raspberry Pi CM 3+ | ||
Raspberry Pi 4 |
| |
Raspberry Pi 400 | ||
Raspberry Pi CM 4 | ||
Raspberry Pi CM 4S |
Raspberry Pi 4B、5、400、CM4 或 CM 4S 上的 Raspberry Pi OS 32 位发行版使用 32 位用户态,但使用 _64 位内核。要构建 32 位内核,请设置 ARCH=arm
。要启动 32 位内核,请在 config.txt
中设置 arm_64bit=0
。
使用 LOCALVERSION 自定义内核版本
为防止内核覆盖 /lib/modules
中的现有模块,并在 uname
输出中说明运行的是自己的内核,请调整 LOCALVERSION
。
要调整 LOCALVERSION
,请修改 .config
中的以下一行:
CONFIG_LOCALVERSION="-v7l-MY_CUSTOM_KERNEL"
您还可以在 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 安装到启动分区中,并备份原始内核。
如果不想在运行此命令的 Raspberry Pi 上安装刚编译好的内核,可将编译好的内核复制到另一个启动介质的启动分区,而不是 /boot/firmware/
。
安装 64 位内核:
- 运行以下命令创建当前内核的备份镜像,安装新的内核镜像、覆盖层、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/$KERNEL-backup.img
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/
- 最后,复制覆盖层和 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
结合使用,可将自定义内核与系统管理的现有内核映像分开。有了这种安排,当你的内核无法启动时,你就可以迅速恢复到库存内核。
交叉编译内核
首先,你需要一台合适的 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
编译配置
本节介绍如何在构建内核时应用默认配置。你也可以通过以下方式配置内核:
输入以下命令来构建源代码和设备树文件:
架构 | 型号 | 命令 |
64位 | Raspberry Pi 3 |
|
Raspberry Pi CM 3 | ||
Raspberry Pi 3+ | ||
Raspberry Pi CM 3+ | ||
Raspberry Pi Zero 2 W | ||
Raspberry Pi 4 | ||
Raspberry Pi 400 | ||
Raspberry Pi CM 4 | ||
Raspberry Pi CM 4S | ||
Raspberry Pi 5 |
|