scsi子系统

scsi子系统

硬件模型

上图为scsi子系统的硬件拓扑图:

  • soc芯片内部有host(0),host(1)…host(k)这些有scsi功能的控制器

  • 这些host分别连接着片外的scsi设备device(0)…device(k)外设

  • 每个device内部有若干个channel,每个channel下面有若干个id,每个id下面有若干个lun

  • 这些lun就是可以接受scsi命令的实体,例如可以是硬盘,cdrom,磁带等等,也可以是一些可以接收特殊scsi命令的wlun

Host(0-k)

  • 表示可以发送和接收scsi命令的控制器。图示中的host(0),host(1)是一个示意图,框图以描述host(k)为主
  • 一个控制器对应一个外设;也可以不接任何外设

注意:需要说明的是,现实硬件里看不到任何纯scsi控制器;例如ufs的scsi命令是ufs控制器通过upiu传送和接收的,upiu是在mipi总线上传送的物理信息,而scsi则是cmd upiu中的字段。再例如usb U盘,也是类似情况。

  • 在UFS设备中,虽然上层协议采用了SCSI命令集,但传输介质和方法并不直接依赖SCSI硬件控制器。UFS控制器通过UPIU(UFS Protocol Information Unit)来传输和接收SCSI命令。UPIU可以看作是一种封装结构,承载了SCSI命令。最终,UPIU在物理上通过MIPI(Mobile Industry Processor Interface)总线传输,而不是传统的SCSI总线。

  • UFS协议栈利用SCSI命令集来处理存储请求,但这些SCSI命令实际上通过UPIU载体在MIPI总线上进行传输。因此,SCSI命令只是协议的一部分,而实际的物理层由其他技术来完成。

因此这里的host(0),host(1)…host(k)是一个控制器抽象描述,真实的控制器可以是ufs、usb上接着的硬盘控制器(这个应该画在soc外面)或者pcie上挂着的硬盘控制器(这个也应该画在soc外面)。

device(0-k)

图示中,例子device(0)是连接到host(0)控制器上的外设;device(k)是连接到host(k)控制器上的外设。外设可以是硬盘,光驱,ufs等。

Host和device之间的连接方式用了一个双箭头表示,它是一个抽象描述,代表scsi命令通道。

Scsi只是一个协议,因此各种五花八门的控制器都可以使用scsi进行交互。因此这个“通道”是借助各种控制器的驱动来完成的。有点像协议分层,scsi类似于协议层,而物理层,链路层则交给了各种控制器去完成。

channel + id

SCSI channel
  • scsi channel(通道)指的是设备之间数据传输的物理或逻辑路径。一个SCSI控制器可以有多个通道,每个通道能够连接多个设备,类似于一条“数据总线”。具体而言:

    • 一个SCSI通道可以看作是多个设备共用的连接“线路”,所有的设备通过这个通道与控制器进行通信。
    • 在多通道的SCSI控制器中,通道可以分开管理,通常用于连接多个设备或分离设备组(例如硬盘、磁带机等)。

    举例:某些高端服务器可能会配备双通道SCSI控制器,一个通道连接硬盘,另一个通道连接磁带机。

SCSI id
  • scsi id是分配给每个SCSI设备的唯一标识符,用于区分同一通道上连接的不同设备。每个设备都需要有一个唯一的ID,以便主机能够识别它们。SCSI ID的作用类似于网络中的IP地址,是设备之间通信的基本标识。

    • SCSI设备的ID范围通常为0到7(针对7设备的窄SCSI),或者0到15(针对15设备的宽SCSI),主机和每个设备都占用一个ID。
    • 主机(也就是SCSI控制器)通常默认使用ID 7(在窄SCSI中),因为它需要优先管理与其他设备的通信。
    • 每个设备(例如硬盘、光驱)都有唯一的SCSI ID,控制器通过这个ID与设备进行通信。

    举例: 在窄SCSI中,假设主机的SCSI ID为7,三个硬盘的SCSI ID分别为0、1、2。主机在通过通道发送数据时,会根据SCSI ID将数据发送到相应的设备

SCSI Channel和ID的用途
  • 设备识别:SCSI通道加上SCSI ID的组合确保了在一个SCSI总线上的设备能够被唯一识别。例如,假设一个服务器有一个双通道SCSI控制器,并且每个通道上连接多个硬盘。每个硬盘将通过特定的通道和ID被主机识别和访问。
  • 多设备管理:SCSI通道和ID的设计允许多个设备共享一个通道进行通信。例如,在旧式SCSI系统中,多个设备可以共享一条SCSI总线。ID区分了不同设备,使得主机能够管理并同时访问多个设备。
  • 优先级:在传统SCSI系统中,ID的数值还影响设备的优先级。ID越高,优先级越高。例如,SCSI ID 7(通常分配给控制器)具有最高优先级,这意味着它的操作通常会优先于其他设备。

SCSI Target

在SCSI(Small Computer System Interface)系统中,Target是指一个SCSI设备,它负责响应来自Initiator(主机)发出的SCSI命令。Target设备可以是多种类型的硬件设备,通常包括存储设备如硬盘、光驱、磁带机、或者RAID控制器。

Target是Initiator与SCSI系统中的设备通信的对象。在SCSI架构中:

  • Initiator:是发出SCSI命令的设备,通常是计算机的主机控制器(Host Bus Adapter, HBA)。
  • Target:是接收并处理这些命令的设备,比如硬盘、光驱等。

Target设备的例子

  • SCSI硬盘
  • SCSI磁带机
  • SCSI光驱
  • RAID控制器

Target与ID

  • Target设备通过一个SCSI总线的ID来标识。每个Target在SCSI总线上都有一个唯一的Target ID。多个设备(Target)可以连接在同一个SCSI总线上,每个设备都通过不同的ID来区分。
  • SCSI ID是Target设备在SCSI总线上的唯一标识符,决定了系统如何识别和寻址该设备。

Target与LUN(Logical Unit Number,逻辑单元号)

  • 一个Target设备可以包含多个LUN,每个LUN代表设备内部的一个逻辑单元。例如,一个硬盘可能有多个逻辑卷(partition),每个卷会有一个不同的LUN。
  • LUN的存在让Target设备能够表示多个逻辑资源(例如,一个RAID控制器有多个磁盘阵列,每个阵列可能分配一个LUN)。

LUN

LUN作为SCSI命令接收主体

  • LUN(逻辑单元号)可以代表不同的设备或逻辑实体,能够接收并处理来自SCSI Initiator的命令。例如,它可以是一个物理硬盘、光驱等存储设备,或是UFS固件虚拟出来的设备,比如RPMB(Replay Protected Memory Block)、Boot0、Boot1等。

非物理实体的LUN

  • 有些LUN并不对应实际的物理设备,而是虚拟逻辑单元,例如REPORT LUNS命令会返回设备上存在的LUN信息,这些LUN也是SCSI协议中的有效目标。

每个LUN在Linux通用块设备层(generic block layer)拥有独立的request queue

  • 在Linux内核中,每个LUN都有自己的request queue,即请求队列,用于管理该LUN的I/O请求。

逻辑分区

  • 如果一个硬盘被分为多个逻辑分区(通过GPT或MBR),这些分区是在一个LUN内,因此它们共享同一个request queue。这种分区属于文件系统的层级,而不是在SCSI子系统内处理的。

scsi 三个重要组成

1. SCSI Bus

  • SCSI Bus 是所有SCSI主机(Host)、目标设备(Target)和逻辑单元号(LUN)连接的总线。每个设备都对应一个 struct device,这些设备通过SCSI Bus进行组织和管理。

  • 常见的SCSI设备驱动如 sd(磁盘驱动)、sr(光盘驱动)、osst(磁带驱动)等都挂载在SCSI Bus上,并通过 struct device 激活它们。

    作用:SCSI Bus 承载了所有设备的通信,使主机能够与各种目标设备(包括磁盘、光驱等)进行数据交换。

2. SCSI Host

  • SCSI Host 是主机控制器,它负责管理主机系统与SCSI设备之间的交互。它通过 struct device 注册到系统中,并挂载在 scsi_host class 下。

  • 每个 SCSI Host 控制器都具有特定的属性,例如通过它的 struct device 的属性组(attr group, type)可以查看和控制其特性,如触发扫描操作。

  • 可以通过在 scsi_host 上使用扫描(scan)机制来强制系统扫描主机下的所有SCSI设备。

    作用:SCSI Host 控制器通过处理SCSI命令,使主机能够与连接的SCSI设备进行交互,并协调设备的发现和管理。

3. SCSI Device

  • SCSI Device 表示SCSI子系统中的每一个 LUN(逻辑单元)。每个LUN在SCSI系统中都有一个对应的 struct device,并且这些设备都会挂载在 scsi_device class 上。

  • 操作LUN的通用驱动程序是 sg.c,即SCSI通用(SCSI Generic)驱动,它提供了对LUN的直接操作接口。

    作用:SCSI Device 是SCSI子系统中的具体目标设备(如硬盘、光驱等)。每个LUN都可以独立接收并处理来自主机的SCSI命令。

参考链接:

https://blog.csdn.net/feelabclihu/article/details/108675669


scsi子系统
https://tomwithkernel.github.io/scsi/scsi子系统/
作者
Tom
发布于
2024年10月21日
更新于
2024年10月24日
许可协议