machine-id 中文手册

译者:金步国


版权声明

本文译者是一位开源理念的坚定支持者,所以本文虽然不是软件,但是遵照开源的精神发布。

其他作品

本文译者十分愿意与他人分享劳动成果,如果你对我的其他翻译作品或者技术文章有兴趣,可以在如下位置查看现有的作品集:

联系方式

由于译者水平有限,因此不能保证译文内容准确无误。如果你发现了译文中的错误(哪怕是错别字也好),请来信指出,任何提高译文质量的建议我都将虚心接纳。


手册索引 · 指令索引systemd-241

名称

machine-id — 本机"machine ID"配置文件

大纲

/etc/machine-id

描述

/etc/machine-id 文件包含一个 在安装或首次启动操作系统时生成的、专属于本系统的、独一无二的"machine ID"。 "machine ID"是一个32字符长度的十六进制小写字母字符串,并以换行符结尾。 其本质是一个128位二进制整数的16进制表示。 注意,"machine ID"不能为全零值。

"machine ID"通常在系统安装或首次启动时从一个随机数源生成, 并且之后无论经过多少次开关机,也一直保持不变。 另一方面,对于无状态系统,如果有必要,将在系统启动的早期自动随机生成一个"machine ID"。

"machine ID"可以通过内核引导选项 systemd.machine_id= 来设置(例如用于网络启动),也可以通过 systemd 的 --machine-id= 选项来设置。 这两种方法设置的"machine ID"优先级都高于存储在 /etc/machine-id 中的值。

"machine ID"一旦生成应该永远保持不变, 即使系统的软件、硬件、网络的配置发生了变化,也不应该修改它。 基于"machine ID"如此稳固的特性以及足够的长度(不容易重复),可以将它用于取代 POSIX 系统调用 gethostid(3) 的功能。

这里的"machine ID"与"D-Bus machine ID" 遵守相同的格式与逻辑。

由于"machine ID"可以精确的标识主机, 因此它应该被视为"机密信息", 不应该直接暴露在不可信环境中,特别是不应该直接暴露在不可信的网络环境中。 如果应用程序需要使用某种唯一标识符精确的标识主机, 那么不应该直接使用 "machine ID" ,而应该使用经过应用程序自身内置的安全散列算法转换之后的值。 这样可以确保使用同一种方式,安全的在不同主机之间传递唯一标识符,而不会泄露每台主机原本的 "machine ID" 。 sd_id128_get_machine_app_specific(3) API 就提供了一种安全散列算法的实现。

初始化

每台机器都应该具有一个独一无二的非空"machine ID"。 为了达到这个目标,可以使用多种不同的方法初始化 /etc/machine-id 文件。

一般来说, /etc/machine-id 应该 在操作系统安装过程中完成初始化。

systemd-machine-id-setup(1) 工具可以在安装操作系统时初始化"machine ID"。当然,使用其他方法初始化 /etc/machine-id 也是可以的。

对于一次创建、多处使用的操作系统镜像(例如容器或云主机), 其中的 /etc/machine-id 应该是一个空文件。 这样,即使镜像是只读的,也可以在此空文件之上绑定挂载一个临时文件。 在镜像的实例系统启动过程中,将会自动生成一个"machine ID", 并尽可能永久保存到的 /etc/machine-id 中。

systemd-firstboot(1) 可以用于初始化已挂载(但未启动)的操作系统镜像的 /etc/machine-id 文件。

所有使用 systemd(1) 的系统都必须拥有"machine ID"。如果指定了 systemd.machine_id=--machine-id= 选项(见"描述"小节),那么使用指定的"machine ID", 否则使用 /etc/machine-id 中的"machine ID"。 如果 /etc/machine-id 为空或不存在, 那么将会依次尝试 /var/lib/dbus/machine-id 中的值、 内核命令行选项 container_uuid 的值、 KVM DMI product_uuid 的值(KVM系统)、随机生成的 UUID 值。

确定"machine ID"之后, systemd(1) 将会尝试将其写入 /etc/machine-id 文件中,如果写入失败, 将会继续尝试在 /etc/machine-id 之上绑定挂载一个临时文件并写入。 如果文件系统为只读并且不包含 /etc/machine-id 文件,那么将会导致错误。

如果 /etc/machine-id 在系统启动的早期处于只读状态,但随后变为可写,那么 systemd-machine-id-commit.service(8) 将会在 /etc/machine-id 文件变为可写之后, 尝试将"machine ID"写入其中。

与 OSF UUID 的关系

"machine ID"符合 RFC 4122 规范(OSF v4 UUID), 同时也符合 Microsoft GUID 规范。

历史

/etc/machine-id 文件的格式源自D-Bus的 /var/lib/dbus/machine-id 文件。 实际上,/var/lib/dbus/machine-id 很可能就是指向 /etc/machine-id 的一个软连接。

参见

systemd(1), systemd-machine-id-setup(1), gethostid(3), hostname(5), machine-info(5), os-release(5), sd-id128(3), sd_id128_get_machine(3), systemd-firstboot(1)