有没有办法在不修改Yocto的情况下为机器ID创建链接?

人气:1,081 发布:2022-10-16 标签: embedded-linux yocto

问题描述

我正在运行使用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.bbclasssystemctl(在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来执行此操作。

607