You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 10:36:06