如何在Yocto的linux-raspberypi devshell中增量编译内核并部署
问题
为缩短从执行bitbake image-name到完整烧录至板卡的周期,我希望仅重新编译内核并通过脚本将Image、DTB、模块复制到板卡。目前我在RaspiOS发行版内核上已通过以下两个脚本实现该操作:
编译脚本
# For building the kernel set -e # build the sources and Device Tree files: make -j12 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711mahle_defconfig # build a 64-bit kernel make -j12 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs
部署脚本
set -e ROOTFS_PATH=path to mounted ROOTFS BOOTFS_PATH=path to mounted BOOTFS # copy modules echo "Copying kernel modules..." sudo env PATH=$PATH make -j12 ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=$ROOTFS_PATH modules_install # copy kernel image echo "Copying kernel image..." sudo cp arch/arm64/boot/Image $BOOTFS_PATH/$KERNEL.img # copy device tree blobs echo "Copying device tree blobs..." sudo cp arch/arm64/boot/dts/broadcom/*.dtb $BOOTFS_PATH # copy readme sudo cp arch/arm64/boot/dts/overlays/README $BOOTFS_PATH/overlays # copy overlays echo "Copying device tree overlays..." sudo cp arch/arm64/boot/dts/overlays/*.dtb* $BOOTFS_PATH/overlays echo "Done"
请问能否在执行bitbake linux-raspberypi -c devshell进入的环境中实现同样操作?我注意到devshell环境中已有所需变量,但不清楚如何正确调用make来复现Yocto的do_compile和do_compile_kernel_modules任务的行为。我的最终目标是实现内核修改后仅增量编译变更部分,而非像Yocto那样每次都全量重建。注:测试发现make dtbs可正常运行。
解决方案
完全可以在Yocto的devshell环境中实现增量编译内核并部署,以下是具体操作步骤:
1. 进入内核devshell环境
执行命令进入预配置好的内核开发环境:
bitbake linux-raspberypi -c devshell
该环境已自动设置ARCH、CROSS_COMPILE、KERNEL_SRC等Yocto内核构建所需变量,无需手动指定交叉编译工具链和架构。
2. 增量编译内核
在devshell中直接用make命令即可实现增量编译,无需重复指定架构和交叉编译参数:
# 仅编译内核镜像、模块和DTB,自动增量编译修改过的文件 make -j$(nproc) Image modules dtbs
- 若首次进入devshell,需先加载Yocto预设的内核配置:
make ${KERNEL_DEFCONFIG}${KERNEL_DEFCONFIG}是Yocto为linux-raspberypi定义的默认配置变量,对应你使用的bcm2711mahle_defconfig,直接调用即可。
3. 调整部署脚本适配Yocto环境
修改部署脚本,利用devshell内置变量,同时适配Yocto内核的输出路径:
set -e # 替换为你实际挂载的ROOTFS和BOOTFS路径 ROOTFS_PATH=/path/to/mounted/rootfs BOOTFS_PATH=/path/to/mounted/bootfs # 安装内核模块,直接使用环境变量,无需手动指定ARCH和CROSS_COMPILE echo "Copying kernel modules..." sudo env PATH=$PATH make INSTALL_MOD_PATH=$ROOTFS_PATH modules_install # 复制内核镜像,Raspberry Pi 64位系统默认使用kernel8.img作为镜像名 echo "Copying kernel image..." sudo cp arch/arm64/boot/Image $BOOTFS_PATH/kernel8.img # 复制DTB文件 echo "Copying device tree blobs..." sudo cp arch/arm64/boot/dts/broadcom/*.dtb $BOOTFS_PATH # 复制Overlay文件和说明文档 echo "Copying device tree overlays..." sudo cp arch/arm64/boot/dts/overlays/README $BOOTFS_PATH/overlays sudo cp arch/arm64/boot/dts/overlays/*.dtb* $BOOTFS_PATH/overlays echo "Done"
4. 增量编译注意事项
- 确保devshell基于已成功构建的
linux-raspberypi包,首次进入需完成一次完整编译,后续才能实现增量编译。 - 仅在devshell环境内修改内核源码,避免Yocto构建缓存与devshell编译状态不一致导致增量编译异常。
- 如需清理编译缓存,执行
make clean或make distclean即可,之后重新编译会从头开始。
内容的提问来源于stack exchange,提问作者Luca Faggion
相关产品推荐
相关产品推荐

