如何使用libvirt定制水龙头?

时间:2018-03-25 13:56:02

标签: virtualization qemu libvirt

我需要帮助解决一个我无法理解的问题。 我有一些在嵌入式设备上运行的虚拟机,我动态创建一个虚拟机,在我启动这个虚拟机之后加载一些参数。网络从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接口,其中phisical接口eth0也连接到网桥。 一切都在使用qemu,但我需要使用libvirt来管理vms,我不知道如何使用我的tap接口与libvirt。我尝试使用从虚拟管理器生成的默认网桥,它正在工作,但是libvirt为vm的内部接口生成一个随机mac地址。我需要像qemu命令一样手动设置mac地址。

1 个答案:

答案 0 :(得分:0)

谢谢Daniel,我解决了问题,这是我的实际配置: 您必须确保/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运行一个。 所以,我希望这个解释对其他用户有用。