技术路线分三种(其中第二种有个改进版)
1.全模拟/传统模拟
通常指由虚拟化层(通常是Qemu)完全模拟一个设备给虚拟机用。
虚拟机中的系统完全不知道自己在虚拟机中
以网络为例,发包涉及到3套代码(虚拟机中的网卡驱动e1000,qemu中的网卡驱动e1000,host机中的tap0及其驱动)
此种情况下,虚拟机中的os 不需要更改任何东西, 只需要 在 qemu 中 适配 "虚拟机os的网卡驱动"
2.virtio/半虚拟化
在 guest os 中 新建一个 virtio 驱动 作为前端 , 前端 通过 Vring协议 与 后端通信
在 qemu 新建 一套 代码 作为 后端 , 后端 通过 Vring 协议 与 前端通信, 后端通过 host 上的 tap接口 发送 实际网络包
以网络为例,发包涉及四套代码(虚拟机中的virtio驱动,vring协议,qemu代码,host机中的tap0及其驱动)
此种情况下,虚拟机中的os 必须以 virtio驱动 为 网卡驱动
2.1 vhost (virtio/半虚拟化的改进版)
在 guest os 中 新建一个 virtio 驱动 作为前端 , 前端 通过 Vring协议 与 后端通信
在 host os 新建 一套 代码 作为 后端 , 后端 通过 Vring 协议 与 前端通信, 后端通过 host 上的 tap接口 发送 实际网络包
以网络为例,发包涉及四套代码(虚拟机中的virtio驱动,vring协议,host os 代码 ,host机中的tap0及其驱动)
此种情况下,虚拟机中的 os 必须以 virtio驱动 为 网卡驱动
此种情况基于 ioeventfd
2.2 vhost-user
在 guest os 中 新建一个 virtio 驱动 作为前端 , 前端 通过 Vring协议 与 后端通信
在 qemu 新建 一套 代码 作为 后端 , 后端 通过 Vring 协议(mmap) 与 前端通信, 后端通过 host 上的 tap接口 发送 实际网络包
以网络为例,发包涉及四套代码(虚拟机中的virtio驱动,vring协议,qemu代码,host机中的tap0及其驱动)
此种情况下,虚拟机中的os 必须以 virtio驱动 为 网卡驱动
3. 设备直通(VFIO)
借助硬件技术,如intel的VT-d技术实现PCI设备直接挂载给虚拟机。
1.全模拟/传统模拟
前端 -net nic,model=e1000
后端 -netdev ifname=tap0
发包流程
----------------------------
虚拟机os e1000 驱动 -> (虚拟机OS)
----------------------
qemu 截获
qemu e1000 驱动 (QEMU)
write(tap0)
------------------------
tap0 驱动 (HOST OS)
------------------------
2.virtio/半虚拟化
前端 -device virtio-net-device,netdev=bsnet0,mac=E0:FE:D0:3C:2E:EE
后端 -netdev tap,id=bsnet0,ifname=bsTap0
发包流程
----------------------------
虚拟机os virtio 驱动 -> (虚拟机OS)
----------------------
qemu 收到包(不是截取)
qemu virtio 驱动 (QEMU)
write(tap0)
------------------------
tap0 驱动 (HOST OS)
------------------------
2.1 vhost
前端 -device virtio-net-device,netdev=bsnet0,mac=E0:FE:D0:3C:2E:EE
后端 -netdev tap,id=bsnet0,ifname=bsTap0,vhost=on
发包流程
----------------------------
虚拟机os virtio 驱动 -> (虚拟机OS)
----------------------
HOST os收到包(不是截取)
HOST os virtio 驱动 (HOST OS)
调用tap0 驱动发包
------------------------
tap0 驱动 (HOST OS)
------------------------
3. 设备直通(VFIO)
TODO