virtio 设备家族
virtio 是一套半虚拟化驱动框架:guest 侧使用专门优化过的驱动,通过共享队列与宿主协作,避免模拟真实硬件的开销。按设备类型分成多个前端:virtio-net 网卡、virtio-blk 与 virtio-scsi 存储、virtio-balloon 内存气球、virtio-serial 串口通道、virtio-fs 目录共享等。云主机上几乎每一项虚拟硬件都对应其中一个。
基本信息
| 本质 | 半虚拟化:guest 内需装对应驱动,性能优于模拟的兼容设备 |
|---|---|
| 常见类型 | virtio-net、virtio-blk、virtio-scsi、virtio-balloon、virtio-serial、virtio-fs |
| 配置落点 | libvirt 域 XML 的设备段落,网卡与磁盘的 model 或 bus 属性 |
| 性能要点 | 多队列、校验和卸载等特性可按需开启 |
| 兼容前提 | guest 内核与镜像内要有对应驱动,缺驱动会导致设备识别不到 |
常用 virtio 设备
| 设备 | guest 侧驱动 | 用途 |
|---|---|---|
| virtio-net | virtio_net | 虚拟网卡(多队列/校验和卸载) |
| virtio-blk | virtio_blk | 块设备直接给 guest |
| virtio-scsi | virtio_scsi | SCSI 模型,支持热插拔与多盘 |
| virtio-balloon | virtio_balloon | 宿主回收 guest 未用内存 |
| virtio-fs | virtiofs | 宿主目录共享给 guest |
| virtio-serial | virtio_serial | 串口通道(如 guest agent) |
典型使用场景
- 虚机网络优化:把兼容网卡换成 virtio-net 提升吞吐
- 磁盘多盘管理:用 virtio-scsi 支持多盘与热插拔
- 内存动态调整:依赖 virtio-balloon 做回收与降配
- guest agent 通信:通过 virtio-serial 与宿主交换信息
- 开发环境共享目录:用 virtio-fs 把宿主目录挂进虚机
在 libvirt XML 中使用 virtio-scsi
在 libvirt XML 中使用 virtio-scsi
<controller type='scsi' index='0' model='virtio-scsi'/>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/disk.qcow2'/>
<target dev='sda' bus='scsi'/>
</disk>从兼容设备换成 virtio 设备会改变 guest 内看到的设备名(如从 sda 变成 vda),已经用设备名写死挂载配置的系统要先改回 UUID。
balloon 回收内存依赖 guest 内驱动与配合:驱动缺失时动态调整不生效,回收过猛则可能触发 guest 内内存不足。
多队列与卸载特性需要两端配合:宿主侧设置队列数量,guest 侧驱动与内核参数也要相应开启,只配一边往往看不到性能变化,容易误判为 virtio 没有收益。
更换网卡或磁盘的设备类型属于结构性变更:先停虚机、改定义、确认 guest 内设备名与网络配置,改完按「能起、能连、能挂载」三步验证。