在运行虚拟机的 Ubuntu 上是否可以正常工作互联网访问/网桥?

在运行虚拟机的 Ubuntu 上是否可以正常工作互联网访问/网桥?

请考虑以下场景。

主持人: 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/netplanyaml 文件手册页

# 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 的命令行中设置网络。

相关内容