我有一台嵌入式 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
文件中解决了这个问题。