在只读根文件系统上安装mozroot-certdata软件包

时间:2016-10-18 22:28:39

标签: mono ssl-certificate embedded-linux yocto

我有一个已建立的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证书,这样根文件系统不需要在启动/运行时修改?

2 个答案:

答案 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所说,如果您关心基于包的升级,仅凭这一点是不够的。