必须用 virsh net-edit default 修改 DHCP 范围,手动改 XML 文件会被覆盖;修改后需清理 /var/lib/libvirt/dnsmasq/default.leases 并重启网络,同时确保 range 在 192.168.122.2~192.168.122.254 间以避开网关和广播地址。

直接改 default.conf 会失效
你看到的 /etc/libvirt/qemu/networks/default.xml 或 /var/lib/libvirt/network/default.xml 里的配置,只要不是用 virsh 命令修改的,重启 libvirtd 或下次网络重载就会被覆盖。libvirt 明确警告过:这是自动生成文件,手动编辑等于白干。
必须用 virsh net-edit default
这是唯一安全、持久的修改方式。执行后会打开默认编辑器(通常是 vi),里面是当前生效的 XML 定义。关键要改的是 <dhcp></dhcp> 块内的 <range></range> 元素:
<dhcp> <range start='192.168.122.2' end='192.168.122.254'/> </dhcp>
比如想把范围缩到 192.168.122.100~192.168.122.199,就改成:
<range start='192.168.122.100' end='192.168.122.199'/>
- 修改完保存退出,libvirt 会自动验证语法并重载网络
- 不需要手动重启服务,但已有租约不会立即回收(旧 IP 还能用到 lease 过期)
- 如果改错格式导致 XML 无效,
virsh会拒绝保存,并提示具体哪行出错
改完还要清理旧 DHCP 租约记录
libvirt 底层用 dnsmasq 提供 DHCP 服务,租约信息存在 /var/lib/libvirt/dnsmasq/default.leases。新范围生效后,这个文件里仍保留着旧地址的租约,可能导致虚拟机下次启动时拿到已被排除的 IP。
稳妥做法是:
- 先停掉网络:
virsh net-destroy default - 清空租约文件:
truncate -s 0 /var/lib/libvirt/dnsmasq/default.leases - 重新启用:
virsh net-start default
注意:default.status 文件只是只读快照,删它没用;真正影响分配的是 .leases 文件和 net-edit 里定义的 range。
别漏掉 DNS 和网关的配套调整
default 网络的网关固定为 192.168.122.1(即 virbr0 的 IP),不能通过 net-edit 改变。但如果你调窄了 DHCP 范围,又恰好把 192.168.122.1 排除在外,虚拟机虽然能拿 IP,但默认路由会指向一个“不存在”的网关——结果就是能通宿主机,但上不了外网。
所以务必确保:
- 你设的
start和end要在192.168.122.2~192.168.122.254之间(避开 .1 和 .255) - 如果真要换整个子网(比如改到 192.168.100.0/24),就不能只改 DHCP range,得重建网络,否则
virbr0地址不匹配
最常被忽略的一点:改完 DHCP 范围后,不清理 .leases 文件,旧租约卡在那儿,新虚拟机可能还是拿到旧范围里的 IP,看起来像没生效。


















