我无法在来宾 VM 内建立网络以在运行官方 Ubuntu 20.04 映像的 Raspberry Pi 4 8GB 上使用 KVM。据我所知,我的网络配置正确。而且我真的希望有人会告诉我我做错了什么,并可以为我指出更好的文档。我已经阅读了 netplan 的文档、十几个关于 KVM 设置的不同教程,甚至还查看了一些与 CPU 配置相关的 QEMU 文档,因为我发现 QEMU 对 aarch64 的构建不如对 x86_64 的构建好。
我通过与在十几个教程中找到的相同方式安装 KVM:
$ sudo apt install qemu qemu-kvm libvirt-clients libvirt-daemon-system virtinst bridge-utils
$ sudo systemctl enable libvirtd
$ sudo systemctl start libvirtd
这是我的网络计划:
$ cat /etc/netplan/01-netcfg.yaml
network:
ethernets:
eth0:
dhcp4: false
dhcp6: false
optional: true
nameservers:
addresses: [1.1.1.1, 1.0.0.1]
wifis:
wlan0:
dhcp4: true
dhcp6: false
optional: true
access-points:
"censored":
password: "censored"
bridges:
br0:
interfaces: [eth0]
nameservers:
addresses: [1.1.1.1, 1.0.0.1]
parameters:
stp: true
forward-delay: 4
dhcp4: true
dhcp6: false
version: 2
renderer: networkd
然后我为 KVM 域定义了它:
$ sudo mkdir -p /opt/kvm
$ sudo nano /opt/kvm/host-bridge.xml
<network>
<name>host-bridge</name>
<forward mode="bridge"/>
<bridge name="br0"/>
</network>
$ virsh net-define /opt/kvm/host-bridge.xml
$ virsh net-start host-bridge
$ virsh net-autostart host-bridge
然后我检查了它是否确实存在并且配置正确:
$ virsh net-list --all
Name State Autostart Persistent
--------------------------------------------------
default inactive no yes
host-bridge active yes yes
开始创建 VM 后,我检查了它的 vnet0 是否已正确添加到网桥:
$ sudo virt-install --name Test-VM --ram=2048 --vcpus=2 --cpu max --hvm --disk path=/opt/vhd/test-vhd,size=16 --cdrom /opt/iso/ubuntu-20.04.1-live-server-arm64.iso --network bridge=br0 --graphics vnc
$ virsh domiflist Test-VM
Interface Type Source Model MAC
-----------------------------------------------------------
vnet0 bridge br0 virtio 52:54:00:64:58:9e
$ brctl show
bridge name bridge id STP enabled interfaces
br0 8000.dca632b43f5b yes eth0
vnet0
docker0 8000.0242aa58079a no
docker1 8000.024296884d89 no veth239b4dd
veth76e81fc
vethdffe7c7
vethef20e5a
然而,在这一切之后,我的客人内部的网络似乎不起作用。它只是不停地试图获得一个 IP 地址,但它永远不会得到一个。有什么我错过的吗?
我还检查了虚拟机实际上正在使用桥接接口,它似乎是:
$ virsh edit Test-VM
...
<interface type='bridge'>
<mac address='52:54:00:64:58:9e'/>
<source bridge='br0'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
</interface>
...
这是客人正在旋转的屏幕。如您所见,我通过主机上的桥接接口具有完整的网络能力,可以通过 VNC 连接到 KVM。 截屏
好的,我一直忽略的一件事是我的防火墙。防火墙阻止了我的客人通过网桥进行通信。我不完全理解这个问题,但由于这个错误报告,我至少知道发生了什么:https ://bugs.launchpad.net/ubuntu/+source/ufw/+bug/573461
所以为了解决这个问题,我这样做了:
然后改变这个
对此
然后我转到这个文件:
并将其附加到它的末尾:
然后重新加载防火墙:
现在我的客人完全可以像物理机一样访问我的网络,而我的主机则保持适当的防火墙。
如果有人对我在这里所做的事情有“傻瓜”的解释,请随时分享。我能想到的最好的是,这告诉 UFW,即使它在网络配置之前加载,也希望有网桥,而不是过滤它们。或者至少这就是我认为它正在做的事情。