qemu模拟磁盘
文章目录
- 磁盘的类型
- 介质
- HDD
- SSD
- 硬盘关键指标
- 接口
- Integrated Drive Electronics (IDE)
- Advanced Technology Attachment (ATA) / Parallel Advanced Technology Attachment (PATA)
- SATA(Serial ATA)
- Small Computer System Interface (SCSI)
- Serial Attached SCSI (SAS)
- NVMe (Non-volatile Memory Express)
- U.2接口
- 磁盘板卡
- qemu模拟
- 模拟IDE 磁盘
- 模拟scsi磁盘
- 模拟nvme磁盘
- 模拟HBA 卡
- megasas
- lsi53c895a
- virtio-scsi
- virtio-blk
- 参考
本文拟简单介绍下qemu模拟磁盘的方式和背后的一些原理。
磁盘的类型
介质
按照磁盘的介质分,有Hard Disk Drive (HDD)和Solid State Drive (SSD)
HDD
机械硬盘即是传统普通硬盘,主要由:磁头组件、磁头驱动机构、盘片组、控制电路和接口等几个部分组成。
机械硬盘中所有的盘片都装在一个旋转轴上,每张盘片之间是平行的,在每个盘片的存储面上有一个磁头,磁头与盘片之间的距离比头发丝的直径还小,所有的磁头联在一个磁头控制器上,由磁头控制器负责各个磁头的运动。盘片的数量和每个盘片的存储容量确定了磁盘的总容量。
- 磁头:负责读写数据
- 盘片:保存写入的数据
- 主轴:转动盘片,将盘片上的指定位置移动到磁头下
- 控制电路:控制硬盘的速度,磁头臂的移动、向磁头下发命令等
SSD
固态驱动器(Solid State Disk或Solid State Drive,简称SSD),俗称固态硬盘,固态硬盘是用固态电子存储芯片阵列而制成的硬盘。
固态硬盘不像传统的硬盘采用磁性材料存储数据,而是使用flash技术存储信息。其特点就是断电后数据不消失。
固态硬盘没有内部机械部件,并不代表其生命周期无限,flash闪存是非易失存储器,可以对称为块的存储器单元块进行擦写和再编程。任何flash器件的写入操作只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前必须先执行擦除。因擦除次数有限,所以固态硬盘也是有生命周期的。
SSD性能优势:
- 响应时间短:SSD硬盘内部没有机械运动部件,省去了寻道时间和机械延迟时间,可更快捷的响应读写请求。
- 读写速率高:SSD通过内部控制器计算出数据的存放位置,并进行速写操作,省去了机械操作时间,大大提高了读写效率。
- 不会产生噪音
- 不会产生大量热量
硬盘关键指标
- 硬盘容量(volume):容量的单位为兆字节或千兆字节。影响硬盘容量的因素是盘片数量和单盘容量。
- 转速(Rotational speed):硬盘的转速是硬盘盘片每分钟转过的圈数,单位为RPM(rotation per minute)一般硬盘的转速达到5400RPM/7200RPM。SCSI接口硬盘转速可达10000~15000RPM。
- 平均访问时间(Average Access Time)=平均寻道时间+平均等待时间。
- 数据传输率(Data Transfer Rate):硬盘的数据传输率是指硬盘读写数据的速度。主要有内部传输率和外部传输率。
- IOPS(Input/Output Per Second):即每秒输入输出量。
接口
按照磁盘接口区分,目前主流的有以下几种:
- Integrated Drive Electronics (IDE)
- Advanced Technology Attachment (ATA) / Parallel Advanced Technology Attachment (PATA)
- Serial Advanced Technology Attachment (SATA)
- Small Computer System Interface (SCSI)
- Serial Attached SCSI (SAS)
- NVMe (Non-volatile Memory Express)
- U.2
Integrated Drive Electronics (IDE)
IDE接口(Integrated Drive Electronics)是电子集成驱动器,是把“硬盘控制器”与“盘体”集成在一起的硬盘驱动器。IDE(Integrated Drive Electronics,电子集成驱动器),包括PIO(Programming I/O)和DMA(Direct Memory Access) 两种传输模式。把盘体与控制器集成在一起减少硬盘接口的电缆数目与长度,数据传输的可靠性得到增强,硬盘制造起来变得更容易的技术。
平常所说的IDE接口,也称之为ATA接口。ATA的英文拼写为“Advanced Technology Attachment”。ATA本身可以支持串行或并行。最快的并行ATA(即ATA/133)所能达到133MB/sec,现在市场上几乎没有IDE接口的硬盘了。
IDE接口的硬盘价格低廉、兼容性强、性价比高。但是,数据传输速度慢、线缆长度过短、连接设备少、不支持热插拔、接口速度的可升级性差。
Advanced Technology Attachment (ATA) / Parallel Advanced Technology Attachment (PATA)
ATA与IDE技术实现的磁盘驱动器关系最密切。
IDE是一种计算机系统接口,主要用于硬盘和CD-ROM,本意为“把控制器与盘体集成在一起的硬盘”。数年以前PC主机使用的硬盘,大多数都是IDE兼容的,只需用一根电缆将它们与主板或适配器连起来就可以了,而目前主要接口为SATA接口。而在SATA技术日益发展下,没有ATA的主板已经出现,而且Intel在新型的芯片组中已经不默认支持ATA接口,主机版厂商需要另加芯片去对ATA作出支持(通常是为了兼容旧有硬盘和光盘驱动器)。
SATA(Serial ATA)于2002年推出后,原有的ATA改名为PATA(并行高技术配置,Parallel ATA)。2013年12月29日,西部数据正式停止PATA硬盘供应,而希捷科技则已停售产多年,这意味着1986年设计的PATA接口在经历27年后正式退出历史舞台。
一般说来,ATA是一个控制器技术,而IDE是一个匹配它的磁盘驱动器技术,但是两个术语经常可以互用。ATA是一个花费低而性能适中的接口,主要是针对台式机而设计的,销售的大多数ATA控制器和IDE磁盘都是更高版本的,称为ATA - 2和ATA - 3,与之匹配的磁盘驱动器称为增强的IDE。
SATA(Serial ATA)
串行ATA。SATA采用串行方式进行数据传输,采用点对点连接方式,支持热插拔,即插即用,SATA的主机接口协议是AHCI(Advanced Host Controller Interface)。
msata是SATA协会(Serial ATA International Organization;SATA-IO)开发的新的mini-SATA(mSATA)接口控制器的产品规范,新的控制器可以让 SATA技术整合在小尺寸的装置上,外型和针脚排布与mini PCI-E完全相同,但针脚信号定义不同,两者互不兼容
Small Computer System Interface (SCSI)
SCSI(Small Computer System Interface,小型计算机系统接口),使用50针接口,外观和普通硬盘接口有些相似。用在服务器上面比较多,速度快,稳定性很好,比较适合做磁盘阵列。
SCSI的进化型是SAS(Serial Attached SCSI,串行SCSI),而SCSI并不是专门为硬盘设计的接口,是一种广泛应用于小型机上的高速数据传输技术。SCSI接口具有应用范围广、多任务、带宽大、CPU占用率低,以及热插拔等优点。
Serial Attached SCSI (SAS)
SAS(Serial Attached SCSI,串行SCSI)是新一代的SCSI技术,和现在流行的Serial ATA(SATA)硬盘相同,都是采用串行技术以获得更高的传输速度,并通过缩短连结线改善内部空间等。SAS是并行SCSI接口之后开发出的全新接口,此接口的设计是为了改善存储系统的效能、可用性和扩充性,并且提供与SATA硬盘的兼容性。
NVMe (Non-volatile Memory Express)
NVM Express(缩写NVMe),或称非易失性内存主机控制器接口规范(英语:Non-Volatile Memory Host Controller Interface Specification,缩写:NVMHCIS),是一个逻辑设备接口规范。它是基于设备逻辑接口的总线传输协议规范(相当于通讯协议中的应用层),用于访问通过PCI Express(PCIe)总线附加的非易失性存储器介质(例如采用闪存的固态盘机),虽然理论上不一定要求PCIe总线协议。NVMe是一种协议,是一组允许SSD使用PCIe总线的软硬件标准;而PCIe是实际的物理连接通道。
nvme只是一种接口规范,对应的硬盘一般有不同的接口:
- pcie接口
- m.2接口
U.2接口
U.2接口是一种用于连接高速存储设备的接口,它是由SATA-IO组织(Serial ATA International Organization)定义的,旨在取代传统的SAS(Serial Attached SCSI)接口。
磁盘板卡
服务器上的磁盘一般都是通过一张板卡来和主板连接,一般有以下几种:
-
HBA卡
HBA卡,全称Host Bus Adapter,是一种硬件接口卡,用于连接服务器和存储设备。它使得服务器能够直接访问存储设备,而无需经过网络。HBA卡支持多种存储协议,如SCSI、SAS和SATA,使得服务器能够轻松地与各种类型的存储设备进行交互。 -
RAID卡
RAID卡是一种专为存储阵列而设计的硬件接口卡。它通过在物理层或逻辑层实现数据冗余,提高了数据的可靠性和性能。RAID卡支持多种RAID级别,可以根据不同的应用需求进行选择。
RAID卡可以看做是一个微型计算机系统,阵列卡通过一个ROC(raid-on-chip)芯片来完成对存储设备的管理,并按需模拟磁盘给计算机使用,硬盘本身对操作系统不透明,由阵列卡管理。
qemu模拟
先大致看下qemu可以模拟的存储设备:
Storage devices:
name "am53c974", bus PCI, desc "AMD Am53c974 PCscsi-PCI SCSI adapter"
name "cxl-type3", bus PCI, desc "CXL Memory Device (Type 3)"
name "dc390", bus PCI, desc "Tekram DC-390 SCSI adapter"
name "floppy", bus floppy-bus, desc "virtual floppy drive"
name "ich9-ahci", bus PCI, alias "ahci"
name "ide-cd", bus IDE, desc "virtual IDE CD-ROM"
name "ide-cf", bus IDE, desc "virtual CompactFlash card"
name "ide-hd", bus IDE, desc "virtual IDE disk"
name "isa-fdc", bus ISA, desc "virtual floppy controller"
name "isa-ide", bus ISA
name "lsi53c810", bus PCI
name "lsi53c895a", bus PCI, alias "lsi"
name "megasas", bus PCI, desc "LSI MegaRAID SAS 1078"
name "megasas-gen2", bus PCI, desc "LSI MegaRAID SAS 2108"
name "mptsas1068", bus PCI, desc "LSI SAS 1068"
name "nvdimm", desc "DIMM memory module"
name "nvme", bus PCI, desc "Non-Volatile Memory Express"
name "nvme-ns", bus nvme-bus, desc "Virtual NVMe namespace"
name "nvme-subsys", desc "Virtual NVMe subsystem"
name "piix3-ide", bus PCI
name "piix4-ide", bus PCI
name "pvscsi", bus PCI
name "scsi-block", bus SCSI, desc "SCSI block device passthrough"
name "scsi-cd", bus SCSI, desc "virtual SCSI CD-ROM"
name "scsi-generic", bus SCSI, desc "pass through generic scsi device (/dev/sg*)"
name "scsi-hd", bus SCSI, desc "virtual SCSI disk"
name "sd-card", bus sd-bus
name "sd-card-spi", bus sd-bus, desc "SD SPI"
name "sdhci-pci", bus PCI
name "ufs", bus PCI, desc "Universal Flash Storage"
name "usb-bot", bus usb-bus
name "usb-mtp", bus usb-bus, desc "USB Media Transfer Protocol device"
name "usb-storage", bus usb-bus
name "usb-uas", bus usb-bus
name "vhost-scsi", bus virtio-bus
name "vhost-scsi-pci", bus PCI
name "vhost-scsi-pci-non-transitional", bus PCI
name "vhost-scsi-pci-transitional", bus PCI
name "vhost-user-blk", bus virtio-bus
name "vhost-user-blk-pci", bus PCI
name "vhost-user-blk-pci-non-transitional", bus PCI
name "vhost-user-blk-pci-transitional", bus PCI
name "vhost-user-fs-device", bus virtio-bus
name "vhost-user-fs-pci", bus PCI
name "vhost-user-scsi", bus virtio-bus
name "vhost-user-scsi-pci", bus PCI
name "vhost-user-scsi-pci-non-transitional", bus PCI
name "vhost-user-scsi-pci-transitional", bus PCI
name "virtio-9p-device", bus virtio-bus
name "virtio-9p-pci", bus PCI, alias "virtio-9p"
name "virtio-9p-pci-non-transitional", bus PCI
name "virtio-9p-pci-transitional", bus PCI
name "virtio-blk-device", bus virtio-bus
name "virtio-blk-pci", bus PCI, alias "virtio-blk"
name "virtio-blk-pci-non-transitional", bus PCI
name "virtio-blk-pci-transitional", bus PCI
name "virtio-pmem", bus virtio-bus
name "virtio-scsi-device", bus virtio-bus
name "virtio-scsi-pci", bus PCI, alias "virtio-scsi"
name "virtio-scsi-pci-non-transitional", bus PCI
name "virtio-scsi-pci-transitional", bus PCI
模拟IDE 磁盘
qemu-system-x86_64 -m 2G --enable-kvm -smp 4 -hda linux-bios.qcow2
直接用-hda参数启动的磁盘默认为IDE磁盘。
或者用qemu-system-x86_64 -m 2G --enable-kvm -smp 4 -drive file=linux-bios.qcow2,if=ide
指定if为ide。
sda是通过-hda启动的磁盘
可以看到是IDE。
模拟scsi磁盘
打算按照qemu官方文档的说明创建scsi磁盘:
但是总是报错:qemu-system-x86_64: -drive file=linux-bios.qcow2,if=scsi,index=0: machine type does not support if=scsi,bus=0,unit=0
。最后,参考qemu 2.12 does not support if=scsi,qemu在2.12版本之后就不支持这个选项了,最后使用如下的命令:
qemu-system-x86_64 -m 2G --enable-kvm -smp 4 \
-device virtio-scsi-pci,id=scsi \
-drive file=linux-bios.qcow2,id=root-img,if=none,format=qcow2,cache=none \
-device scsi-hd,drive=root-img
其中:
- 第一行添加了virtio-scsi-pci设备
- 第二行添加了一个文件作为磁盘后端
- 第三行添加了一个scsi-hd设备并将前面两者联系起来
模拟nvme磁盘
qemu-system-x86_64 -m 2G --enable-kvm -smp 4 \
-drive file=linux-bios.qcow2,if=ide \
-drive file=disk1.qcow2,if=none,id=nvm \
-device nvme,serial=deadbeef,drive=nvm
可以看出来,新增加的盘已经是一块nvme磁盘了,并且也增加了一个nvme控制器。
模拟HBA 卡
megasas
$ qemu-system-x86_64 -m 2G --enable-kvm -smp 4 \
-drive file=linux-bios.qcow2,if=ide \
-device megasas,id=scsi0 \
-device scsi-hd,drive=drive0,bus=scsi0.0,channel=0,scsi-id=0,lun=0 \
-drive file=disk1.qcow2,if=none,id=drive0 \
-device scsi-hd,drive=drive1,bus=scsi0.0,channel=0,scsi-id=1,lun=0 \
-drive file=disk2.qcow2,if=none,id=drive1
查看启动日志:
根据scsi id信息(SCSI设备id:host, channel,id,lun),
可以得到下面的拓扑图:
lsi53c895a
$ qemu-system-x86_64 -m 2G --enable-kvm -smp 4 \
-drive file=linux-bios.qcow2,if=ide \
-device lsi53c895a,id=scsi0 \
-device scsi-hd,drive=drive0,bus=scsi0.0,channel=0,scsi-id=0,lun=0 \
-drive file=disk1.qcow2,if=none,id=drive0 \
-device scsi-hd,drive=drive1,bus=scsi0.0,channel=0,scsi-id=1,lun=0 \
-drive file=disk2.qcow2,if=none,id=drive1
查看启动日志
对应的拓扑如下:
virtio-scsi
$ qemu-system-x86_64 -m 2G --enable-kvm -smp 4 \
-drive file=linux-bios.qcow2,if=ide \
-device virtio-scsi-pci,id=scsi0,num_queues=4 \
-device scsi-hd,drive=drive0,bus=scsi0.0,channel=0,scsi-id=0,lun=0 \
-drive file=disk1.qcow2,if=none,id=drive0 \
-device scsi-hd,drive=drive1,bus=scsi0.0,channel=0,scsi-id=0,lun=1 \
-drive file=disk2.qcow2,if=none,id=drive1
拓扑结构:
virtio-blk
virtio-scsi和virtio-blk都是磁盘的半虚拟化驱动,virtio-scsi解决了virtio-blk的一些限制,具体对比可以参考:Configuring virtio-blk and virtio-scsi Devices
$ qemu-system-x86_64 -m 2G --enable-kvm -smp 4 \
-drive file=linux-bios.qcow2,if=ide \
-device virtio-blk-pci,drive=drive0,id=virtblk0,num-queues=4 \
-drive file=disk1.qcow2,if=none,id=drive0
参考
How to emulate block devices with QEMU
Removed features
An Overview of QEMU Storage Features
Configuring virtio-blk and virtio-scsi Devices
NVMe Emulation
Block device options
qemu-blog
常见硬盘分类介绍
Types of Hard Drives – SATA, PATA, SCSI, and SSD
SSD Form Factors
几个硬盘接口协议的总结
HBA卡与RAID卡详解:使用方法、优缺点与适用场景
硬阵列卡(raid卡)和直通卡(hba卡)到底有什么不同
QEMU/Options
virtio-scsi和virtio-blk的理解
The next-generaion storage inerface for the red hat enterprise Linux kernel virual machine: VIRTIO-SCSI
Features/VirtioSCSI
virtio-scsi驱动
Implementing a virtio-blk driver in my own operating system