我正在运行使用 Yocto Zeus (3.0.0) 构建的 Linux 4.14.149。我正在运行只读文件系统,最近发现一个问题,我的 UID (/etc/machine-id
)每次启动都会发生变化(这个问题的结果 -https://superuser.com/questions/1668481/dhcpd-doesnt-issue-the-same-lease-after-reboot https://superuser.com/questions/1668481/dhcpd-doesnt-issue-the-same-lease-after-reboot ).
我试图使该文件成为用户数据分区的链接,以便它在重新启动后仍然存在。我尝试将链接作为base-files_%.bbappend
这就是我为主机名建立链接的方式(有效)。这是该文件的内容(/var/local 是我们的用户数据分区,在 init 脚本中以 RW 方式安装):
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
hostname = ""
machine-id = ""
do_install_append() {
ln -sfn /var/local/etc/hostname ${D}/${sysconfdir}/hostname
ln -sfn /var/local/etc/machine-id ${D}/${sysconfdir}/machine-id
}
但当我尝试构建它时,我看到以下错误:
Exception: bb.process.ExecutionError: Execution of '/home/gen-ccm-root/workdir/tools/poky/build-dev/tmp/work/mi_nhep-poky-linux-gnueabi/mi-dev/1.0-r0/temp/run.read_only_rootfs_hook.50286' failed with exit code 1:
touch: cannot touch '/home/gen-ccm-root/workdir/tools/poky/build-dev/tmp/work/mi_nhep-poky-linux-gnueabi/mi-dev/1.0-r0/rootfs/etc/machine-id': No such file or directory
WARNING: exit code 1 from a shell command.
事实证明,有两件事与该文件有关;这rootfs-postcommands.bbclass
和systemctl
python脚本(在meta/recipes-core/systemd/systemd-systemctl/systemctl中找到),前者(我认为)导致了错误。 do_rootfs 步骤失败。
创建此链接的最佳方式是什么?如果有选择的话,如果可能的话,我宁愿不修改 Yocto 源代码。
您可以通过定义自己的 rootfs post 命令并将其附加到ROOTFS_POSTPROCESS_COMMAND https://docs.yoctoproject.org/ref-manual/variables.html#term-ROOTFS_POSTPROCESS_COMMAND让它运行afterYocto 的内置read_only_rootfs_hook
这创造了空/etc/machine-id
文件使用touch
.
# setup-machine-id-symlink.bbclass
ROOTFS_POSTPROCESS_COMMAND += "install_machine_id_symlink ;"
install_machine_id_symlink () {
ln -sfn /var/local/etc/machine-id ${IMAGE_ROOTFS}/etc/machine-id
}
# your-image.bb
inherit setup-machine-id-symlink
The 图像生成 https://docs.yoctoproject.org/overview-manual/concepts.html#image-generation文档更详细地介绍了如何在构建过程中应用后处理命令。
Note:您需要确保尽早安装持久分区,以便读取/etc/machine-id
不会导致符号链接损坏。
或者,使用绑定安装:
您还可以在运行时执行此操作,方法是安装在启动序列早期运行的 systemd 服务,并将持久机器 ID 挂载到 Yocto 在 rootfs 中提供的空白机器 ID 上。
使用 systemd 服务(而不是绑定挂载条目)/etc/fstab
) 是必要的,因为您需要在创建绑定安装之前确保持久性计算机 ID 文件确实存在。不过,您也许可以利用tmpfiles.d https://www.freedesktop.org/software/systemd/man/tmpfiles.d.html而是这样做。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)