当前位置: 首页 > article >正文

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通过内部控制器计算出数据的存放位置,并进行速写操作,省去了机械操作时间,大大提高了读写效率。
  • 不会产生噪音
  • 不会产生大量热量
硬盘关键指标
  1. 硬盘容量(volume):容量的单位为兆字节或千兆字节。影响硬盘容量的因素是盘片数量和单盘容量。
  2. 转速(Rotational speed):硬盘的转速是硬盘盘片每分钟转过的圈数,单位为RPM(rotation per minute)一般硬盘的转速达到5400RPM/7200RPM。SCSI接口硬盘转速可达10000~15000RPM。
  3. 平均访问时间(Average Access Time)=平均寻道时间+平均等待时间。
  4. 数据传输率(Data Transfer Rate):硬盘的数据传输率是指硬盘读写数据的速度。主要有内部传输率和外部传输率。
  5. 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


http://www.kler.cn/a/488018.html

相关文章:

  • 使用postMessage解决iframe与父页面传参
  • js实现一个可以自动重链的websocket客户端
  • Git撤销指定commit并更新远端仓库
  • Ubuntu18.04离线安装audit
  • 『SQLite』如何使用索引来查询数据?
  • .net core 为什么使用 null!
  • 【Linux】Linux开发:GDB调试器与Git版本控制工具指南
  • STM32中的MCO
  • brpc之IOBuf
  • 【redis】centos7下安装redis7
  • 网站自动签到
  • 【MySQL基础篇】十四、MySQL的C语言API使用
  • #渗透测试#网络安全# 一文了解什么是跨域CROS!!!
  • (纯小白教程)Liunx系统安装Anaconda
  • LLM - Llama 3 的 Pre/Post Training 阶段 Loss 以及 logits 和 logps 概念
  • 《零基础Go语言算法实战》【题目 2-2】使用函数交换两个变量的值
  • Python网络爬虫:从入门到实战
  • 《Spring Framework实战》15:4.1.4.6.方法注入
  • C#里使用libxl里演示输出日期和读取日期数据的例子
  • 前端工具汇总
  • 使用virtualenv创建虚拟环境
  • JavaScript学习记录13
  • Elasticsearch学习(2) :DSL和RestClient实现搜索文档
  • Scala语言的面向对象编程
  • 解析若依 `R.java` 类——ruoyi-common-core
  • 【每日学点鸿蒙知识】so 库瘦身、IDE 内存配置、判断前后台呢