首页 > 技术文章 > linux SCSI子系统,设备名称设定

longchang 2019-07-26 11:53 原文

https://blog.csdn.net/keepingstudying/article/details/51740632

http://ilinuxkernel.com/?p=794

Small Computer Systems Interface (SCSI) 是一组标准集,它定义了与大量设备(主要是与存储相关的设备)通信所需的接口和协议。 Linux® 提供了一种 SCSI 子系统,用于与这些设备通信。Linux 是分层架构的一个很好的例子,它将高层的驱动器(比如磁盘驱动器或光驱)连接到物理接口,比如 Fibre Channel 或 Serial Attached SCSI(SAS).


scsi设备:机器外设总线是计算机内部与外设进行通讯的总线,分为IDE总线,SCSI总线和USB总线.IDE总线是PC机上用得最多的总线,其造价比较便 宜.SCSI总线的速度比IDE总线要快得多,不过造价比较高.IDE总线和SCSI总线一般只于硬盘,光驱和扫描仪等,而USB总线则可以用于更多的外 设,且速度更快.一般来说,这三种外设总线是不可以混合使用的,但如果有总线转换器则可以在一定程度上混合使用,如SCSI总线就可以有向IDE总线进行 转换的转换器.

SCSI-3 的开发开始于 1993 年,现已成为了一组标准集,可以定义协议、命令集和信令方法。在 SCSI-3 中,包含一组命名为 Ultra 的并行 SCSI 标准和基于串行 SCSI 的协议,比如 IEEE 1394 (FireWire)、Fibre Channel, 、Internet SCSI (iSCSI) 和新兴的 SAS。这些标准通过引入存储网络技术(比如 FC-AL 或 iSCSI)改变了传统的存储理念,将数据速率扩展到了 1 Gbit/s,将最大的可寻址设备数增加到了 100 以上,并将最大的电缆长度扩展到了 25 米。图 1 展示了从 1986 至 2007 年 SCSI 的数据速率的变化 .

SCSI 传输所采用的协议已经时过境迁,SCSI 命令却保持了最初的元素。SCSI 命令是在 Command Descriptor Block (CDB) 中定义的。CDB 包含了用来定义要执行的特定操作的操作代码,以及大量特定于操作的参数。

SCSI 命令支持读写数据(各有四个变量)以及很多非数据命令,比如 test-unit-ready(设备是否已就绪)、inquiry(检索有关目标设备的基本信息)、read-capacity(检索目标设备的存储容 量)等等。目标设备支持何种命令取决于设备的类型。发起借助大约 60 种可用命令,SCSI 可适用于许多设备(包括随机存取设备,比如磁盘和像磁带这样的顺序存储设备)。SCSI 也提供了专门的命令以访问箱体服务(比如存储箱体内部当前的传感和温度)。

Linux 内核中的 SCSI 架构

图 2 显示了 SCSI 子系统在 Linux 内核中的位置。内核的顶部是系统调用接口,处理用户空间调用到内核中合适的目的地的路由(例如 open、read 或 write)。而虚拟文件系统(VFS) 是内核中支持的大多数文件系统的抽象层。它负责将请求路由到合适的文件系统。大多数文件系统都通过缓冲区缓存来相互通信,这种缓存通过缓存最近使用的数据 来优化对物理设备的访问。接下来是块设备驱动器层,它包括针对底层设备的各种块驱动器。SCSI 子系统是这种块设备驱动器之一。

 

者通过 inquiry 命令识别设备类型。表 1 列出了最常用的 SCSI 命令。

 

我们以Redhat Enterprise Linux 6内核源码2.6.32-71.e16版本为例,分析Linux内核SCSI层是如何给硬盘分配盘符的,即/dev/sda、/dev/sdb … /dev/sdm等盘符的由来。

 

sd_probe()函数
     系统中有新的SCSI磁盘(包括USB硬盘)插入,就会调用sd_probe()函数。

   哪里决定盘符?
      index的值决定了盘符(sd_probe()函数中第2277行)。
      若index=0,则分配给此块SCSI硬盘的盘符为sda;
      若index=1,则分配给此块SCSI硬盘的盘符为sdb;
         … …
      若index=25,则分配给此块SCSI硬盘的盘符为sdz;

       函数在文件drivers/scsi/sd.c中。

推荐阅读