Как использовать кастомный тап с libvirt?
Мне нужна помощь по одной проблеме, которую я не могу понять. У меня есть несколько виртуальных машин, которые работают на встроенном устройстве, я динамически создаю одну виртуальную машину и после запуска этой для загрузки некоторых параметров внутри него. Сеть без проблем берет ip с сервера dhcp, вы можете увидеть команду qemu, которую я использую:
qemu-system-aarch64 \
-cpu host \
-machine type=virt \
-enable-kvm \
-nographic \
-smp 1 \
-m 64 \
-serial stdio \
-monitor telnet:127.0.0.1:4448,server,nowait \
-kernel ./Image \
-append 'console=ttyAMA0 earlyprintk=pl011,0x1c090000 loglevel=9 root=/dev/vda rw rootwait' \
-drive file=./rootfs.ext4,if=none,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 \
-netdev tap,id=eth0,script=no,ifname=tap0 \
-device virtio-net-pci,netdev=eth0,mac=00:16:35:AF:94:00
Перед запуском vm я создаю интерфейс с одним касанием, подключенный к мосту, где физический интерфейс eth0 также подключен к мосту. Все работает с qemu, но мне нужно использовать libvirt для управления vms, и я не понимаю, как я могу использовать мой интерфейс tap с libvirt. Я пытаюсь использовать мост по умолчанию, который генерируется из виртуального менеджера, он работает, но libvirt генерирует случайный mac-адрес для внутреннего интерфейса vm. И мне нужно вручную установить MAC-адрес, как команда qemu.
1 ответ
Спасибо, Даниэль, я решил проблемы, и это на самом деле моя конфигурация: ты должен быть уверен /etc/sysctl.conf
содержит следующие строки
net.ipv4.ip_forward = 1
net.ipv4.conf.all.proxy_arp = 1
net.ipv6.conf.all.forwarding = 1
Чем я создал новый интерфейс Macvtap
sudo ip link add link eth0 name macvtap0 type macvtap mode bridge
sudo ip link set macvtap0 address 1a:46:0b:ca:bc:7b up
sudo ip link show macvtap0
Команда Qemu для x86_64 vm с сетью Macvtap
qemu-system-aarch64 \
-cpu host \
-machine type=virt \
-enable-kvm \
-nographic \
-smp 1 \
-m 64 \
-serial stdio \
-monitor telnet:127.0.0.1:4448,server,nowait \
-kernel ./Image \
-append 'console=ttyAMA0 earlyprintk=pl011,0x1c090000 loglevel=9 root=/dev/vda rw rootwait' \
-drive file=./rootfs.ext4,if=none,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 \
-netdev tap,id=eth0,script=no,ifname=tap9 \
-device virtio-net-pci,netdev=eth0,mac=00:16:35:AF:94:4B
куда tap9
в моем случае это тап, который был создан из интерфейса macvtap. Так что с QEMU-KVM это работает. Теперь я покажу вам XML, который я создал для libvirt
<domain type="kvm">
<name>vmdhcp</name>
<memory unit='KiB'>55200</memory>
<currentMemory unit='KiB'>55200</currentMemory>
<vcpu placement='static'>1</vcpu>
<os>
<type arch='aarch64' machine='virt'>hvm</type>
<kernel>/var/lib/libvirt/images/Image</kernel>
<cmdline>root=/dev/vda</cmdline>
<boot dev='hd'/>
</os>
<cpu mode='custom' match='exact'>
<model fallback='allow'>host</model>
</cpu>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/bin/qemu-system-aarch64</emulator>
<disk type='file' device='disk'>
<source file='/var/lib/libvirt/images/rootfs.ext4'/>
<target dev='vda' bus='virtio'/>
</disk>
<interface type='direct'>
<mac address='00:16:00:7b:4b:8c'/>
<source dev='eth0' mode='bridge'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
<serial type='pty'>
<target port='0'/>
</serial>
<console type='pty'>
<target type='serial' port='0'/>
</console>
</devices>
С libvirt вам не нужно создавать интерфейсы macvtap вручную, потому что с этой конфигурацией libvirt автоматически создает один интерфейс macvtap, подключенный к eth0
физический интерфейс, по одному на каждый работающий vm. Итак, я надеюсь, что это объяснение полезно для других пользователей.