Как использовать кастомный тап с 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. Итак, я надеюсь, что это объяснение полезно для других пользователей.

Другие вопросы по тегам