问题描述
我正在运行使用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)。
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
(在meta/recipes-core/systemd/systemd-systemctl/systemctl),中找到),我认为前者是导致错误的原因。它在do_rootfs步骤中失败。
创建此链接的最佳方式是什么?如果可以选择,我宁愿不修改Yocto源代码。
推荐答案
您可以定义自己的rootFS post命令,并将其附加到ROOTFS_POSTPROCESS_COMMAND
,以便它在使用touch
创建空/etc/machine-id
文件的Yocto的内置read_only_rootfs_hook
之后运行。
# 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
Image Generation文档提供了有关如何在生成期间应用后处理命令的更多详细信息。
注意:您需要确保及早装入永久分区,以便读取/etc/machine-id
不会导致符号链接断开。
或者,使用绑定装载:
您也可以在运行时安装一个在引导序列早期运行的system d服务,并在rootfs中安装由Yocto提供的空白计算机ID,从而将持久的计算机ID挂载到BIND。
使用system d服务(而不是/etc/fstab
中的绑定挂载条目)是必要的,因为在创建绑定挂载之前,您需要确保持久的Machine-id文件确实存在。不过,您也可以使用tmpfiles.d
来执行此操作。