根据我之前将 IDE VM 磁盘迁移到 VirtIO SCSI 的经验,我在 virt-manager 中创建了一个 Win10 VM,主磁盘是设置时的 SCSI 磁盘。在 virt-manager 中,我创建了一个 VirtIO SCSI 控制器:
<controller type="scsi" index="0" model="virtio-scsi">
<address type="pci" domain="0x0000" bus="0x03" slot="0x00" function="0x0"/>
</controller>
然后我创建了一个磁盘(SCSI 磁盘 1),根据 virt-manager 的说法,它使用SCSI总线类型:
<disk type="file" device="disk">
<driver name="qemu" type="qcow2" discard="unmap"/>
<source file="/var/lib/libvirt/images/win10-enterprise.qcow2"/>
<target dev="sda" bus="scsi"/>
<boot order="2"/>
<address type="drive" controller="0" bus="0" target="0" unit="0"/>
</disk>
在 Win10 设置期间,我安装了RedHat VirtIO ISO并安装了驱动程序,以便 Win10 可以安装到 SCSI 磁盘:
安装后,我向虚拟机添加了另一个磁盘(VirtIO Disk 1 )。这次在 virt-manager 中,我选择VirtIO作为总线类型:
<disk type="file" device="disk">
<driver name="qemu" type="qcow2" discard="unmap"/>
<source file="/var/lib/libvirt/images/win10-enterprise-1.qcow2"/>
<target dev="vda" bus="virtio"/>
<address type="pci" domain="0x0000" bus="0x06" slot="0x00" function="0x0"/>
</disk>
VirtIO 磁盘似乎未链接到 virt-manager 中虚拟机概览上列出的任何控制器。我假设此磁盘是VirtIO 块设备。
在 Win10 客户虚拟机中,我注意到设备管理器中的主SCSI磁盘标记为“QEMU SCSI”磁盘,而VirtIO磁盘标记为“RedHat VirtIO SCSI”磁盘。用于 SCSI 磁盘的 VirtIO 存储控制器标记为“Red Hat VirtIO SCSI 控制器”:
我很困惑为什么 SCSI 磁盘没有被标记为 VirtIO SCSI 磁盘,以及 VirtIO 磁盘(假定为 VirtIO 块)是如何成为“VirtIO SCSI”磁盘而无需连接到任何类型的 SCSI 控制器。
问:我为该虚拟机配置的磁盘有什么区别吗?
问:从 virt-manager 的角度来看,使用VirtIO和SCSI总线类型的磁盘之间有什么区别,以及它们在虚拟机中如何呈现?
问:使用不同总线类型的磁盘之间是否存在性能差异?
“VirtIO” 是虚拟 PCI 设备的通用框架,旨在提供比传统模拟设备更高的性能(并且更简单 - 物理硬件通常具有虚拟设备不需要的许多装饰)。
有两种不同的 VirtIO 存储设备:
/dev/vd*
普通的“VirtIO 块访问”设备,完全自定义,与常见物理存储设备几乎没有关系。这在 Linux 上显示为,viostor
在 Windows 上使用驱动程序,并且每个 PCI 插槽限制为一个磁盘。/dev/sd*
完整的“VirtIO SCSI 控制器”设备,其行为类似于具有同样概念(SCSI 命令、目标、LUN)的典型 SCSI 磁盘控制器。它在 Linux 上显示为(vioscsi
在 Windows 上),并且可以通过单个控制器公开多个磁盘。虽然两者都需要 Windows 上的自定义驱动程序(SCSI 控制器没有标准驱动程序,而 SATA AHCI 则有),但在后一种情况下,“vioscsi”客户驱动程序可以简单地将 SCSI 命令传递给虚拟机管理程序 [并且虚拟机管理程序理论上可以将它们传递给物理 SAS 磁盘],而在“VirtIO 块”的情况下,客户驱动程序必须假装是 SCSI 磁盘,以便 Windows 知道如何处理它——许多 SCSI 命令处理是在“viostor”驱动程序内部完成(模拟)的。
Windows 驱动程序假装是 SCSI,因为操作系统已经知道如何与 SCSI 磁盘通信,所以虽然这意味着“viostor”驱动程序需要模拟 SCSI 命令处理,但这也意味着驱动程序不需要处理各种其他细节 - 它可以让现有的操作系统 SCSI 支持来处理这些问题。
两者都作为 PCI 设备连接,但是:
每个 PCI 插槽始终有一个“VirtIO 块”磁盘,而 PCI 设备本身是自定义类型的存储设备。Windows“viostor”驱动程序将其伪装成 SCSI 磁盘(在驱动程序中处理 SCSI 命令),而 Linux 驱动程序将其公开为自定义
/dev/vd*
设备。“VirtIO SCSI”磁盘可以共享一个控制器,磁盘是可通过该控制器访问的 SCSI 设备。Windows“vioscsi”驱动程序和 Linux 驱动程序都只需要初始化 SCSI 控制器,但在客户机和虚拟机管理程序(或客户机和物理磁盘)之间传递实际命令,因此标签为“SCSI 直通”。
不应该有任何显著的性能差异;我听说理论上“VirtIO 块”可能会表现更好,但在我不需要挤出最后一点性能的情况下,我更喜欢“VirtIO SCSI”,因为它的集成更清晰。