Я не могу заставить сеть внутри гостевой виртуальной машины работать с KVM на Raspberry Pi 4 8GB под управлением официального образа Ubuntu 20.04. Насколько я могу судить, сеть настроена правильно. И я очень надеюсь, что кто-нибудь скажет мне, что я сделал что-то не так, и сможет указать мне на лучшую документацию. Я просмотрел документацию netplan, дюжину различных руководств по настройке KVM, и даже просмотрел некоторые документы по QEMU, связанные с настройкой CPU, потому что я обнаружил, что 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
Вот мой netplan:
$ 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>
...
Вот экран просто вращающегося гостевого компьютера. Как вы можете видеть, у меня есть полные сетевые возможности через интерфейс моста на хосте для подключения к KVM через VNC. Screenshot
Ладно, единственное, что я не замечал, это мой брандмауэр. Брандмауэр не позволял моим гостям общаться через мост. Я не совсем понимаю проблему, но, по крайней мере, имею представление о том, что происходит, благодаря этому отчету об ошибке: https://bugs.launchpad.net/ubuntu/+source/ufw/+bug/ 573461
Итак, чтобы решить проблему, я сделал следующее:
$ sudo nano /etc/default/ufw
А затем изменил это
IPT_MODULES=""
на это
IPT_MODULES="bridge"
Затем я перешел к этому файлу:
$ sudo nano /etc/ufw/sysctl.conf
И добавил это в конец:
# Don't filter packets to our libvirt guests
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
]Затем перезагрузите брандмауэр:
$ sudo ufw reload
Теперь мои гости могут полностью получить доступ к моей сети, как если бы они были физическими машинами, в то время как моя хост-машина остается должным образом защищенной брандмауэром.
Если у кого-то есть «для чайников» объяснение того, что именно я здесь делаю, пожалуйста, поделитесь им. Лучшее, что я могу понять, это то, что это говорит UFW, даже если он загружается до конфигурации сети, ожидать наличия мостов и не фильтровать их.Или, по крайней мере, это то, что я думаю, что это делает.