SCSI系列五:设备名称和地址

主要内容

SCSI 寻址

设备名称

devfs 中的设备名称

scsidev 中的设备名称

SCSI 寻址

Linux 对 SCSI 设备有四级分层寻址方案:

SCSI adapter number [host]

channel number [bus]

id number [target]

lun [lun]

“Lun”是常见的 SCSI 逻辑单元号的缩写。括号中的术语是设备伪文件系统 (devfs) 使用的名称约定。在下面的描述中,“总线”优先于“通道”。

SCSI适配器编号通常是计算机的内部IO总线(例如PCI、PCMCIA、ISA等)上的适配器卡的任意编号。此类适配器有时称为 HBA(主机总线适配器)。SCSI 适配器编号由内核按升序分配,从 0 开始。

每个HBA 可以控制一个或多个SCSI 总线。

每个 SCSI 总线可以连接多个 SCSI 设备。在 SCSI 术语中,HBA 称为“启动器”并占用一个 SCSI id 号(通常为 7)。启动器 [ 1 ] 与通常称为 SCSI 设备(例如磁盘)的目标进行通信。在 SCSI 并行总线上,id 的数量与宽度有关。8 位总线(有时称为“窄”)可以有 8 个 SCSI ID,其中 1 个由 HBA 占用,剩下 7 个用于 SCSI 设备。宽 SCSI 总线为 16 位宽,最多可连接 15 个 SCSI 设备(目标)。SCSI 3 标准草案允许 SCSI 总线上存在大量 ID。

每个 SCSI 设备可以包含多个逻辑单元号 (LUN)。这些通常由支持多种媒体的复杂磁带和 CDROM 单元使用。

因此,Linux 风格的 SCSI 寻址是一个四级层次结构:

<scsi(_适配器编号)、通道、id、lun>

使用 devfs 的命名约定,这将变为:

<主机、总线、目标、lun>

设备名称

设备名称可以被认为是控制设备而不是设备本身的内核驱动程序的网关。因此,可以有多个设备名称,其中一些可能提供略有不同的特性,所有这些名称都映射到同一实际设备。

各种 SCSI 设备的设备名称可以在 /dev目录中找到。传统上,在Linux 中,SCSI 设备是通过其主设备号和次设备号而不是其SCSI 总线地址(例如SCSI 目标ID 和LUN)来标识的。设备伪文件系统 (devfs) 放弃了主设备号和次设备号方案,并且 SCSI 子系统使用基于 SCSI 总线地址的设备名称 ,或者,有一个名为scsidev的实用程序 ,它可以在 Linux SCSI 子系统范围内解决此问题,因此不会产生与 devfs 相同的系统范围影响。

为 SCSI 磁盘保留八个块主编号:8、65、66、67、68、69、70 和 71。每个主编号可容纳 256 个次编号,对于 SCSI 磁盘,这些编号细分如下:

[b,8,0] /dev/sda 
[b,8,1] /dev/sda1 
.... 
[b,8,15] /dev/sda15 
[b,8,16] /dev/sdb 
[b ,8,17] /dev/sdb1 
.... 
[b,8,255] /dev/sdp15

不带尾随数字的磁盘设备名称指的是整个磁盘(例如/dev/sda ),而带尾随数字的磁盘设备名称指的是 该磁盘内 15 个允许的分区[ 2 ]之一 .
其余 7 个 SCSI 磁盘块主编号遵循类似的模式:

[b,65,0] /dev/sdq 
[b,65,1] /dev/sdq1 
.... 
[b,65,159] /dev/sdz15 
[b,65,160] /dev/sdaa 
[b,65,161] / dev/sdaa1 
.... 
[b,65,255] /dev/sdaf15 
[b,66,0] /dev/sdag 
[b,66,1] /dev/sdag1 
.... 
[b,66,255] /dev/ sdav15 
.... 
[b,71,255] /dev/sddx15

因此,有 128 个可能的磁盘(即/dev/sda到 /dev/sddx),每个磁盘最多有 15 个分区。相比之下,IDE 子系统允许 20 个磁盘(10 个控制器,每个控制器有 1 个主控制器和 1 个从控制器),每个磁盘最多可以有 63 个分区。

SCSI CD-ROM 设备分配的块主编号为 11。传统上, sr是设备名称,但scd 可能更容易识别,并且受到几个最新发行版的青睐。允许 256 个 SCSI CD-ROM 设备:

[b,11,0] /dev/scd0 [或 /dev/sr0] 
[b,11,255] /dev/scd255 [或 /dev/sr255]

SCSI 磁带设备分配的主字符号为 9。最多支持 32 个磁带设备,每个磁带设备都可以以四种模式(0、1、2 和 3)之一进行访问,可以带或不带倒带。设备分配如下:

[c,9,0] /dev/st0 [磁带 0,模式 0,倒带] 
[c,9,1] /dev/st1 [磁带 1,模式 0,倒带] 
.... 
[c,9,31 ] /dev/st31 [磁带 31,模式 0,倒带] 
[c,9,32] /dev/st0l [磁带 0,模式 1,倒带] 
.... 
[c,9,63] /dev/st31l [磁带 31,模式 1,倒带] 
[c,9,64] /dev/st0m [磁带 0,模式 2,倒带] 
.... 
[c,9,96] /dev/st0a [磁带 0,模式 3,倒带] 
.... 
[c,9,127] /dev/st31a [磁带 31,模式 3,倒带] 
[c,9,128] /dev/nst0 [磁带 0,模式 0,不倒带] 
.... 
[c, 9,160] /dev/nst0l [磁带 0,模式 1,无倒带] 
.... 
[c,9,192] /dev/nst0m [磁带 0,模式 2,无倒带] 
....
[c,9,224] /dev/nst0a [磁带 0,模式 3,无倒带] 
.... 
[c,9,255] /dev/nst31a [磁带 31,模式 3,无倒带]

SCSI 通用 (sg) 设备分配的主字符号为 21。有 256 个可能的 SCSI 通用 (sg) 设备:

[c,21,0] /dev/sg0 
[c,21,1] /dev/sg1 
.... 
[c,21,255] /dev/sg255

请注意,SCSI 通用设备名称使用尾随字母(例如 /dev/sgc)已被弃用。

每个SCSI磁盘(但不是每个分区)、每个SCSI CD-ROM和每个SCSI磁带都映射到一个sg设备。不属于这三个类别的 SCSI 设备(例如扫描仪)也显示为 sg 设备。

伪设备 可能会导致通常不被视为 SCSI 的设备显示为 SCSI 设备名称。例如,IDE-scsi 伪驱动程序可以拾取 ATAPI CD-ROM 并将其映射到/dev/scd0。

内核源代码中提供的linux /Documentation/devices.txt文件是 Linux 设备名称及其相应的主次编号分配的权威参考

devfs 中的设备名称

设备伪文件系统可以挂载为/dev,在这种情况下它会取代传统的 Linux 设备子目录。或者,它可以安装在其他地方(例如/devfs)并补充现有的设备结构。

如果没有 devfs,设备名称通常保存在 根分区的dev目录中。因此,设备名称(及其关联的权限)具有文件系统持久性。设备名称的存在并不一定意味着存在这样的设备(甚至其驱动程序)。为了让用户不必创建设备名称条目(使用mknod 命令),大多数 Linux 发行版都在/dev目录中定义了数千个设备名称。当应用程序尝试 open() 设备名称时,ENODEV 的 errno 值表示当前没有相应的设备(或驱动程序)可用。

Devfs 采用不同的方法,其中设备名称的存在与相应设备(及其驱动程序)的存在直接相关。

假设 devfs 安装在/dev上,则 SCSI 设备的主设备名称可能如下所示:

/dev/scsi/host0/bus0/target1/lun0/disc [整个磁盘] 
/dev/scsi/host0/bus0/target1/lun0/part6 [分区 6] 
/dev/scsi/host0/bus0/target1/lun0/generic [磁盘的 sg 设备] 

/dev/scsi/host1/bus0/target2/lun0/cd [CD 读取器或写入器] 
/dev/scsi/host1/bus0/target2/lun0/generic [cd 的 sg 设备] 

/dev/scsi /host2/bus0/target0/lun0/mt [磁带模式 0 倒带] 
/dev/scsi/host2/bus0/target0/lun0/mtan [磁带模式 3 无倒带] 
/dev/scsi/host2/bus0/target0/lun0/通用 [磁带的 sg 设备]

第三行的 sg 设备对应于第一行的“整个磁盘”,因为它们具有相同的 SCSI 地址(即 host0/bus0/target1/lun0)。如果 sg 驱动程序是一个模块并且尚未加载(或已卸载),则上面列表中的“通用”设备名称将不会出现。

[请注意“disc”的拼写,因为 devfs 作者更喜欢英语拼写而不是美国变体。]可以看出,devfs 的命名方案与“SCSI 寻址”一节中讨论的 SCSI 寻址非常 匹配。值得注意的是,IDE 子系统使用类似的 devfs 设备命名方案,其中“scsi”一词替换为“ide”。

scsidev 中的设备名称

名为scsidev 的实用程序将设备名称添加到/dev/scsi目录中,以反映每个设备的 SCSI 地址。名称的前 2 个字母是上层 SCSI 驱动程序名称(即 sd、sr、st 或 sg)。“h”后面的数字是主机编号,而“-”后面的数字用于主机识别目的。对于 PCI 适配器,这似乎始终为 0,而对于 ISA 适配器,它是它们的 IO 地址。[也许该字段可以提供更多信息或删除。]“c”、“i”和“l”后面的数字分别是通道(总线)、目标 id 和 lun 值。

scsidev通常会作为启动序列的一部分运行。在 SCSI 配置更改后运行它也可能很有用(例如,添加或删除较低级别的驱动程序模块,或使用 add/remove-single-device 命令)。在我的系统(包含 2 个磁盘、一个 CD 读取器和写入器以及一个扫描仪)上运行scsidev后 , /dev/scsi目录中添加了以下名称:

$ ls -l /dev/scsi/ # 总计
0 
brw-------- 8, 0 Sep 2 11:56 sdh0-0c0i0l0 
brw-------- 8, 1 Sep 2 11:56 sdh0- 0c0i0l0p1 
... 
brw------- 9月2日8日11:56 sdh0-0c0i0l0p8 
brw------- 9月2日8日16日11:56 sdh0-0c0i1l0 
brw-------- 9月2日8日17日11:56 sdh0-0c0i1l0p1 
... 
brw------- 2月2日8日24日11:56 sdh0-0c0i1l0p8 
crw------- 9月2日21日0 11:56 sgh0 -0c0i0l0 
crw------- 21, 9月2日11:56 sgh0-0c0i1l0 
crw------- 21, 9月2日2日11:56 sgh1-0c0i2l0 
crw------- 21, 9月2日3日11:56 sgh1-0c0i5l0 
crw-------- 9月2日21日4日11:56 sgh1-0c0i6l0 
br-------- 9月2日11日0 11:56 srh1-0c0i2l0
br-------- 11, 9 月 2 日 11:56 srh1-0c0i6l0

SCSI 通用设备名称 (sg) 与其受其他上层驱动程序(即 sd、sr 或 st)控制时的相应名称之间的映射可以通过在忽略第二个字母时查找名称匹配来查看。因此,“sdh0-0c0i0l0”和“sgh0-0c0i0l0”指的是同一设备。通过排除过程,“sgh1-0c0i5l0”文件名是扫描仪,因为该类设备只能通过 sg 接口访问。

scsidev 软件包还包括通过操作 /etc/scsi.alias配置文件来引入/dev/scsi/scanner 等名称的功能 。该软件包还包括有用的rescan-scsi-bus.sh实用程序。

[ 1 ] SCSI 标准允许单个总线上存在多个启动器。尽管有一些补丁可以改善这种情况,但 Linux 中并没有很好地支持这一点。

[ 2 ] 如果 15 个分区太有限,则可以考虑逻辑卷管理器 (LVM)。请参阅/usr/src/linux/Documentation/LVM-HOWTO 。LVM 还允许逻辑分区跨越多个块设备。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值