摘要:使用正确的 RK3588 defconfig 构建 Linux 6.1 kerneldeb,并通过
pipefail、日志和阶段化检查定位失败原因。
适用对象:已经准备好 LubanCat SDK、需要生成 Linux 6.1 内核 DEB 包的开发者。构建必须在开发主机执行。
文章目录
- 本篇要解决什么问题
- 为什么不能只看最后一行“成功”
- 一、选择正确的 defconfig
- 二、检查关键配置
- 三、构建 kerneldeb 并保存日志
- 四、为什么采用 DEB
- 五、定位失败位置
- 六、把构建过程做成可追溯记录
- 构建成功后再做产物级验收
- 七、`.config`、defconfig 与最终产物的关系
- 八、本文验收清单
- 小结
- 工作流实测截图
- 专栏导航
- 参考资料
本篇要解决什么问题
这一篇从“环境已经可用”进入真正的内核构建阶段。目标不是看到终端滚过大量编译日志,而是得到一组可以安装、可以校验、可以回滚的 DEB 产物。
整个过程可以拆成四个检查点:
| 阶段 | 关键问题 | 验证手段 |
|---|---|---|
| 选择配置 | SDK 是否真的选择 RK3588 + Linux 6.1 | defconfig 输出、kernel-6.1/.config |
| 内核配置 | PREEMPT_RT、CAN、YT6801 是否进入最终.config | grep CONFIG_... |
| 编译打包 | kerneldeb是否真正成功 | pipefail+ 退出码 + 完整日志 |
| 产物验收 | DEB 中是否含内核、DTB、模块 | dpkg-deb -c、SHA256 |
为什么不能只看最后一行“成功”
带有tee的构建命令如果没有pipefail,管道最后一个命令成功并不一定代表前面的构建程序成功。因此本文不仅保存日志,还要求检查退出码和最终包内容。
一、选择正确的 defconfig
在 SDK 根目录执行:
SDK="$HOME/lubancat/LubanCat_SDK"cd"$SDK"./build.sh\rk3588:LubanCat_rk3588_ubuntu_linux6.1_gnome_defconfig芯片前缀rk3588:很重要。配置成功后,SDK 会在output/.config中写入最终配置,并选择kernel-6.1目录。
二、检查关键配置
grep-E'CONFIG_PREEMPT_RT|CONFIG_CAN_GS_USB|CONFIG_NET_VENDOR_MOTORCOMM|CONFIG_FUXI'\kernel-6.1/.config本次移植至少关注:
CONFIG_PREEMPT_RT=y CONFIG_HZ_1000=y CONFIG_CAN=y CONFIG_CAN_RAW=y CONFIG_CAN_GS_USB=m CONFIG_NET_VENDOR_MOTORCOMM=y CONFIG_FUXI=m=m表示编译成模块,=y表示编译进内核。配置文件中的项目必须被实际构建系统读取,不能只修改一个未使用的.config。
三、构建 kerneldeb 并保存日志
set-opipefail ./build.sh kerneldeb2>&1|teeoutput/kerneldeb-rt36.logset -o pipefail能让管道前面的构建失败正确传递到脚本退出码,避免tee成功导致误判。
构建完成后查看最后的错误:
tail-n100output/kerneldeb-rt36.log成功日志末尾应出现类似内容:
Running 10-kernel.sh - build_kerneldeb succeeded.还必须确认命令退出码为0。本次最终构建生成的是 revision-12:
linux-image-6.1.99-rt36-rk3588_6.1.99-rt36-rk3588-12_arm64.deb linux-headers-6.1.99-rt36-rk3588_6.1.99-rt36-rk3588-12_arm64.deb检查包元数据和关键文件:
image_deb=linux-image-6.1.99-rt36-rk3588_6.1.99-rt36-rk3588-12_arm64.deb dpkg-deb-f"$image_deb"Package Version Architecture dpkg-deb-c"$image_deb"\|grep-E'boot/vmlinuz|rk3588-lubancat-5io\.dtb|gs_usb\.ko|yt6801\.ko'sha256sum"$image_deb"本次两个部署包的 SHA256 为:
d4141e0a4f7b93c0e1736232aef893c42e2987272158637c4fb3820e131901d7 linux-image-6.1.99-rt36-rk3588_6.1.99-rt36-rk3588-12_arm64.deb 3ee5fd9a8ebd8a11c1644aeea1d9c367b57545ed35b1871404b9687557e44f82 linux-headers-6.1.99-rt36-rk3588_6.1.99-rt36-rk3588-12_arm64.deb每次重新构建后都要重新计算哈希,不能沿用本文数值。
四、为什么采用 DEB
DEB 可以由dpkg管理,安装时自动生成 initramfs、写入模块目录并记录版本,适合在多台相同设备上重复部署。不要直接把单个Image覆盖到启动分区后就认为升级完成,这样容易遗漏模块、设备树或 initramfs。
五、定位失败位置
看到错误时先判断阶段:
- Kconfig 阶段:多为
flex、bison或配置名问题; - 内核编译阶段:检查编译器、配置和具体源文件;
check-kernel.sh阶段:检查lz4和压缩格式;- 打包阶段:检查 DEB 控制文件、模块安装路径和设备树布局。
六、把构建过程做成可追溯记录
建议每次正式构建都创建一个独立的日志和产物记录目录,而不是只保留终端历史:
stamp=$(date+%Y%m%d-%H%M%S)record_dir="output/build-record-$stamp"mkdir-p"$record_dir"cpkernel-6.1/.config"$record_dir/kernel.config"./build.shhelp>"$record_dir/build-help.txt"2>&1set-opipefail ./build.sh kerneldeb2>&1|tee"$record_dir/kerneldeb.log"rc=${PIPESTATUS[0]}echo"kerneldeb_exit=$rc"|tee"$record_dir/result.txt"exit"$rc"这里使用PIPESTATUS[0]直接读取管道中build.sh的退出状态。即使最终终端显示了tee的正常输出,也不会把构建失败误判成成功。
构建成功后再做产物级验收
至少检查三个层面:
- 包元数据:Package、Version、Architecture 是否正确;
- 关键文件:kernel、DTB、
gs_usb.ko、yt6801.ko是否进入最终包; - 完整性:对最终准备部署的 DEB 重新计算 SHA256。
七、.config、defconfig 与最终产物的关系
一个常见误区是“我明明改了配置,为什么模块没有生成”。原因往往是修改的配置文件没有被当前构建入口真正读取。
- defconfig:用于生成初始配置;
.config:本次构建实际使用的展开配置;CONFIG_xxx=m/y:只有进入当前.config并参与 Kbuild,才会反映到最终产物。
因此每次构建前、构建后都建议检查关键配置和包内容,形成首尾闭环。
八、本文验收清单
- 使用了带
rk3588:前缀的正确 defconfig; CONFIG_PREEMPT_RT=y、CAN、YT6801 配置进入实际.config;kerneldeb退出码为 0;- 保存了完整构建日志;
- image/headers DEB 文件名明确,不使用模糊通配符;
- 最终 DEB 中存在目标 DTB 和关键模块;
- SHA256 已重新计算并记录。
小结
一次可靠构建必须同时保留配置命令、完整日志、SDK manifest 和最终 DEB。这样出现启动问题时,才能把“源码问题”和“部署问题”分开。
工作流实测截图
图1:PREEMPT_RT、HZ、SocketCAN 和 gs_usb 配置确认。
图2:内核 DEB 包构建末尾日志;以该日志和生成文件作为构建成功判据。
专栏导航
专栏:LubanCat RK3588 实时 Linux 开发实战(第 4/13 篇)
- 上一篇:LubanCat RK3588 实时 Linux 开发(三):SDK 环境准备与 flex、bison、LZ4 依赖排查
- 下一篇:LubanCat RK3588 实时 Linux 开发(五):如何确认 PREEMPT_RT 实时内核真正生效
参考资料
- Linux Kconfig Language
- Linux Kbuild 文档
- Debian package tools: dpkg-deb
文中的版本号、接口名、设备地址和测试数据均应以自己的板卡实测为准;引用命令前请先确认当前 SDK、内核和启动布局。
标签:RK3588LubanCat SDKLinux 6.1内核编译kerneldeb