如何在 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?的主要内容,如果未能解决你的问题,请参考以下文章
Xamarin 表单自定义 GridView Tap 和 Long Tap 不能一起工作
在 iPhone 11 上,使用自定义视图,为啥我的 Tap Recognizer 或 UIButton 在视图的顶部没有响应但在视图的下部有效