我有一个已建立的yocto构建,我现在正在尝试切换到拥有根文件系统(例如EXTRA_IMAGE_FEATURES += "read-only-rootfs"
)。
然而,我遇到了meta-mono层中的配方问题:mozroot-certdata。我看到罪魁祸首是pkg_postint脚本(http://git.yoctoproject.org/cgit/cgit.cgi/meta-mono/tree/recipes-mono/mozroot-certdata/mozroot-certdata_1.0.0.bb),它需要在首次启动时修改根文件系统,构建系统正在使用只读根文件系统正确标记为不可能:
ERROR: The following packages could not be configured offline and rootfs is read-only: ['mozroot-certdata']
我的问题是:有没有办法在构建过程中安装和配置单声道mozroot证书,这样根文件系统不需要在启动/运行时修改?
答案 0 :(得分:2)
好吧,我今年夏末已经对此进行了简要介绍,因为我还使用了只读的rootfs。问题是mozroot.exe
是硬编码写入/usr/share/.mono/certs
并且不尊重您的sysroot。您可能会破解mozroot.exe
实际将导入的文件写入sysroot,虽然我的时间限制不允许我尝试这个(我也没有考虑过mono
。 )。
我的解决方案是在每次启动时执行导入。 (它也可以只执行一次,但随后会出现有关更新的问题)。为了实现这个目的,我在mozroot.exe
想要编写certdata的目录上进行了绑定。
我的解决方案详情
使用以下内容添加文件volatile-binds.bbappend
:
VOLATILE_BINDS += "\
/tmp/mono-certs /usr/share/.mono/certs \n\
"
这将从/tmp/mono-certs
到/usr/share/.mono/certs
进行绑定,从而您可以导入证书。
然后我添加了一个服务文件和一个mozroot-certdata_%.bbappend
:
FILESEXTRAPATHS_prepend := "${THISDIR}/${BPN}:"
DEPENDS += "mono-native"
SRC_URI += "file://mozroot-certdata.service \
"
inherit systemd
SYSTEMD_SERVICE_${PN} = "mozroot-certdata.service"
do_install_append() {
mkdir -p ${D}${datadir}/.mono/certs
mkdir -p ${D}${systemd_system_unitdir}
install -m 440 ${WORKDIR}/mozroot-certdata.service ${D}${systemd_system_unitdir}/mozroot-certdata.service
}
FILES_${PN} += "${datadir}"
# Empty the postinstallation script, as we can import the cert offline.
pkg_postinst_${PN} () {
# mono $D/usr/lib/mono/4.5/mozroots.exe --import --machine --ask remove --file $D/${sysconfdir}/ssl/certdata.txt
}
服务文件mozroot-certdata.service
:
[Unit]
Description=Import certficates to Mono
After=tmp-mono-certs.service
[Service]
Type=oneshot
ExecStart=/usr/bin/mono /usr/lib/mono/4.5/mozroots.exe --import --machine --ask-remove --file /etc/ssl/certdata.txt
[Install]
WantedBy=multi-user.target
答案 1 :(得分:0)
有没有办法在构建过程中安装和配置单声道mozroot证书
是的但是它需要mosroots二进制文件在rootfs创建时可执行。请参阅文档中的Post-Installation Scripts。
pkg_postinst中的'else'分支是当时执行的,如果成功,则不需要延迟的postinst(并且不应该出现构建错误)。 mono-native
配方已经存在,因此您应该能够依赖它并修复pkg_postinst
函数中的else分支,以便找到原始单声道和& mosroots.exe并写入$ D下的正确位置。
正如Anders所说,如果您关心基于包的升级,仅凭这一点是不够的。