如何构建带5.10 PREEMPT RT自定义内核的Raspbian及解决启动黑屏
树莓派Linux 5.10内核启用PREEMPT_RT后启动黑屏问题
我正在尝试为Linux 5.10内核启用PREEMPT_RT(完全抢占模型),但使用自定义内核镜像启动时出现黑屏,暂未定位到问题原因,以下是我的全部操作步骤:
所有相关文件可在对应仓库获取,只需克隆仓库后运行make即可执行构建。
- 步骤1:使用Docker完成构建,所用Dockerfile内容如下:
FROM ubuntu:20.04 ENV TZ=Europe/Copenhagen RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone RUN apt-get update RUN apt-get install -y git make gcc bison flex libssl-dev bc ncurses-dev kmod RUN apt-get install -y crossbuild-essential-arm64 RUN apt-get install -y wget zip unzip fdisk nano WORKDIR /rpi-kernel RUN git clone https://github.com/raspberrypi/linux.git -b rpi-5.10.y --depth=1 RUN wget https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/5.10/patch-5.10.59-rt52.patch.gz WORKDIR /rpi-kernel/linux/ ENV KERNEL=kernel8 ENV ARCH=arm64 ENV CROSS_COMPILE=aarch64-linux-gnu- RUN gzip -cd ../patch-5.10.59-rt52.patch.gz | patch -p1 --verbose RUN make bcm2711_defconfig ADD .config ./ RUN make Image modules dtbs WORKDIR /raspios RUN apt -y install RUN wget https://downloads.raspberrypi.org/raspios_lite_armhf/images/raspios_lite_armhf-2021-05-28/2021-05-07-raspios-buster-armhf-lite.zip RUN unzip 2021-05-07-raspios-buster-armhf-lite.zip && rm 2021-05-07-raspios-buster-armhf-lite.zip RUN mkdir /raspios/mnt && mkdir /raspios/mnt/disk && mkdir /raspios/mnt/boot ADD build.sh ./ ADD config.txt ./
- 步骤2:所用
build.sh脚本内容如下:
#!/bin/sh mount -t ext4 -o loop,offset=$((532480*512)) 2021-05-07-raspios-buster-armhf-lite.img /raspios/mnt/disk mount -t vfat -o loop,offset=$((8192*512)),sizelimit=$((524288*512)) 2021-05-07-raspios-buster-armhf-lite.img /raspios/mnt/boot cd /rpi-kernel/linux/ make INSTALL_MOD_PATH=/raspios/mnt/disk modules_install make INSTALL_DTBS_PATH=/raspios/mnt/boot dtbs_install cd - cp /rpi-kernel/linux/arch/arm64/boot/Image /raspios/mnt/boot/$KERNEL\_rt.img cp /rpi-kernel/linux/arch/arm64/boot/dts/broadcom/*.dtb /raspios/mnt/boot/ cp /rpi-kernel/linux/arch/arm64/boot/dts/overlays/*.dtb* /raspios/mnt/boot/overlays/ cp /rpi-kernel/linux/arch/arm64/boot/dts/overlays/README /raspios/mnt/boot/overlays/ cp /raspios/config.txt /raspios/mnt/boot/ touch /raspios/mnt/boot/ssh umount /raspios/mnt/disk umount /raspios/mnt/boot zip 2021-05-07-raspios-buster-armhf-lite.zip 2021-05-07-raspios-buster-armhf-lite.img
- 步骤3:使用自定义的.config文件:在容器内运行
make menuconfig启用完全PREEMPT_RT选项后导出得到该文件,为了让完全PREEMPT_RT选项可见先禁用了KVM,该修改符合使用需求,除此之外没有对内核做其他定制。 - 步骤4:最终生成压缩的SD卡镜像,解压后使用以下命令写入SD卡:
sudo dd if=2021-05-07-raspios-buster-armhf-lite.img of=/dev/mmcblk0 bs=1M status=progress
参照官方内核构建指南测试,在config.txt中指定原版kernel8.img可以正常启动,但是启用PREEMPT_RT的自定义内核无法正常运行。请问上述流程中遗漏了什么环节?或者应该从哪些方向排查才能得到可用的自定义Linux内核镜像?
排查与修复方案
已确认的流程疏漏
- 架构不兼容:你编译的是arm64架构内核,但使用的根文件系统是32位armhf版本的Raspberry Pi OS,32位用户态默认无法适配64位内核,除非在config.txt中显式添加
arm_64bit=1参数,否则内核加载阶段会直接失败,表现为黑屏。 - 内核启动参数缺失:你生成的自定义内核文件名为
kernel8_rt.img,如果没有在config.txt中添加kernel=kernel8_rt.img,树莓派固件会默认加载原版内核,参数冲突就会触发黑屏。 - Docker构建脚本错误:Dockerfile中存在
RUN apt -y install的空执行指令,会直接导致构建过程报错终止,未修正该问题的前提下构建出的镜像本身就不完整。 - 补丁版本不匹配:你拉取的rpi-5.10.y分支内核小版本不一定是5.10.59,直接打对应版本的RT补丁可能存在部分内容适配失败,补丁不完整的情况下编译出的内核本身存在缺陷,无法正常启动。
排查步骤
- 开启串口调试:在config.txt中添加
enable_uart=1,用USB转TTL模块连接树莓派GPIO串口,波特率设置为115200,启动时可获取完整内核打印日志,直接定位启动失败的具体阶段。 - 验证基础编译流程:先不打RT补丁,使用同一套编译流程、同一份.config(仅关闭PREEMPT_RT选项)编译内核,确认可以正常启动后再打RT补丁编译,排除基础编译流程的问题。
- 替换64位根文件系统:直接使用arm64版本的Raspberry Pi OS镜像作为基础根文件系统,避免32/64位混合架构的兼容性问题。
- 验证补丁应用状态:打补丁后检查目录下是否存在.rej后缀的补丁失败文件,确认所有补丁都正常应用后再开始内核编译。
- 确认SD卡写入完整性:dd命令执行完成后运行
sync,确保所有数据完全写入SD卡后再拔出,避免文件缺失导致启动失败。
内容的提问来源于stack exchange,提问作者remus
相关产品推荐
相关产品推荐

