首页 > 其他分享 >存储虚拟化的写入过程

存储虚拟化的写入过程

时间:2023-12-01 21:31:54浏览次数:25  
标签:存储 virtio 虚拟化 request 虚拟机 写入 调用 blk

虚拟机里面的进程写入一个文件,当然要通过文件系统。整个过程和文件系统过程没有区别。只是到了设备驱动层,我们看到的就不是普通的硬盘驱动了,而是 virtio 的驱动。virtio 的驱动程序代码在 Linux 操作系统的源代码里面,文件名叫 drivers/block/virtio_blk.c。

虚拟机里面的 virtio 的前端是这样的结构:struct virtio_device 里面有一个 struct vring_virtqueue,在 struct vring_virtqueue 里面有一个 struct vring。

存储虚拟化的场景下,整个写入的过程。

  • 在虚拟机里面,应用层调用 write 系统调用写入文件。
  • write 系统调用进入虚拟机里面的内核,经过 VFS,通用块设备层,I/O 调度层,到达块设备驱动。
  • 虚拟机里面的块设备驱动是 virtio_blk,它和通用的块设备驱动一样,有一个 request  queue,另外有一个函数 make_request_fn 会被设置为 blk_mq_make_request,这个函数用于将请求放入队列。
  • 虚拟机里面的块设备驱动是 virtio_blk 会注册一个中断处理函数 vp_interrupt。当 qemu 写入完成之后,它会通知虚拟机里面的块设备驱动。
  • blk_mq_make_request 最终调用 virtqueue_add,将请求添加到传输队列 virtqueue 中,然后调用 virtqueue_notify 通知 qemu。
  • 在 qemu 中,本来虚拟机正处于 KVM_RUN 的状态,也即处于客户机状态。
  • qemu 收到通知后,通过 VM exit 指令退出客户机状态,进入宿主机状态,根据退出原因,得知有 I/O 需要处理。
  • qemu 调用 virtio_blk_handle_output,最终调用 virtio_blk_handle_vq。
  • virtio_blk_handle_vq 里面有一个循环,在循环中,virtio_blk_get_request 函数从传输队列中拿出请求,然后调用 virtio_blk_handle_request 处理请求。
  • virtio_blk_handle_request 会调用 blk_aio_pwritev,通过 BlockBackend 驱动写入 qcow2 文件。
  • 写入完毕之后,virtio_blk_req_complete 会调用 virtio_notify 通知虚拟机里面的驱动。数据写入完成,刚才注册的中断处理函数 vp_interrupt 会收到这个通知。

存储虚拟化的写入过程_存储虚拟化



标签:存储,virtio,虚拟化,request,虚拟机,写入,调用,blk
From: https://blog.51cto.com/key3feng/8649234

相关文章

  • vue3+vite项目优化静态资源使用云存储
    项目中的问题1.当我们在维护自己的博客或者自己的网站的时候没有特别好的服务器就会响应特别的慢2.当我们项目特别大的时候也会首屏加载特别慢而且vue项目打包后的js文件特别的庞大还要加载各种资源就会特别的卡顿3.当我们项目中用到了一些3D效果各种3D资源部特别的大的时......
  • 三大存储协议介绍与存储资源盘活系统 AHCI、NVMe、SCSI
    存储协议目前主流的有三种,AHCI、NVMe、SCSI。HDD磁盘和早期SSD磁盘的传输协议一般采用AHCI(高级主机控制器接口,AdvancedHostControllerInterface)。AHCI为单队列模式,主机和HDD/SSD之间通过单队列进行数据交互。对于HDD这种慢速设备来说,主要瓶颈在存储设备,而非AHCI协议......
  • 主存Cache存储
    总结1.Cache是按块进行管理的。Cache和主存均被分割成大小相同的块。信息以块为单位调入Cache。一般将主存分割成大小相同的块后,会再将块进行分组,以Cache的总行数为一组,再分成n个块群。2.主存地址格式中的区内块号是用于查找该块在Cache中的位置,即第几行。块内位移用于确定所访......
  • Aloudata 余俊:数据虚拟化技术如何实现敏捷高效的逻辑数据集成与链路编排
    一、Data Fabric 与数据虚拟化简介在正式介绍 Data Fabric 之前,我想先回顾一下我们现有的数据仓库体系面临的问题。当提到数据仓库时,许多从事数据工作的人可能会想到 ETL(抽取、转换、加载)和一些技术工具,如 Hive、Hadoop 和 Spark。我在过去十多年一直在数据仓库领域工作,与......
  • plsql调试存储过程卡住的原因以及处理
    用PLSQL调试存储过程的时候,经常会遇到这个的情况,点调试后,继续点单步都是灰色,想停下来,但是取消也要点很多次才能取消掉。就像下面的情况:   一直以为是个BUG,直到最近有人告诉我了真相。出现这个问题的原因,是因为  1:调试存储过程要发起两个会话(运行、调试)  2:我们plsq......
  • Phthon中读写和存储.mat文件
    背景在做deeplearning过程中,使用caffe的框架,一般使用matlab来处理图片(matlab处理图片相对简单,高效),用python来生成需要的lmdb文件以及做test产生结果。所以某些matlab从图片处理得到的label信息都会以.mat文件供python读取,同时也python产生的结果信息也需要matlab来做进一步的处......
  • 达梦数据库,使用存储过程切分','分隔字段,生成多条数据
      CREATEORREPLACEPROCEDUREsplit_listASv_nameVARCHAR2(255);v_listVARCHAR2(255);v_valueVARCHAR2(255);v_posNUMBER;v_lengthNUMBER;BEGINFORrecIN(SELECTZLY_NAME,LIST_IDFROMyour_table)LOOPv_name:=re......
  • MySQL8.0存储引擎对比
    MySQL8.0存储引擎对比MySQL8默认支持的存储引擎有MEMORY,PERFORMANCE_SCHEMA,MyISAM,MRG_MYISAM,BLACKHOLE,CSV,ARCHIVE和InnoDB共8种存储引擎。其中InnoDB为MySQL8的默认存储引擎。存储引擎信息在数据库中的存储位置为:INFORMATION_SCHEMA下的ENGINES表。ENGINESUPPORTCOMMENT......
  • 服务器数据恢复—EMC存储多块硬盘离线导致raid5崩溃的数据恢复案例
    服务器存储数据恢复环境:EMC某型号存储,8块组建一组raid5磁盘阵列。上层操作系统采用zfs文件系统。服务器存储故障&分析:raid5阵列中有2块硬盘未知原因离线,raid5阵列崩溃,上层应用无法正常使用。服务器数据恢复过程:1、将故障服务器存储内的所有硬盘编号后取出,由硬件工程师检测所有......
  • CTP行情实时写入MySQL数据库
    CTP行情实时写入MySQL数据库 CTP即中国期货市场的交易系统,是一种可以实时获取行情数据的开放式软件平台。在这个平台上,我们可以订阅多种不同的市场行情数据,例如期货、股票、基金等等。而将这些大量的数据存入数据库,可以为量化交易策略提供必要的支持。 在这篇文章中,我们......