如何在Yocto构建系统的rootfs中安装无源码的out-of-tree内核模块
在Yocto中安装预编译的Out-of-Tree内核模块
模块安装路径
Linux系统中,第三方out-of-tree内核模块的标准安装路径是:/lib/modules/<内核版本>/extra/
Yocto构建时可通过变量${KERNEL_VERSION}自动获取当前内核版本,配方中对应的目标路径为${D}/lib/modules/${KERNEL_VERSION}/extra/。
对应的Yocto配方示例
创建名为hello-mod.bb的配方文件,放在自定义层的recipes-kernel/hello-mod/目录下,同时将hello.ko放在该目录的files/子目录中:
SUMMARY = "Pre-built hello out-of-tree kernel module" LICENSE = "Proprietary" # 若厂商提供许可证文件,替换为实际文件路径和校验和 LIC_FILES_CHKSUM = "file://LICENSE;md5=d41d8cd98f00b204e9800998ecf8427e" # 指定预编译模块来源,本地文件放在配方的files目录下 SRC_URI = "file://hello.ko" # 工作目录直接使用下载文件所在的WORKDIR S = "${WORKDIR}" do_install() { # 创建目标目录 install -d ${D}/lib/modules/${KERNEL_VERSION}/extra/ # 复制模块文件并设置标准权限 install -m 0644 ${S}/hello.ko ${D}/lib/modules/${KERNEL_VERSION}/extra/ } # 生成模块依赖文件,确保系统能识别模块 do_install_append() { depmod -b ${D} ${KERNEL_VERSION} } # 声明依赖对应版本的内核,避免模块与内核不匹配 RDEPENDS:${PN} = "kernel-${KERNEL_VERSION}"
关键说明与建议
- 许可证要求:Yocto强制要求设置
LICENSE和LIC_FILES_CHKSUM,若厂商未提供许可证文件,可暂时使用上述占位校验和(对应空文件),但建议向厂商索要合法许可证文件。 - 版本匹配验证:预编译模块必须与Yocto构建的内核版本、编译配置、GCC版本完全一致,否则加载会失败。可通过
modinfo hello.ko查看模块的内核版本信息,与目标系统uname -r的输出对比。 - 层结构规范:将配方放在自定义层(如
meta-my)中,保持Yocto层结构整洁,便于后续维护。 - 构建与部署:在
local.conf中添加IMAGE_INSTALL_append = " hello-mod",然后重新构建镜像;也可单独构建模块:bitbake hello-mod,再将生成的包部署到目标板。 - 模块加载:在目标板上可通过
insmod /lib/modules/$(uname -r)/extra/hello.ko手动加载,或使用modprobe hello(需模块无未满足的依赖),用lsmod检查加载状态。
内容的提问来源于stack exchange,提问作者akumar
相关产品推荐
相关产品推荐

