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

Mono 在只读根文件系统上安装mozroot certdata包,mono,ssl-certificate,embedded-linux,yocto,Mono,Ssl Certificate,Embedded Linux,Yocto,我有一个已建立的yocto构建,现在我正尝试切换到具有根文件系统(例如,EXTRA\u IMAGE\u FEATURES+=“只读rootfs”) 然而,我在meta mono层遇到了一个问题:mozroot certdata。我发现罪魁祸首是pkg_postint脚本(),它需要在第一次启动时修改根文件系统,而构建系统正确地将其标记为不可能使用只读根文件系统: ERROR: The following packages could not be configured offline and r

我有一个已建立的yocto构建,现在我正尝试切换到具有根文件系统(例如,
EXTRA\u IMAGE\u FEATURES+=“只读rootfs”

然而,我在meta mono层遇到了一个问题:mozroot certdata。我发现罪魁祸首是pkg_postint脚本(),它需要在第一次启动时修改根文件系统,而构建系统正确地将其标记为不可能使用只读根文件系统:

ERROR: The following packages could not be configured offline and rootfs is read-only: ['mozroot-certdata']

我的问题是:有没有办法在构建过程中用mono安装和配置这些mozroot证书,这样根文件系统就不需要在启动/运行时进行修改?

好吧,今年夏天晚些时候,我简要介绍了一下,因为我也在使用只读的rootfs。问题在于
mozroot.exe
硬编码为写入
/usr/share/.mono/certs
,并且不尊重您的系统根。您可能会破解
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

嗯,我在今年夏末做了一个简短的介绍,因为我也在使用只读rootfs。问题在于
mozroot.exe
硬编码为写入
/usr/share/.mono/certs
,并且不尊重您的系统根。您可能会破解
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
有没有办法在构建过程中使用mono安装和配置这些mozroot证书

是的,但它要求mosroots二进制文件在rootfs创建时是可执行的。请参阅文档中的

pkg_postinst中的“else”分支是当时执行的分支,如果成功,则不需要延迟的postinst(并且不应该出现生成错误)
mono native
recipe已经存在,因此您应该能够依赖它并修复
pkg_postinst
函数中的else分支,以便它找到native mono&mosroots.exe并写入$D下的正确位置

正如Anders提到的,如果您关心基于包的升级,仅此一点是不够的

有没有办法在构建过程中使用mono安装和配置这些mozroot证书

是的,但它要求mosroots二进制文件在rootfs创建时是可执行的。请参阅文档中的

pkg_postinst中的“else”分支是当时执行的分支,如果成功,则不需要延迟的postinst(并且不应该出现生成错误)
mono native
recipe已经存在,因此您应该能够依赖它并修复
pkg_postinst
函数中的else分支,以便它找到native mono&mosroots.exe并写入$D下的正确位置


正如Anders所提到的,如果您关心基于包的升级,仅此一点是不够的。

好吧,正如我在回答中所说,mozroot.exe试图在我自己的机器上写入
/usr/share/.mono/certs
。。。因此,我认为这在rootfs创建期间目前不起作用。您可能需要修补
mono-native
来处理此问题。谢谢。在这种情况下,mosroots.exe需要一个补丁——我相信mono upstream也会接受“-certdir”选项或类似的选项,正如我在回答中所说,mozroot.exe试图在我自己的机器上写入
/usr/share/.mono/certs
。。。因此,我认为这在rootfs创建期间目前不起作用。您可能需要修补
mono-native
来处理此问题。谢谢。在这种情况下,需要一个mosroots.exe补丁——我相信mono upstream也会接受“-certdir”选项或类似的选项