virtio 是什么
virtio 是 Linux 上的半虚拟化设备驱动标准:客体内的前端驱动与宿主侧的 QEMU 后端通过共享内存环交换请求,设备不再假装成一个真实硬件,而是按约定的协议高效通信。网卡、磁盘、气球与串口等设备都有对应的 virtio 实现,代价是客体必须认识这套驱动。
基本信息
| 架构 | 客体前端驱动加宿主后端,通过共享环传递请求 |
|---|---|
| 传输层 | 常见为基于 PCI 的形态,另有 MMIO 与通道形态 |
| Linux 支持 | 内核原生包含网卡、块设备与 SCSI 等驱动 |
| Windows 支持 | 需要单独安装 virtio 驱动包,安装介质由社区项目提供 |
| 性能收益 | 相比纯硬件模拟减少陷入次数,磁盘与网络吞吐更高 |
| 失配后果 | 客体缺少驱动时认不到设备,表现为磁盘缺失或网卡未识别 |
在客体识别 virtio 设备
在客体识别 virtio 设备
lspci -nnk | grep -A2 -i virtio # 查看 virtio 设备与绑定的驱动
lsmod | grep -E 'virtio_(net|blk|scsi|pci)' # 确认已加载的 virtio 模块
find /sys/bus/virtio/devices -maxdepth 1 -mindepth 1 | head # 查看 virtio 设备列表
ethtool -i eth0 | grep driver # 确认网卡使用的是 virtio 驱动
virt-what # 判断当前运行环境类型设备与驱动对照
| 设备 | Linux 驱动 | 常见问题 |
|---|---|---|
| 网卡 | 内核内置 virtio 网卡驱动 | 精简镜像裁掉模块后无网卡 |
| 块设备 | 内核内置 virtio 块设备驱动 | 缺少驱动时系统盘不可见 |
| SCSI 控制器 | virtio SCSI 驱动 | 换总线类型后引导失败 |
| 气球设备 | 内核内置气球驱动 | 缺失时动态内存调整无效 |
| 串口与代理 | 代理组件 | 缺失时关机与信息获取走不通 |
迁移前确认目标平台的磁盘总线类型:源侧使用其他总线类型的镜像转到 virtio 平台,需要在客体内预装驱动并调整引导配置。直接切换总线类型是最常见的启动失败原因。
自制精简镜像时不要裁掉 virtio 模块:这类镜像在本地物理机上一切正常,上云或换宿主后直接认不到系统盘。制作云上基线镜像时把 virtio 驱动列入必须保留项,并在创建实例后验证。