两种磁盘接入方式的区别
virtio-blk 与 virtio-scsi 是 KVM 虚机接入磁盘的两种方式。virtio-blk 把磁盘直接以块设备形式暴露给 guest,路径更短、单盘延迟更低;virtio-scsi 通过一层 SCSI 控制器接入,牺牲少量开销换来更多设备、热插拔、discard/TRIM 与 iothread 等能力。选哪种取决于虚机要挂多少盘、是否需要 SCSI 语义。
基本信息
| guest 设备名 | virtio-blk 为 vda/vdb,virtio-scsi 为 sda/sdb |
|---|---|
| 单盘开销 | virtio-blk 较低,virtio-scsi 多一层控制器 |
| 设备数 | virtio-blk 受 PCI 槽位约束,virtio-scsi 单控制器可挂较多盘 |
| 高级特性 | virtio-scsi 支持热插拔、discard/unmap、多队列与 iothread |
| 配置位置 | 域 XML 中的 controller 与 disk 元素 |
典型使用场景
- 单盘、追求低延迟的数据库类虚机用 virtio-blk
- 需要挂载多块数据盘的虚机用 virtio-scsi 避免 PCI 槽位不够
- 需要在 guest 内做 TRIM/discard 的轻量置备盘用 virtio-scsi
- 需要在线热插拔磁盘时选 virtio-scsi 获得标准 SCSI 语义
- 为磁盘分配独立 iothread 提升并发吞吐时用 virtio-scsi
选型对比
| 维度 | virtio-blk | virtio-scsi |
|---|---|---|
| 单盘开销 | 较低 | 略高(多一层控制器) |
| 设备数 | 受 PCI 槽位约束 | 单控制器可挂较多盘 |
| 热插拔与 SCSI 语义 | 有限 | 支持 |
| discard/TRIM | 依赖驱动与配置,能力有限 | 支持 unmap,配合精简存储可回收空间 |
| 典型场景 | 单盘低延迟 | 多盘、iothread、TRIM |
virtio-scsi 磁盘 XML 片段
virtio-scsi 磁盘 XML 片段
<controller type='scsi' model='virtio-scsi'/>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2' discard='unmap'/>
<source file='/var/lib/libvirt/images/vm1.qcow2'/>
<target dev='sda' bus='scsi'/>
</disk>切换控制器类型相当于换总线:guest 内设备名会从 vda 变成 sda,需要同步调整挂载配置与 fstab,否则重启后无法进入系统。
discard=unmap 只有底层存储支持回收才有意义(如精简置备存储、LVM thin pool、支持 TRIM 的 SSD),底层不支持时丢弃操作可能被忽略,白白增加一次 I/O 开销。
选型判断顺序
- 先数盘:盘数多或需要频繁增减盘,virtio-scsi 更省心
- 再看是否需要热插拔:需要在线增删磁盘就选 virtio-scsi
- 再看是否需要 TRIM:用精简置备且希望回收空间的场景选 virtio-scsi
- 最后看性能敏感度:单盘低延迟场景优先 virtio-blk,并用压测确认差值
- 已经上线的虚机改总线前,先确认 guest 内是否有对应驱动与 fstab 是否用设备名
多块盘共用同一个 virtio-scsi 控制器时,控制器本身也可能成为瓶颈,高并发场景可考虑多控制器或配合 iothread 分散处理。