本文将介绍enable QEMU to use public bridge。

1. Overview

Bridge类似于一个网络交换机,用于交换数据包,连接不同的VMs, containers以及Host.

2. Tun/Tap网卡

在我们创建完虚拟机后,一般在host里会多了张tap网卡,那这个网卡有什么作用呢?

2.1 普通网卡工作模式


普通的网卡一端连接物理链路,一端连接内核协议栈。

2.2 tun/tap网卡工作模式

普通的物理网卡是通过物理链路来收发数据,而tun/tap 是通过/dev/net/tun来收发数据。tun/tap网卡一端连着/dev/net/tun,一端连着协议栈。

2.3 虚拟化场景下的tap网卡

虚拟机主要用的是tap类型网卡,下面是tap网卡工作模式:

tap网卡主要是两部分组成,字符设备驱动和虚拟网卡驱动。

  • 字符设备驱动:负责和用户进程打交道,把数据写入/dev/net/tun,然后通知用户进程从/dev/net/tun里面拿数据实现数据交互
  • 虚拟网卡驱动:负责和网络协议栈的数据打交道

qemu-kvm中 vm与host之间的通讯过程:

  1. 在创建一个vm并启动时,在host中创建一个tap类型的网卡,例如tap0,同时vm作为一个qemu进程,内核为其提供了一个/dev/net/tun设备的文件描述符(fd),供其读写
  2. vm用户进程产生数据,发到vm的虚拟网卡上,实质上vm作为host的一个qemu进程,其产生的数据写入到/dev/net/tun里
  3. tap0网卡通过字符设备驱动从/dev/net/tun 里收到数据后,会转发给网桥,网桥再判断是否丢弃,转发或者交给上层的API来处理

3. Solutions

3.1 Create bridge

3.1.1 Using Distribution-Specific Scripts

Networking#Public_Bridge中列举了RedHat,Debian和SuSE上的配置。
还有一个重要的tool是netplan

主机重启后,无需重新配置,重点推荐😊。

3.1.2 Manual Configuration

参见QEMU使用网桥模式Hosting QEMU VMs with Public IP Addresses using TAP Interfaces中的步骤。

此方法的弊端在于:每次主机重启都需要重新配置,所以不推荐😢。

3.2 Create tap

The default network configure script is /etc/qemu-ifup and the default network deconfigure script is /etc/qemu-ifdown.

将创建tap的脚本放入到/etc/qemu-ifup中即可。

4. Experience

4.1 netplan and qemu-ifup

https://github.com/liujunming/qemu_usage/tree/master/0002-set-net-on-kvm

4.2 virtio-net-pci

https://github.com/liujunming/qemu_usage/tree/master/0007-use-virtio-net-pci-dev

4.3 e1000 device

https://github.com/liujunming/qemu_usage/tree/master/0009-e1000-device

4.4 net nic

https://github.com/liujunming/qemu_usage/tree/master/0010-net-nic

5. Troubleshooting

docker makes existing KVM VMs have suddenly no connection

Potential solutions:


参考资料:

  1. Networking#Public_Bridge
  2. qemu虚拟机网桥通讯过程
  3. 虚拟网络设备简介
  4. QEMU使用网桥模式
  5. Hosting QEMU VMs with Public IP Addresses using TAP Interfaces