解决 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 没有一个机制来解决这个问题,这就需要我们确保我们的模板/镜像是手动设置过的。