簡體   English   中英

Yocto 如何根據 IMAGE 配方覆蓋 linux rootfs 文件?

[英]Yocto How to overwrite a file of linux rootfs depending on an IMAGE-recipe?

我正在嘗試在 Yocto 構建的最終 rootfs 中的fstab 中添加一個簡單的行。

我的第一種方法是在我的圖層meta-mylayer/recipes-core/base-files/base-files/fstab和適當的meta-mylayer/recipes-core/base-files/base-files/base- 中添加我自己的fstab files_%.bbappend其中只有以下行:

FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"

它有效,但正如我的問題標題所說,我想根據我想要構建的配方圖像修改fstab ,即dev-image & prod-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 添加包。 這個想法是從Oleksandr Poznyak這個答案中總結出來的,他建議如下:

1) 在你的層中創建 *.bbappend recipe base-files_%s.bbappend 。 它附加到 poky 的“基本文件”配方。

2) 創建你自己的“python do_package_prepend”函數,你應該讓你的配方產生兩個不同的包

3)將它們添加到您的圖像配方中的 DEPENDS

根據他的例子,我做了我自己的食譜:

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")
}
-------------------------

在我的 recipe-image(dev-image.bb) 中,我添加了 base-files-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 專家,所以也許我建議的選項不是最優雅的,可能有更好的方法來做到這一點,所以請隨時給我任何建議。

非常感謝。

更新:

和往常一樣,我不是唯一一個嘗試這個的人,我讓它工作的方式是感謝這個答案唯一的不便是你需要通過 .bbappend rm 你想要安裝的東西,但現在對我來說很好.

我也嘗試對 bbclasses 做同樣的事情,這對我來說是一種更優雅的方式,但我失敗了......我收到以下錯誤

錯誤:base-files-dev-3.0.14-r89 do_packagedata:當這些文件已經存在時,配方 base-files-dev 試圖將文件安裝到共享區域。 這些文件及其清單位置是:

我試圖在 .bbappend 中 rm fstab 但顯示相同的錯誤

也許有人會分享我做錯了什么......

如果你覺得這篇文章沒有價值,請刪除...

由於在較新的 Poky 中不再支持變量擴展,您基於 Oleksandr 的配方不起作用。

https://www.yoctoproject.org/docs/latest/mega-manual/mega-manual.html#migration-2.1-variable-expansion-in-python-functions

錯誤顯式說:異常:FileNotFoundError:[Errno 2] 沒有這樣的文件或目錄:'${PKGD}' 它沒有擴展變量。

聚苯乙烯

這不是您問題的正確答案,但 SO 會阻止評論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM