【问题标题】:Is there a way to create a link for the machine ID without modifying Yocto?有没有办法在不修改 Yocto 的情况下为机器 ID 创建链接?
【发布时间】:2021-10-15 00:57:51
【问题描述】:

我正在运行使用 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 是我们的用户数据分区,在初始化脚本中以 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 python 脚本(在 meta/recipes-core/systemd/systemd-systemctl/systemctl 中找到),其中前者(我认为)导致错误。它在 do_rootfs 步骤中失败了。

创建此链接的​​最佳方式是什么?如果可以选择,我宁愿不修改 Yocto 源代码。

【问题讨论】:

    标签: embedded-linux yocto


    【解决方案1】:

    您可以通过定义自己的 rootfs 后置命令并将其附加到 ROOTFS_POSTPROCESS_COMMAND 以便它运行 Yocto 的内置 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
    

    Image Generation 文档详细介绍了如何在构建过程中应用后处理命令。

    注意:您需要确保尽早挂载持久分区,以便读取/etc/machine-id 不会导致符号链接损坏。


    或者,使用绑定挂载:

    您也可以在运行时执行此操作,方法是安装一个在启动序列早期运行的 systemd 服务,并将您的持久机器 ID 绑定到 Yocto 在 rootfs 中提供的空白上。

    使用 systemd 服务(而不是 /etc/fstab 中的绑定挂载条目)是必要的,因为在创建绑定挂载之前,您需要确保持久机器 ID 文件确实存在。不过,您也许可以使用tmpfiles.d 来代替。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      • 1970-01-01
      • 2021-06-17
      • 2017-02-23
      • 1970-01-01
      • 1970-01-01
      • 2021-01-21
      相关资源
      最近更新 更多