Ubuntu24.04交叉编译实时内核为树莓派5安装preempt_rt补丁
1. 交叉编译流程
环境准备
本文所使用的环境为Ubuntu 24.04,CPU结构为AMD64,而树莓派5的CPU结构为ARM64,因此需要安装交叉编译工具链。
安装交叉编译工具链
sudo apt update sudo apt install crossbuild-essential-arm64 sudo apt install bison flex libssl-dev bc libncurses-dev下载内核源码和补丁
git clone --depth=1 --branch=rpi-6.6.y https://github.com/raspberrypi/linux.git补丁地址: https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/
cd linux xz -d ../patch-6.6.76-rt49.patch.xz # 打补丁 patch -p1 < ../patch-6.6.76-rt49.patch
配置内核
默认情况下,树莓派5使用的内核配置文件为 bcm2712_defconfig。我们将使用该配置文件作为基础进行编译。
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2712_defconfig启用 PREEMPT_RT 支持
运行以下命令进入内核配置菜单:
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig在菜单中,确保以下选项已启用:
- 进入 General setup:
- 选择 Preemption Model:
- 选择 Fully Preemptible Kernel (Real-Time)。
- 选择 Preemption Model:
- 保存并退出。
编译内核镜像和设备树
运行以下命令开始编译:
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc)ARCH=arm64:指定目标架构为 ARM 64 位。CROSS_COMPILE=aarch64-linux-gnu-:指定交叉编译工具链。-j$(nproc):使用所有可用的 CPU 核心加速编译。
编译内核模块
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- modules -j$(nproc)准备安装文件
编译完成后,生成的文件位于以下目录:
- 内核镜像:
arch/arm64/boot/Image - 设备树文件(DTB):
arch/arm64/boot/dts/broadcom/ - 模块文件:
modules目录
将这些文件打包,方便传输到树莓派
cd ..
mkdir kernel-build
cd linux
cp arch/arm64/boot/Image ../kernel-build/
cp arch/arm64/boot/dts/broadcom/*.dtb ../kernel-build/
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- modules_install INSTALL_MOD_PATH=../kernel-build/
cd ..
tar -czvf kernel-build.tar.gz kernel-build/传输文件到树莓派
将打包的文件传输到树莓派。你可以使用 scp 或 USB 驱动器
scp kernel-build.tar.gz pi@<树莓派IP地址>:/home/pi/
tar -zxvf linux.tar.gz安装内核镜像和设备树
将内核镜像和设备树文件复制到 /system-boot 目录(需要拔下SD卡,在另一台电脑上操作)
sudo cp kernel-build/Image /boot/kernel6.6.77-rt49-v8-16k+.img
sudo cp kernel-build/*.dtb /boot/安装内核模块
sudo cp -r kernel-build/lib/modules/6.6.77-rt49-v8-16k+ /lib/modules/更新 initramfs
生成 initramfs 文件:
sudo mkinitramfs -o /boot/initrd.img-6.6.77-rt49-v8-16k+更新引导配置
编辑 /system-boot/config.txt 文件,确保引导配置正确:
把内核镜像移动到system-boot文件夹
kernel=kernel6.6.77-rt49-v8-16k+.img
initramfs initrd.img-6.6.77-rt49-v8-16k+ followkernelsudo boot测试
sudo apt-get install rt-tests
cyclictest -t 5 -p 80 -i 1000
2. 清除编译失败的内核
如果你在编译内核时失败,并且希望清除编译过程中生成的文件,可以按照以下步骤操作。这些步骤将帮助你清理编译失败的内核,恢复到源码的初始状态。
清理编译生成的文件
在内核源码目录中,运行以下命令来清理编译生成的文件:
make clean这将删除大多数编译生成的文件,例如目标文件(.o)、内核镜像(vmlinux)等,但会保留配置文件(.config)和一些其他生成的文件。
完全清理(包括配置文件)
如果你想彻底清理,包括删除配置文件和其他生成的文件,可以使用:
make mrproper这将删除以下内容:
- 所有编译生成的文件
- 配置文件(
.config) - 备份文件(
*.orig、*.rej等) - 其他临时文件
运行此命令后,内核源码目录将恢复到初始状态,就像刚刚解压或克隆时一样。
删除安装的内核文件
如果你已经通过 make install 或 make modules_install 安装了内核,还需要手动删除安装的文件。
删除内核镜像和 System.map
sudo rm -rf /boot/vmlinuz-<内核版本>
sudo rm -rf /boot/System.map-<内核版本>
sudo rm -rf /boot/config-<内核版本>删除模块文件
sudo rm -rf /lib/modules/<内核版本>删除设备树文件(DTB)
sudo rm -rf /boot/dtbs/<内核版本>删除 initramfs 文件
sudo rm -rf /boot/initrd.img-<内核版本>将 <内核版本> 替换为你编译的内核版本号(例如 6.8.0)。
清理残留文件
如果你在编译过程中使用了额外的工具或脚本,可能会生成一些残留文件。你可以手动检查并删除这些文件。
检查并删除残留文件
git clean -fd如果你使用的是 Git 仓库,此命令会删除所有未被跟踪的文件和目录。
5. 恢复到初始状态(可选)
如果你是从 Git 仓库获取的内核源码,可以通过以下命令恢复到初始状态:
git reset --hard
git clean -fd这将重置所有更改并删除未跟踪的文件。
6. 删除源码目录(可选)
如果你不再需要内核源码,可以直接删除整个源码目录:
cd ..
rm -rf linux-6.8.0总结
要完全清除编译失败的内核,可以按照以下步骤操作:
- 运行
make clean或make mrproper清理编译生成的文件。 - 删除安装的内核文件(如
/boot和/lib/modules下的文件)。 - 使用
git clean或手动删除残留文件。 - 如果需要,删除整个源码目录。
通过这些步骤,你可以彻底清除编译失败的内核及其生成的文件。如果还有其他问题,请随时告诉我!