我启动了三个 Qemu VM,每个 VM 都有多个网络接口。网络接口配置如下所示:
-nic user,hostfwd=tcp::"${ssh_ports[$machine]}"-:22,model=virtio-net-pci \
-nic bridge,br="${bridge1}",model=virtio-net-pci
...
在所有机器中,我发现第一个网络设备的MAC地址是52:54:00:12:34:56
,第二个...:57
,第三个...:58
等等。这会导致我的虚拟机之间出现 MAC 地址冲突。如何让 Qemu 随机分配 MAC 地址?
附:
- 不确定这是否相关:我有两个桥接接口,每个虚拟机在第一个桥接中有一个网络接口,在第二个桥接中有一个网络接口。
- 我当然可以使用 bash 生成一些随机数,然后将其显式设置为参数。如果 Qemu 自己做的话,我会发现它会更好。
- 快速搜索发现了一些想要达到相反目标的人的问题:让 Qemu 分配一些预先确定的 MAC。这些问题听起来像是 MAC 地址的随机分配实际上是默认设置。
答案1
你不想那样做。使用随机 MAC 地址将不可避免地导致 MAC 地址冲突 - 这就是为什么您正在看到这些搜索结果。
相反,您应该分配一个不同的mac=macaddr
使用该选项将 MAC 地址硬编码到每个虚拟机上的每个网络接口-nic
。例如:
-nic user,...,mac=52:54:00:12:34:56
对于-nic bridge,...,mac=52:54:00:12:34:57
第一个虚拟机,52:54:00:12:34:58
&52:54:00:12:34:59
与第二个,- 和
52:54:00:12:34:60
&52:54:00:12:34:61
与第三个。
在文本文件中保存注释,以记录哪些 MAC 地址已分配并属于哪些虚拟机。
或者只是使用库虚拟机,它自动处理 MAC 地址分配。 IMO,没有太多理由qemu
手动运行而不是使用 libvirt - 没有可以使用 qemu 进行的 VM 自定义,也无法使用 libvirt 进行......并且您可能编写的用于自动化它的任何自定义脚本只是一个对 libvirt 已经做得更好的东西的拙劣模仿(我从个人经验中知道这一点,因为在我转而使用 libvirt 之前,我多年来一直用自己的自定义配置文件 DIY 极其复杂的 qemu 命令行)。 libvirt 是一个用于自动化虚拟机的 API,包含适用于 shell、perl、python 和许多其他语言的工具/库。
顺便说一句,硬编码 MAC 地址的一个额外好处是(如果您使用 DHCP 为每个虚拟机分配 IP 地址),您可以配置 dhcp 守护进程为每个 MAC 地址分配固定 IP 地址,这样每个虚拟机都可以拥有静态 IP 和可靠的主机名(在 DNS 或 /etc/hosts 文件中)。
运行dnsmasq
(或类似软件 - 就我个人而言,我使用 bind9 和 ISC dhcpd,因为我已经将它们用于与 VM 无关的用途)来为 VM 提供组合的 dhcp 和 dns 并不罕见。事实上,当使用 libvirt 作为 qemu、kvm 等的包装器时,这是一个相当标准的设置。