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命令。