无状态(UBI/UBIFS)嵌入式 Linux 环境中的持久 systemd 机器 ID

无状态(UBI/UBIFS)嵌入式 Linux 环境中的持久 systemd 机器 ID

我有一台嵌入式 Linux 机器,它有一个从 UBI/UBIFS 加载的只读根文件系统。

每次设备启动时,它都会创建一个新的 systemd machine-id,我通过阅读文档

机器 ID 通常是在系统安装期间从随机源生成的,并且在所有后续引导中保持不变。或者,对于无状态系统,如果发现它是空的,则在早期启动的运行时期间生成它。

从阅读systemd机器 ID 设置.c文件,我对它的工作原理有所了解,如果它不存在,它将尝试在 /etc/machine-id 处生成机器 ID,如果失败并且分区是只读的,它将在 /run/machine-id 中生成它并将其安装到 /etc/machine-id (不是符号链接)。

问题是,我可以为无状态设备拥有固定的机器 ID 吗?我有两个选择是:

1) 将机器 ID 存储到非易失性存储器(外部/eMMC):

  • 开机后检查/etc/machine-id是否存在
  • 如果不存在,则继续通过 systemd 服务传递生成机器 ID 的服务/挂载(照常)。
  • 新服务文件:生成机器 ID 后,将此字符串复制到不在内存/NAND 中的分区,即 eMMC(非易失性)。

因此,现在设备已经被初始化至少一次并且机器ID被存储在非易失性存储介质中;现在启动顺序如下:

  • 设备启动并安装非易失性分区。
  • 检查非易失性机器 ID 是否存在(与上面第一步相同)
  • 该文件存在,因此我们将其挂载到 /etc/machine-id
  • 处理 /etc/machine-id 数量的服务文件现在不会执行,因为它已经存在。

2)修改系统机器 ID 设置.c文件并更改生成、存储和保存机器 ID 的硬编码目录。但是我想避免这种解决方案,因为这意味着我必须修改 systemd 系统文件。

有人可以分享一些对此的见解吗?

谢谢

答案1

您最简单和最好的选择可能是将其作为内核命令行变量传递systemd.machine_id 根据官方文档。如果您想要真正喜欢,您可以让引导加载程序根据您正在运行的 SoC 的真正独特的信息(如序列号、MAC 地址等)生成它。

答案2

您要求混合矛盾的概念:持久性意味着状态,但您希望系统是无状态的。

除了您提到的选项之外,您还可以考虑使用“Union”或“Overlay”文件系统。这将指示操作系统首先查找持久文件系统上的文件,然后如果不存在,则检查无状态文件系统。这就是 LiveCD 的实现方式,暗示能够在只读介质上修改文件。

答案3

我通过简单地重新挂载 rootfs 读写 ( mount -o remount,rw /) 并将随机生成的机器 ID 保存到/etc/machine-id文件中解决了这个问题。

相关内容