searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

虚拟机磁盘技术简介

2023-10-09 08:18:48
3
0

协议说明

       针对目前在虚拟机里面大多都不是直接挂载文件系统,而是通过ISCSI协议,挂载远程的裸盘,在裸盘的基础上再安装指定的文件系统。所以在使用磁盘进行读写操作时候,其实是使用的scsi协议进行的读写。SCSI的实现分为启动器(Initiator)和目标器(Target)这样的一个标准C/S架构总体架构如图:

    

启动器模型

在我们的虚拟机中,存在的就是启动器模型。目标器模型主要是存在于我们的存储提供端,例如ceph等。启动器模型如下图:

目标器模型

目标器模型如下图:

 

       目标器中PORT模型:PORT驱动将动态载入,PORT主要完成的任务是对链路上携带的SCSI指令的解包和封包,比如将指令打包为FPC或者ISCSI或者SAS等,或者将指令从FCP/ISCSI/SAS中解开。iSCSI/FCP/SAS等硬件的目标器模式驱动都属于PORT范畴,PORT需要提供的方法函数可能包括,传输报文(xmit_response),准备好接受数据(xfer_data),管理指令处理完毕回调(mgmt_task_done),任务处理结束(cmd_done),端口控制(复位等control)等。

       目标器中间层:中间层维护了“LUN空间”,“任务集”,“任务(命令)”等模型,对于LUN空间维护有两种截然不同的实现方法,一种是所有的PORT都看见的是一个全局的LUN,并外一种是为每个PORT维护一个LUN空间,其中第一种方法实现较为简单,这里的讨论以第一种展开。

       目标器中的Device模型:本质上Device是一个SCSI指令“分析器”,通过处理INQUIRY告诉Initiator当前LUN是什么设备,通过READ/WRITE处理IO。

 

数据处理流程

       系统上层下发的IO请求,从block层进入scsi的时候会启动一个定时器,默认超时时间是30s,如果30s内该IO没有返回,会进入错误处理流程,具体如图所示。

SCSI层超时处理首先会调用底层驱动的超时处理接口host->hostt->eh_timed_out()处理,若处理完!BLK_EH_NONE,直接返回,否则调用scsi_abort_command()尝试去abort掉该命令,若成功abort,直接返回,在日志中可以看到Abort Command之类的打印,否则进入错误处理进行恢复。

如果经过多次重试和SCSI启动器模型的中层reset恢复依然失败,则可能会触发offline对应的device。同时在日志中可以看到scsi:Device offlined 信息,如图所示:

 

0条评论
0 / 1000
l****n
2文章数
0粉丝数
l****n
2 文章 | 0 粉丝
l****n
2文章数
0粉丝数
l****n
2 文章 | 0 粉丝
原创

虚拟机磁盘技术简介

2023-10-09 08:18:48
3
0

协议说明

       针对目前在虚拟机里面大多都不是直接挂载文件系统,而是通过ISCSI协议,挂载远程的裸盘,在裸盘的基础上再安装指定的文件系统。所以在使用磁盘进行读写操作时候,其实是使用的scsi协议进行的读写。SCSI的实现分为启动器(Initiator)和目标器(Target)这样的一个标准C/S架构总体架构如图:

    

启动器模型

在我们的虚拟机中,存在的就是启动器模型。目标器模型主要是存在于我们的存储提供端,例如ceph等。启动器模型如下图:

目标器模型

目标器模型如下图:

 

       目标器中PORT模型:PORT驱动将动态载入,PORT主要完成的任务是对链路上携带的SCSI指令的解包和封包,比如将指令打包为FPC或者ISCSI或者SAS等,或者将指令从FCP/ISCSI/SAS中解开。iSCSI/FCP/SAS等硬件的目标器模式驱动都属于PORT范畴,PORT需要提供的方法函数可能包括,传输报文(xmit_response),准备好接受数据(xfer_data),管理指令处理完毕回调(mgmt_task_done),任务处理结束(cmd_done),端口控制(复位等control)等。

       目标器中间层:中间层维护了“LUN空间”,“任务集”,“任务(命令)”等模型,对于LUN空间维护有两种截然不同的实现方法,一种是所有的PORT都看见的是一个全局的LUN,并外一种是为每个PORT维护一个LUN空间,其中第一种方法实现较为简单,这里的讨论以第一种展开。

       目标器中的Device模型:本质上Device是一个SCSI指令“分析器”,通过处理INQUIRY告诉Initiator当前LUN是什么设备,通过READ/WRITE处理IO。

 

数据处理流程

       系统上层下发的IO请求,从block层进入scsi的时候会启动一个定时器,默认超时时间是30s,如果30s内该IO没有返回,会进入错误处理流程,具体如图所示。

SCSI层超时处理首先会调用底层驱动的超时处理接口host->hostt->eh_timed_out()处理,若处理完!BLK_EH_NONE,直接返回,否则调用scsi_abort_command()尝试去abort掉该命令,若成功abort,直接返回,在日志中可以看到Abort Command之类的打印,否则进入错误处理进行恢复。

如果经过多次重试和SCSI启动器模型的中层reset恢复依然失败,则可能会触发offline对应的device。同时在日志中可以看到scsi:Device offlined 信息,如图所示:

 

文章来自个人专栏
虚拟机计算
2 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0