QEMU简介
QEMU是一种通用的开源计算机仿真器和虚拟器。QEMU共有两种操作模式
1,全系统仿真:能够在任意支持的架构上为任何机器运行一个完整的操作系统
2,用户模式仿真:能够在任意支持的架构上为另一个Linux/BSD运行程序
具体来说,当作为机器仿真器使用时,QEMU可以通过动态代码翻译机制(dynamic translation)在不同的机器上仿真任意一台机器(例如ARM板),并执行不同于主机架构的代码。同时由于动态代码翻译机制,它也能够实现不错的性能。
而当QEMU用作虚拟器时,QEMU的优点在于其实纯软件实现的虚拟化模拟器,几乎可以模拟任何硬件设备,但是也正因为QEMU是纯软件实现的,因此所有指令都需要QEMU转手,因此会严重的降低性能。而可行的办法是通过配合KVM或者Xen来进行加速,目前肯定是以KVM为主。KVM 是硬件辅助的虚拟化技术,主要负责 比较繁琐的 CPU 和内存虚拟化,而 QEMU 则负责 I/O 虚拟化,两者合作各自发挥自身的优势,相得益彰。
主要使用的程序
- qemu-ga:这是一个不利用网络实现 guest 和 host 之间交互的应用程序(使用 virtio-serial),运行在 guest 中。
- qemu-io:这是一个执行 Qemu I/O 操作的命令行工具。
- qemu-system-x86_64:Qemu 的核心应用程序,虚拟机就由它创建的。
- qemu-img:创建虚拟机镜像文件的工具,下面有例子说明。
- qemu-nbd:磁盘挂载工具。
Qemu 软件虚拟化实现的思路是采用二进制指令翻译技术,主要是提取 guest 代码,然后将其翻译成 TCG 中间代码,最后再将中间代码翻译成 host 指定架构的代码,如 x86 体系就翻译成其支持的代码形式,ARM 架构同理。
QEMU虚拟机网络
虚拟机网络一般有三种模式如下,目前主要用的就是Bridge模式,所以这里主要是看看网桥的通讯过程。
Host-Only:
这种模式下,VM只能与Host之间进行网络通讯,与网段内其它的机器处于隔离的状态
Nat:
显然这种模式下,虚拟机要与网段内其它的机器或者外网的机器通讯时,必须要走nat
Bridge:
这种模式下,虚拟机相当于网段内一台独立的主机了,是目前应用最广泛的模式
设定网桥一般用两种command,即brctl或者iproute2
在我们创建完虚拟机后,一般在host里会多了张tap网卡,那这个网卡是有什么作用呢?
普通的网卡一端连接物理链路,一端连接内核协议栈。当数据通过物理链路进来后,到达内核协议栈做进一步的处理,对于一些错误的数据包,协议栈可以选择丢弃;对于不属于本机的数据包,协议栈可以选择转发;对于属于本机的数据,协议栈就会通过Socket API告知上层正在等待的应用程序。
普通的物理网卡是通过物理链路来收发数据,而tun/tap 是通过/dev/net/tun来收发数据,一端连着/dev/net/tun,一端连着协议栈。
tap网卡:工作在二层链路层,能处理mac层数据包,支持mac层广播,可以与物理网卡做桥接,主要用在虚拟机通讯。虚拟机里主要用的是tap类型网卡,下面是tap网卡工作模式:
tap网卡主要是两部分组成,字符设备驱动和虚拟网卡驱动。
字符设备驱动:负责和用户进程打交道,把数据写入/dev/net/tun,然后通知用户进程从/dev/net/tun里面拿数据实现数据交互
虚拟网卡驱动:负责和网络协议栈的数据打交道
qemu-kvm中 vm与Host之间的通讯过程:
1.在创建一个vm并启动时,在host中就会创建一个tap类型的网卡,例如tap0,同时vm作为一个qemu进程,内核为其提供了一个/dev/net/tun设备的文件描述符(fd)14,供其读写。
2.vm用户进程产生数据,发到vm的虚拟网卡上,实质上vm作为host的一个qemu进程,其产生的数据写入到/dev/net/tun里
3.tap0网卡通过字符设备驱动从/dev/net/tun 里收到数据后,会转发给网桥,网桥再判断是否丢弃,转发或者交给上层的API来处理