我经常在 VirtualBox VM 中运行多个 Ubuntu Server 实例来测试各种东西。我通常安装一次 Ubuntu,然后根据需要多次克隆 VM。我在 VirtualBox 中使用桥接网络,并从路由器获取动态 IP。VirtualBox 能够随机化虚拟 NIC 的 MAC 地址。使用 16.04 时,这很有效:安装 + 克隆 + 随机化 MAC = 每个实例都有自己独特的 IP。
这在 18.04 中不再起作用。我不明白为什么,但即使我更改了 MAC,所有克隆也总是获得相同的 IP 地址。(我的路由器似乎认为最后启动的实例拥有 IP。)
此外,当我使用 netplan 将虚拟机更改为静态 IP 时,如下所示...
$ cat /etc/netplan/01-netcfg.yaml
network:
version: 2
renderer: networkd
ethernets:
enp0s3:
dhcp4: no
addresses: [192.168.1.28/24]
gateway4: 192.168.1.1
nameservers:
addresses: [192.168.1.1]
... NIC 最终二IP——我分配的静态地址和原始动态 IP,如下所示:
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:dd:e5:ea brd ff:ff:ff:ff:ff:ff
inet 192.168.1.28/24 brd 192.168.1.255 scope global enp0s3
valid_lft forever preferred_lft forever
inet 192.168.1.154/24 brd 192.168.1.255 scope global secondary dynamic enp0s3
valid_lft 86383sec preferred_lft 86383sec
inet6 fe80::a00:27ff:fedd:e5ea/64 scope link
valid_lft forever preferred_lft forever
我到处搜索,但还是搞不清楚。我猜这可能与 cloud-init 有关,但如果是这样的话,我不知道该怎么做。
感谢任何帮助!
答案1
最近我已经多次看到这种情况了,所以我现在只是假设你也有同样的感受,并提供答案。如果你的情况不是这样,至少它可能对其他人有帮助。
问题要素:
- 启动系统后克隆系统(在我看来不应该这样做)
- 网络化
现在发生的情况是,在第一次启动时,systemd 将生成/etc/machine-id
一个客户端 ID,然后 networkd 将使用它在其 dhcp 请求中创建一个客户端 ID。
这将是服务 IP 的首选唯一 ID,因此所有使用相同 ID 克隆的机器/etc/machine-id
都会发生冲突。
首次启动/初始化时要做的不仅仅是这些,这也是我认为您应该从干净的云映像和部署程序开始的原因。但目前,请确保/etc/machine-id
删除。它将在启动时生成一个新的,并且系统可以通过 DHCP 服务器进行区分。