5

我需要能够重复地、非随机地、唯一地标识一个服务器主机,它可以被任意虚拟化并且我无法控制。

  • MAC 地址不起作用,因为在某些虚拟化环境中,网络接口没有硬件地址。
  • 生成状态文件并将其保存到磁盘不起作用,因为可能会克隆虚拟机,从而复制文件。
  • 服务器的 SSH 主机密钥可能是候选者。它们可以像状态文件一样被克隆,但在实践中它们通常不会被克隆,因为这是一个安全问题,它是一个不常犯的错误。
  • 还有 /var/lib/dbus/machine-id,但这取决于 dbus。(感谢 Preetam)。
  • 有一个 cpuid 但显然已弃用。(感谢 Twitter 上的 Bruno Aguirre)。
  • 主机名值得考虑。像 Chef 这样的许多系统已经需要唯一的主机名。(感谢阿尔菲约翰)

我希望该解决方案能够持续很长时间,并且肯定会在服务器重新启动和软件重新启动时持续存在。最终,我也知道我的软件的用户会弃用主机并希望用另一个主机替换它,但要保持与之关联的数据的连续性,因此从长远来看,UUID 可能被认为是可变的,但我不这样做'不特别希望主机开始认为自己是未知的并无缘无故地重新注册自己。

主机是否有任何替代的持久唯一标识符?

4

4 回答 4

4

这实际上取决于“持久”的含义。例如,两个 VM 不能分别为您打开相同的网络套接字,因此即使它们是彼此的位级克隆,也可以将它们区分开来。

因此,所需要的只是足够的信息来区分机器的持久性持续时间。

  • 如果持久性的持续时间是网络连接的长度,那么您根本不需要任何标识符——套接字本身是唯一的。

  • 如果需要更长的持久性(例如,对于引导的长度),那么您可以在系统引导时重新生成 UUID。(请注意,克隆的 VM 仍然需要重新启动,除非您正在热复制它。)

  • 如果它需要更长的时间——比如无限期地——那么你可以在启动时生成一个 UUID 标识符并将其保存到磁盘上,但只能将其用作机器识别信息的一部分。如果虚拟机随后被克隆,您将知道这一点,因为您将有两台机器报告来自不同来源的相同 ID - 例如,两个不同的网络套接字、不同的启动时间等。由于您可以区分它们,因此您有足够的信息来区分两台克隆的机器,这意味着您可以采取后续行动来强制进一步区分,例如指示每台机器重新生成其状态文件。

最终,如果一台机器是完美克隆的,那么根据定义,你无法分辨哪一台是“真正的”,只有现在有两台可区分的机器。

暗示您可以区分“真实”和“克隆”之间的差异意味着您可以使用某种状态来记录两者之间的差异,例如虚拟机本身创建时的时间戳,其中情况下,您可以将其合并到状态记录中。

于 2013-08-19T15:22:07.187 回答
1

看起来简单的解决方案已被排除在外。所以这可能会导致复杂的解决方案,比如这个协议: - 客户端发送元组 [MAC 地址,SSH 公钥,序列号] - 如果服务器按预期接收到这个元组,服务器和客户端都会增加序列号。- 否则服务器必须确定发生了什么(客户端被克隆了吗?客户端移动了吗?),也许会得出一个初步结论并提醒人们进行验证。

于 2013-08-19T20:38:54.260 回答
0

根据可用信息,我认为没有直接的“使用 X 解决方案”,但这里有一些一般性建议可能会让您找到更好的位置。

  • 如果从“黄金映像”克隆,请考虑使用一些“首次启动”逻辑来生成唯一 ID。Chef、Puppet 或 Cf-engine 等配置管理系统提供了一些脚手架来实现这一点。
  • 考虑一个像zookeeper这样的全局状态管理器。特别是它的原子计数器功能。随着时间的推移,同一个系统可能会获得新的 ID,但它会是唯一的。
  • 此外,此堆栈溢出可能会给您一些其他方向。它引用了 Twitter 解决类似问题的方法。
于 2013-08-19T15:31:48.213 回答
-1

如果我理解正确,您需要在这些条件下具有持久的、全局唯一的标识符:

  • 可以在运行时克隆的操作系统安装,因此VM的任何状态都不起作用,并且
  • 可以在任意虚拟化环境中运行,因此VM之外的任何状态都不起作用。

我意识到这并不能直接回答您的问题,但似乎设计或约束确实需要一些实质性调整以适应解决方案。

于 2013-08-19T15:25:57.187 回答