Libvirt环境下Devuan虚拟机无法绑定指定静态IP的问题求助
各位大佬好,我最近遇到一个特别头疼的问题:在Libvirt环境中,我的Devuan虚拟机始终没法绑定我指定的静态IP,网上搜了各种解决方案都试过了,问题还是没解决,特意来这里求助!
环境与配置情况
宿主机(Gentoo)网络配置
宿主机的虚拟网桥virbr0信息如下:
virbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255 ether 52:54:00:c0:12:c5 txqueuelen 1000 (Ethernet) RX packets 22 bytes 2632 (2.5 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 1880 bytes 99816 (97.4 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Libvirt默认网络配置
我通过virsh net-dumpxml default导出的网络配置:
<network> <name>default</name> <uuid>469df392-3b72-4069-814a-10893732b627</uuid> <forward mode='nat'> <nat> <port start='1024' end='65535'/> </nat> </forward> <bridge name='virbr0' stp='on' delay='0'/> <mac address='52:54:00:c0:12:c5'/> <ip address='192.168.122.1' netmask='255.255.255.0'> <dhcp> <range start='192.168.122.2' end='192.168.122.254'> <lease expiry='0'/> </range> <host mac='52:54:00:67:37:7d' name='devuan' ip='192.168.122.190'> <lease expiry='0'/> </host> </dhcp> </ip> </network>
问题现象
我给Devuan虚拟机指定了静态IP192.168.122.190,但只要虚拟机一启动,IP就会被“挤掉”,每次重启都会拿到不同的IP。
我已经试过这些操作,但都没用:
- 销毁并重新启动Libvirt默认网络
- 重启
libvirtd和virtlogd服务 - 杀死所有dnsmasq相关进程后重新启动
- 手动编辑
/var/lib/libvirt/dnsmasq/virbr0.status文件,只保留我想要的IP记录
排查过程
第一次排查(Edit 1)
按照大佬的建议,我先清理了虚拟机里的DHCP leases文件:
root@devuan:~# rm /var/lib/dhcp/* && poweroff
然后在宿主机上销毁网络并清理相关文件:
host ~ # virsh net-destroy default host ~ # rm /var/lib/libvirt/dnsmasq/virbr0.*
重新启动网络和虚拟机后,看宿主机的dnsmasq日志发现了关键信息:
Feb 14 22:48:03 host dnsmasq-dhcp[24023]: DHCPOFFER(virbr0) 192.168.122.190 52:54:00:67:37:7d
Feb 14 22:48:03 host dnsmasq-dhcp[24023]: DHCPACK(virbr0) 192.168.122.190 52:54:00:67:37:7d devuan
Feb 14 22:48:03 host dnsmasq-dhcp[24023]: DHCPDECLINE(virbr0) 192.168.122.190 52:54:00:67:37:7d
Feb 14 22:48:03 host dnsmasq-dhcp[24023]: disabling DHCP static address 192.168.122.190 for 10m
也就是说,dnsmasq明明给虚拟机发了190的IP,结果收到了DHCPDECLINE(拒绝),于是暂时禁用了这个IP,最后虚拟机拿到了191的IP。
但奇怪的是:
- 虚拟机上
ifconfig显示的IP是190 - 虚拟机的
dhclient.eth0.leases文件里记录的却是191 - 虚拟机的syslog里只显示拿到191的过程,完全没提到190
第二次排查(Edit 2)
我换了个思路,把静态IP放在DHCP范围外:
修改Libvirt网络配置,把DHCP范围改成192.168.122.2到192.168.122.189,静态IP还是190。结果现象和之前完全一样:dnsmasq发了190,被拒绝,最后虚拟机拿到了153的IP。
第三次排查(Edit 3)
为了排除宿主机配置的问题,我新增了两个虚拟机:Slackware和Win10,分别指定了101和102的静态IP。结果这两个虚拟机都能正常拿到指定的IP,只有Devuan还是不行!
更离谱的是:
- Devuan的
ifconfig显示的是指定的100,但我只能通过191的IP ssh进去 - 虚拟机的syslog里显示拿到的是191,宿主机日志里还是先给100,然后被拒绝,最后发191
我的困惑
现在我几乎可以确定问题出在Devuan虚拟机本身,但实在搞不清楚到底是什么原因导致它拒绝指定的静态IP?是不是虚拟机里有什么缓存或者其他服务在干扰DHCP的过程?有没有大佬遇到过类似的问题?
备注:内容来源于stack exchange,提问作者vesperto

