树莓派4B交叉编译更新Linux内核

参考:https://www.raspberrypi.com/documentation/computers/linux_kernel.html#kernel

以下基本全文复制官方教程。

原本树莓派4b运行的就是ubuntu 24.04,通过uname -m得到aarch64架构。因此选择64位选项

下载内核源码

下载最新树莓派内核的源代码:

1
git clone --depth=1 https://github.com/raspberrypi/linux

说明:--depth=1 表示 只下载最新的一层提交记录(commit)

本地构建内核

安装依赖项

安装构建依赖项:

1
sudo apt install bc bison flex libssl-dev make libc6-dev libncurses5-dev

工具说明 bc bison flex libssl-dev make 是要安装的具体软件包,各自功能如下:

  • bc:一款支持高精度计算的命令行计算器,常用于脚本中进行数学运算。
  • bison:语法分析器生成器,配合 flex 可用于开发编译器、解释器等需要语法解析的工具。
  • flex:词法分析器生成器,用于将输入的字符流转换为结构化的 “令牌(token)”。
  • libssl-dev:OpenSSL 库的开发文件。
  • make:make构建自动化工具。

安装交叉编译工具链

  • 要安装用于构建 64 位内核的 64 位工具链,请运行以下命令:

    1
    sudo apt install crossbuild-essential-arm64
  • 要安装用于构建 32 位内核的 32 位工具链,请运行以下命令:

    1
    sudo apt install crossbuild-essential-armhf

配置内核

对于64位的树莓派4b来说,需要进行如下配置:

1
2
3
cd linux
KERNEL=kernel8
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig

编译内核

  • 运行以下命令构建 64 位内核:

    1
    make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs
  • 运行以下命令构建 32 位内核:

    1
    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs

安装内核

确认启动介质

将SD卡插入PC,执行lsblk命令,查看是否有sdb等信息。在我的电脑上是sdd

1
2
3
sdd 8:48 1 29.7G 0 disk 
├─sdd1 8:49 1 512M 0 part /media/book/system-boot
└─sdd2 8:50 1 29.2G 0 part /media/book/writable

/media/book/system-boot 对应 Raspberry Pi 启动分区;

/media/book/writable 对应根文件系统

可以设置环境变量,方便后续操作

1
2
3
4
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
export BOOT=/media/book/system-boot
export ROOT=/media/book/writable

安装内核模块到根分区

1
2
3
sudo env PATH=$PATH make -j"$(nproc)" \
ARCH=$ARCH CROSS_COMPILE=$CROSS_COMPILE \
INSTALL_MOD_PATH=$ROOT modules_install

这一步会在 /media/book/writable/lib/modules/ 下面生成你新编译的模块目录,例如:

1
/media/book/writable/lib/modules/6.6.32-v8+/

备份旧内核并复制新内核和设备树到 /system-boot

💡 Ubuntu 的启动分区通常包含 vmlinuz, initrd.img, config.txt, cmdline.txt 等。
我们建议把自己的内核命名为 kernel8.img(Pi 4 的标准命名),并在 config.txt 里指明。

1️⃣ 备份现有启动文件:
1
2
sudo cp -a $BOOT/kernel8.img $BOOT/kernel8-backup.img 2>/dev/null || true
sudo cp -a $BOOT/vmlinuz $BOOT/vmlinuz-backup 2>/dev/null || true
2️⃣ 复制新编译的内核镜像:
1
sudo cp -a arch/arm64/boot/Image $BOOT/kernel8.img
3️⃣ 复制设备树文件(DTB 和 overlays):
1
2
3
4
sudo cp -a arch/arm64/boot/dts/broadcom/*.dtb $BOOT/
sudo mkdir -p $BOOT/overlays
sudo cp -a arch/arm64/boot/dts/overlays/*.dtb* $BOOT/overlays/
sudo cp -a arch/arm64/boot/dts/overlays/README $BOOT/overlays/ 2>/dev/null || true

确保 config.txt 正确

打开 /media/book/system-boot/config.txt,检查或添加:

1
2
kernel=kernel8.img
arm_64bit=1

如果你用了压缩内核或自定义文件名,必须在这里改成一致的名字。


同步并卸载分区

复制完成后一定要卸载,否则数据可能没写入卡:

1
2
3
sync
sudo umount $BOOT
sudo umount $ROOT

⚡ 六、启动验证

把这张卡插回树莓派 4B,启动后用串口或 SSH 登录执行:

1
uname -a

如果显示你的新内核版本(例如你设置的 -v8 后缀),说明更新成功 🎉

验证模块是否加载:

1
ls /lib/modules

应该能看到与你新内核版本号对应的目录。