Yocto如何根据图像食谱覆盖Linux rootfs文件?

问题描述 投票:3回答:1

我正在尝试在fstab中添加一条简单的行Yocto构建的最终rootfs。

我的第一种方法是在我的图层meta-mylayer / recipes-core / base-files / base-files / fstab中添加我自己的fstab和适当的meta-mylayer / recipes- core / base-files / base-files / base-files _%。bbappend仅包含以下行:

FILESEXTRAPATHS_prepend:=“ $ {THISDIR} / $ {PN}:”]

并且它有效,但是正如我的问题的标题所说,我想根据要构建的配方图像来修改fstab,即dev-imageprod-image

经过一些调查,我认为我有2个选择

  1. 在配方映像中修改fstab,扩展do_install任务...
dev-image.bb
--------------

DESCRIPTION = "Development Image"
[...]
inherit core-image

do_install_append () {
    echo "=======  Modifying fstab ========"
    cat >> ${D}${sysconfdir}/fstab <<EOF

# The line i want to Add

EOF
}
[...]

--------------

问题是实际上我在最终的/ etc / fstab中看不到修改过的行,并且bitbake没有显示任何构建错误或关于此的警告,实际上,我什至无法看到回显-我放的跟踪。

  1. 我的第二个尝试是使用软件包来处理这些修改,根据配方图像,我将能够为* -dev或* -prod添加软件包。此想法摘自this answer中的Oleksandr Poznyak,他提出以下建议:

1)在图层中创建* .bbappend配方base-files_%s.bbappend。它追加到时髦的“基本文件”配方中。

2)在应创建的地方创建自己的“ python do_package_prepend”函数使您的配方产生两个不同的包装]

3)将它们添加到图像配方中的DEPENDS中>

根据他的example,我做了我自己的食谱:

base-files_%.bbappend
-------------------------
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"

SRC_URI += "file://fstab-dev \                                                   
file://fstab-prod \
"

PACKAGES += " ${PN}-dev ${PN}-prod"
CONFFILES_${PN}-dev = "${CONFFILES_${PN}}"
CONFFILES_${PN}-prod = "${CONFFILES_${PN}}"

pkg_preinst_${PN}-dev = "${pkg_preinst_${PN}}"
pkg_preinst_${PN}-prod = "${pkg_preinst_${PN}}"

RREPLACES_${PN}-dev = "${PN}"
RPROVIDES_${PN}-dev = "${PN}"
RCONFLICTS_${PN}-dev = "${PN}"

RREPLACES_${PN}-prod = "${PN}"
RPROVIDES_${PN}-prod = "${PN}"
RCONFLICTS_${PN}-prod = "${PN}"

python populate_packages_prepend() {
    import shutil

    packages = ("${PN}-dev", "${PN}-prod")
    for package in packages:
    # copy ${PN} content to packages
        shutil.copytree("${PKGD}", "${PKGDEST}/%s" % package, symlinks=True)
    # replace fstab
    if package == "${PN}-dev":
        shutil.copy("${WORKDIR}/fstab-dev", "${PKGDEST}/${PN}-dev/etc/fstab")
    else:
        shutil.copy("${WORKDIR}/fstab-prod", "${PKGDEST}/${PN}-prod/etc/fstab")
}
-------------------------

并且在我的配方图像(dev-image.bb)中,我添加了基本文件-dev数据包

dev-image.bb
--------------

DESCRIPTION = "Development Image"
[...]
inherit core-image

IMAGE_INSTALL = " \
 ${MY_PACKETS} \
 base-files-dev \
"

[...]

--------------

这个问题

,是我对phyton缩进不熟悉,所以我可能搞砸了,错误日志显示如下。
DEBUG: Executing python function populate_packages
ERROR: Error executing a python function in exec_python_func() autogenerated:

The stack trace of python calls that resulted in this exception/failure was:
File: 'exec_python_func() autogenerated', lineno: 2, function: <module>
     0001:
 *** 0002:populate_packages(d)
     0003:
File: '/home/build/share/build_2/../sources/poky/meta/classes/package.bbclass', lineno: 1138, function: populate_packages
     1134:
     1135:    workdir = d.getVar('WORKDIR')
     1136:    outdir = d.getVar('DEPLOY_DIR')
     1137:    dvar = d.getVar('PKGD')
 *** 1138:    packages = d.getVar('PACKAGES').split()
     1139:    pn = d.getVar('PN')
     1140:
     1141:    bb.utils.mkdirhier(outdir)
     1142:    os.chdir(dvar)
File: '/usr/lib/python3.6/shutil.py', lineno: 315, function: copytree
     0311:    destination path as arguments. By default, copy2() is used, but any
     0312:    function that supports the same signature (like copy()) can be used.
     0313:
     0314:    """
 *** 0315:    names = os.listdir(src)
     0316:    if ignore is not None:
     0317:        ignored_names = ignore(src, names)
     0318:    else:
     0319:        ignored_names = set()
Exception: FileNotFoundError: [Errno 2] No such file or directory: '${PKGD}'

DEBUG: Python function populate_packages finished
DEBUG: Python function do_package finished

我将非常感谢任何线索或方向,我不是Yocto专家,所以也许我建议的选择不是最优雅的,并且可能有更好的方法,所以请随意给我建议。

非常感谢。

更新:

[一如既往,我不是唯一尝试此操作的人,我使它起作用的方式是感谢answer唯一的不便之处是,您需要通过.bbappend rm安装您想安装的东西,但现在对我来说很好。

我也尝试对bbclasses做同样的事情,对我来说,这样做更elegant way,但是我失败了……我遇到了以下错误

错误:base-files-dev-3.0.14-r89 do_packagedata:配方base-files-dev尝试在文件已存在时将其安装到共享区域中。这些文件及其清单位置为:

我尝试在.bbappend中rm fstab,但显示了相同的错误

也许有人会分享我在做错什么...

如果您认为此帖子不有价值,请删除...

我正在尝试在Yocto构建的最终rootfs中的fstab中添加一条简单的行。我的第一种方法是在自己的图层meta-mylayer / recipes-core / base-files / base-files / fstab和...

embedded-linux yocto
1个回答
0
投票

您的基于Oleksandr的配方由于在较新的Poky中不再支持变量扩展而无法使用。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.