请考虑以下场景。
主持人: Ubuntu 18.04 LTS 桌面具有最新更新。QEMU 版本3.1.
网络由网络管理器管理,工作无线的互联网连接。
$ ifconfig
enp0s25: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether xx:xx:xx:xx:xx:xx txqueuelen 1000 (Ethernet)
RX packets 234 bytes 47490 (47.4 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 362 bytes 86199 (86.1 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 20 memory 0xf3b00000-f3b20000
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Lokale Schleife)
RX packets 120821 bytes 896665929 (896.6 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 120821 bytes 896665929 (896.6 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
wlp3s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.5 netmask 255.255.255.0 broadcast 10.0.0.255
inet6 xxxx::xxxx:xxxx:xxxx:xxxx prefixlen 64 scopeid 0x20<link>
ether yy:yy:yy:yy:yy:yy txqueuelen 1000 (Ethernet)
RX packets 3098974 bytes 3223048745 (3.2 GB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2259694 bytes 909739966 (909.7 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
KVM虚拟机:
全新安装并更新了 Ubuntu Server 18.04 LTS,其 LAMP 堆栈名为uslamp.img
。
VM 启动时qemu-system-x86_64 -enable-kvm -m 6G -smp cores=3 -cpu host -drive file=uslamp.img,if=virtio,aio=native,cache.direct=on -vga virtio -usb -device usb-tablet -nic tap,model=virtio-net-pc
请注意,不应使用 libvirt 或 uvtool 或 multipass 之类的工具。
问题: 我无法与主机建立任何有效的网络连接。qemu-bridge-helper 和Ubuntu 服务器指南或者我在 StackExchange 中读到的任何提案都提供了可行的解决方案。
启动虚拟机时出现错误消息:
qemu-system-x86_64:无法配置 /dev/net/tun:操作不允许
以 root 身份启动虚拟机可提供:
W:/etc/qemu-ifup:未找到用于客户接口的桥接器
尽管有此警告,虚拟机仍启动并获得了 IP4 地址仅当 QEMU 启动命令中丢弃 -nic 选项时。在运行 Ubuntu 服务器的虚拟机中可以 ping 通虚拟机的地址。但是没有连接到网络,即 ping 10.0.0.1 的 DNS 导致 100% 的数据包丢失。
根据以下要求修改
/etc/netplan
yaml 文件手册页:
# Let NetworkManager manage all devices on this system
network:
version: 2
renderer: NetworkManager
# MW
ethernets:
wlp3s0:
dhcp4: no
bridges:
br0:
dhcp4: yes
interfaces:
- wlp3s0
QEMU 启动:
sudo qemu-system-x86_64 -enable-kvm -m 6G -smp cores=3 -cpu host -drive file=uslamp.img,if=virtio,aio=native,cache.direct=on -vga virtio -usb -device usb-tablet -nic tap,model=virtio-net-pci,script=no
VM 启动并停止约 2 分钟A start job is running Wait for Network to be Configured
。
在主机上:
ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s25: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN mode DEFAULT group default qlen 1000
link/ether f0:de:f1:ad:44:0a brd ff:ff:ff:ff:ff:ff
3: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DORMANT group default qlen 1000
link/ether 08:11:96:e6:a2:ac brd ff:ff:ff:ff:ff:ff
26: br0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
link/ether 6a:1b:be:e2:9f:ec brd ff:ff:ff:ff:ff:ff
28: tap0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether ea:d6:20:c8:e2:b5 brd ff:ff:ff:ff:ff:ff
VM 有不分配了 IP 地址,因此无法连接互联网。
我错过了什么?
非常感谢您的任何建议!
答案1
如果你不指定,-nic ...
那么 qemu 将添加默认值手册页:
如果未指定 -net 选项,则会创建单个 NIC。
这相当于-net nic -net user
到目前为止您已指定,nic
这意味着您创建虚拟硬件,但你还没有将其连接到任何东西。
假设你有设置桥梁为此,您已经需要告诉 qemu 连接到它。
但我要提醒你,如果我没记错的话,桥接无线设备并不总是那么好用。现在应该有所改变,但请注意,根据你阅读的文档/博客,你可能会得到过时的信息。
要连接到网桥,您可以在相同的手册页中找到类似-net nic -net tap,"helper=/path/to/qemu-bridge-helper"
或-net bridge[,vlan=n][,name=name][,br=bridge][,helper=helper]
-netdev
较新,可让您执行相同操作,但一次完成 - 但您仍需要将其与设备配对。请参阅此处更多信息。
创建 tap 网络以绑定到网桥的一些操作需要 root 权限,这就是您所看到的。因此,您可以以 root 身份运行(不推荐)或设置qemu-ifup脚本可满足您的需求。该脚本的默认设置已包含在/etc/qemu-ifup
包中qemu-system-common
。
这应该可以帮助你解决设置问题,但我真的想提一下虚拟器会帮你处理 qemu 命令行和网络准备工作吗?如果你讨厌 XML 文件,那么紫外线工具为你做。或者如果你不喜欢 libvirt,可以考虑多程它也将为您完成所有这些操作(但默认情况下不使用 libvirt)。
PS,即使您只是想手动运行 qemu,也请考虑使用我上面提到的工具并检查它们如何在 qemu 的命令行中设置网络。