Arch Linux下systemd-networkd配置桥接模式后QEMU虚拟机无网络问题求助
嘿,我看到你在Arch Linux上用systemd-networkd配置桥接给QEMU虚拟机,结果虚拟机能正常启动但没网络,咱们一步步来排查解决这个问题哈!
先理一理你已经完成的配置操作,确保步骤没偏差:
你已完成的配置步骤
- 创建桥接设备配置文件
/etc/systemd/network/br0.netdev
[NetDev] Name=br0 Kind=bridge MACAddress=[My_own_MAC_address] [Bridge] VLANFiltering=1 STP=1
- 绑定物理网卡到桥接的配置文件
/etc/systemd/network/br0enp2s0.network
[Match] Name=enp2s0 [Network] Bridge=br0
- 桥接设备的IP配置文件
/etc/systemd/network/br0.network
[Match] Name=br0 [Network] DHCP=ipv4
- 重启相关服务并启动QEMU虚拟机,启动命令如下:
qemu-system-x86_64 \ -monitor stdio \ -cpu host \ -device intel-hda \ -device hda-duplex \ -k es \ -machine accel=kvm \ -m 2048 \ -hda ~/Windows.7.qcow2 \ -boot once=c,menu=off \ -netdev tap,id=tap_0_GROUP,br=br0,ifname=tap_0_GROUP,script=no,vhost=on,downscript=no \ -device virtio-net-pci,netdev=tap_0_GROUP,mac=[My_own_MAC_address] \ -usb -device usb-tablet \ -rtc base=localtime \ -name "Windows 7"
排查与解决步骤
1. 先确认桥接和物理网卡的基础状态
先检查桥接是否真的正常工作,打开终端执行这些命令:
ip link show br0 ip link show enp2s0 bridge link
- 要确保
br0和enp2s0的状态都是UP - 在
bridge link的输出里,得能看到enp2s0已经加入br0,并且状态是forwarding
如果物理网卡没加到桥里,先看看systemctl status systemd-networkd.service的日志,有没有配置加载错误的提示,比如文件名拼写错了之类的。
2. 检查tap设备的权限和状态
你用了script=no和downscript=no,意味着不会自动用脚本配置tap设备,这时候要注意QEMU有没有权限创建并管理tap设备。
虚拟机运行时,另开一个终端执行:
ip link show tap_0_GROUP
如果tap设备不存在,或者状态不是UP,大概率是权限问题:
- 可以先试试用
sudo启动QEMU(虽然不推荐长期这么用,但能快速验证是不是权限锅) - 或者把当前用户加入
libvirt组(如果装了libvirt的话),也可以配置udev规则允许普通用户创建tap设备
另外可以手动创建tap设备再启动虚拟机测试:
sudo ip tuntap add dev tap_0_GROUP mode tap user $USER sudo ip link set tap_0_GROUP master br0 sudo ip link set tap_0_GROUP up
再启动QEMU看看网络能不能通。
3. 排查VLAN过滤和STP的影响
你在桥接配置里开了VLANFiltering=1,如果你的物理网络没用到VLAN,或者虚拟机没配置对应的VLAN,很可能会阻断网络。可以先临时关闭VLAN过滤试试:
sudo bridge vlan del dev br0 vid 1 sudo bridge link set dev br0 vlan_filtering 0
重启虚拟机看看有没有网络,如果生效了,要么调整VLAN配置(确保物理网卡和tap设备在同一个VLAN),要么直接关闭VLAN过滤(如果不需要的话)。
另外STP生成树协议可能会导致接口进入转发状态有延迟,你可以暂时关闭STP测试:修改/etc/systemd/network/br0.netdev里的STP=0,然后重启systemd-networkd:
sudo systemctl restart systemd-networkd.service
等个几分钟再看虚拟机能不能获取IP。
4. 检查MAC地址的冲突问题
你给桥接设备和虚拟机网卡都设了自定义MAC地址,一定要确保这两个地址不重复,也不能和局域网里其他设备的MAC冲突。可以先暂时去掉自定义MAC,让系统自动生成,测试是否能联网:
- 注释掉
br0.netdev里的MACAddress行 - QEMU启动命令里去掉
mac=[My_own_MAC_address]参数 - 重新配置桥接并启动虚拟机
5. 检查虚拟机内部的配置
进入Windows 7虚拟机后,也得确认内部的网络状态:
- 首先要确保virtio-net-pci的驱动已经安装!Windows 7默认没有这个驱动,你可能需要在安装虚拟机时加载驱动,或者启动后手动安装virtio驱动包
- 执行
ipconfig /all,看看有没有DHCP分配的IP,网关和DNS是否正确 - 如果没获取到IP,可以手动设置静态IP(和宿主机
br0在同一个网段,网关设为路由器IP),试试能不能ping通网关和宿主机
备注:内容来源于stack exchange,提问作者membrillo

