如何在 libvirt 中使用自定义 Tap?

Posted

技术标签:

【中文标题】如何在 libvirt 中使用自定义 Tap?【英文标题】:How to use custom tap with libvirt? 【发布时间】:2018-03-25 13:56:01 【问题描述】:

我需要关于一个我无法理解的问题的帮助。 我有一些在嵌入式设备上运行的虚拟机,我动态创建一个虚拟机,然后在我启动这个虚拟机以在其中加载一些参数。网络从dhcp服务器获取ip没有问题,你可以看到我使用的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 之前,我创建了一个连接到网桥的 tap 接口,其中物理接口 eth0 也连接到网桥。 一切都与 qemu 一起工作,但我需要使用 libvirt 来管理虚拟机,我不明白如何将我的 tap 界面与 libvirt 一起使用。我尝试使用从虚拟管理器生成的默认网桥,它正在工作,但 libvirt 会为 vm 的内部接口生成一个随机的 mac 地址。而且我需要像qemu命令一样手动设置mac地址。

【问题讨论】:

您尚未显示您尝试创建的当前 libvirt XML 配置,因此我们无法告诉您还缺少什么。 “virt-install”命令有一个“--import”参数,以帮助配置具有预先存在的磁盘映像的 libvirt 来宾,这应该可以让您朝着正确的方向开始。 【参考方案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

带有 macvtap 网络的 x86_64 vm 的 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=tap9 \
 -device virtio-net-pci,netdev=eth0,mac=00:16:35:AF:94:4B

在我的例子中,tap9 是从 macvtap 界面创建的水龙头。因此,使用 qemu-kvm 可以正常工作。 现在我向您展示我为 libvirt 创建的 xml

<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 会自动创建一个连接到eth0 物理接口的 macvtap 接口,每个运行的 vm 一个。 所以,我希望这个解释对其他用户有所帮助。

【讨论】:

以上是关于如何在 libvirt 中使用自定义 Tap?的主要内容,如果未能解决你的问题,请参考以下文章

如何实现swipetaplongTap等自定义事件

如何实现swipetaplongTap等自定义事件

Xamarin 表单自定义 GridView Tap 和 Long Tap 不能一起工作

Swift:为自定义视图添加 Tap

在 iPhone 11 上,使用自定义视图,为啥我的 Tap Recognizer 或 UIButton 在视图的顶部没有响应但在视图的下部有效

自定义虚拟机安装(KVM)