解决 PVE 中虚拟机ip相同的问题

最近遇到了一个问题,使用一个 vm 模板创建了多个虚拟机,但是他们的IP地址相同。尽管创建出来的每个虚拟机都有一个独特的 mac 地址,但它们中的每一个都会从我的DHCP服务器中分配到相同的IP地址。排查了很久,最后找到了罪魁祸首。

在我的案例中,我使用的是 PVE,但是最终的原因和 PVE 没有关系。我的虚拟机镜像使用的是 Ubuntu 18.04,根源最终是一个叫做 “machine-id”的东西。继续阅读,了解我是如何解决这个问题的。

当你安装一个使用 machine-id 的 Linux 发行版时(Ubuntu 18.04就是这样一个发行版),它将获得一个唯一的 machine-id,并存储在以下文件中。

1
/etc/machine-id

此外,机器码还可能(或不可能)存储在以下文件中。

1
/var/lib/dbus/machine-id

也有可能 /var/lib/dbus/machine-id 是一个指向 /etc/machine-id 的符号链接,这也很常见。

发生的情况是,由于某种原因,machine-ID 被用来从 DHCP 请求一个IP地址,而不是用 mac 地址请求 ip。我不确定为什么会这样,为什么有人认为这是一个好主意,或者 Ubuntu 18.04 这样设置的原因。具体的原因之后再进行研究,本文只关注如何解决这个问题。

以下是解决方案:

为了最好地解决这个问题,删除/etc/machine-id的内容,使其成为一个空文件。

1
sudo truncate -s 0 /etc/machine-id

然后,删除 /var/lib/dbus/machine-id。

1
sudo rm /var/lib/dbus/machine-id

最后,做一个符号链接。

1
sudo ln -s /var/lib/dbus/machine-id /etc/machine-id

当你重启系统时,它应该生成一个新的机器码。需要注意的是,你不能只是删除 machine-id 文件,它必须存在,而且是空的。不知道什么原因,如果该文件不存在,它将永远不会被重新创建。但如果它是空的,它就会被重新创建。如果你像我一样,试图创建一个虚拟机镜像或模板来快速新增服务器,你要做的是在创建镜像之前执行上述步骤。有些人认为 cloud-init 应该为我们处理这个问题,因为这是它就是用来配置资源的。但是 cloud-init 没有一个机制来解决这个问题,这就需要我们确保我们的模板/镜像是手动设置过的。