添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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
    cd linux
    KERNEL=kernel8
    make bcm2711_defconfig
    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
    cd linux
    KERNEL=kernel_2712
    make bcm2712_defconfig
    32位 Raspberry Pi 1
    cd linux
    KERNEL=kernel
    make bcmrpi_defconfig
    Raspberry Pi CM 1
    Raspberry Pi Zero
    Raspberry Pi Zero W
    Raspberry Pi 2
    cd linux
    KERNEL=kernel7
    make bcm2709_defconfig
    Raspberry Pi 2
    Raspberry Pi 3
    Raspberry Pi CM 3
    Raspberry Pi 3+
    Raspberry Pi CM 3+
    Raspberry Pi 4
    cd linux
    KERNEL=kernel7l
    make bcm2711_defconfig
    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

    编译配置

    本节介绍如何在构建内核时应用默认配置。你也可以通过以下方式配置内核: