SCSI系列九:SCSI上层驱动程序

目录

  1. 磁盘驱动器(SD)

SD启动参数
SD模块参数

  1. CDROM 驱动程序(sr 或 scd)

SR启动参数
模块参数
SR过程接口
ATAPI 光盘

  1. 磁带驱动器(st)

st启动参数
st模块参数
ST过程接口
OnStream 设备的 osst 驱动程序

4.通用驱动程序 (SG)

sg启动参数
SG模块参数
SG过程接口

上层驱动程序为它们所代表的设备的逻辑类(例如磁盘)维护操作系统接口的内核端。它们还负责管理某些内核和 SCSI 子系统资源,例如内核内存和 SCSI 命令结构。用户空间中的应用程序通过打开通常在/dev 目录树中找到的特殊文件(块或字符)来访问这些驱动程序。

磁盘驱动器(SD)

可通过 sd 驱动程序访问两种类型的 SCSI 设备:

“direct acces”设备通常是磁盘。[SCSI外围设备代码为0]

“Optical memory devices”通常称为 MOD 磁盘。[SCSI外围设备代码为7]

sd 驱动程序是一个块设备,这意味着它与块子系统紧密相关。它还支持分区的概念。[ man sd 的日期可以追溯到 1992 年。]

当 sd 驱动程序在内核启动时或稍后作为模块加载时,它能够识别 128 个磁盘。然而,一旦加载,它就只能识别固定数量的附加磁盘。可容纳的额外磁盘数量由内核配置参数 CONFIG_SD_EXTRA_DEVS 设置,默认值为 40。

SD启动参数

没有任何。

SD模块参数

sd 驱动程序作为模块加载时不带任何参数。请注意,其模块名称是sd_mod.o。

CDROM 驱动程序(sr 或 scd)

CDROM 和 DVD 驱动器(以及 WORM 设备)可通过 sr 上层设备驱动程序访问。“sr”是设备驱动程序名称,“sr_mod”是其模块名称。设备文件名是/dev/sr或 /dev/scd。

下图展示了 sr 所属的 CDROM 子系统:
CD-ROM 子系统的体系结构

该图掩盖了协议栈之间的一些差异。CDROM 设备名称不是由统一的 CDROM 层维护的,而是由每个单独的协议栈维护的。对于SCSI 子系统,设备名称由sr 驱动程序维护,而IDE 子系统使用其中央“ide”驱动程序(即不是由ide-cd 驱动程序)维护设备名称。USB 和 IEEE1394 CD 设备名称由各自的堆栈维护。这可以部分解释为什么/dev/cdrom通常是指向相应子系统设备名称的符号链接。

可通过 sr 驱动程序访问两种类型的 SCSI 设备:

CD-ROM设备(包括DVD播放器)[SCSI外围设备代码为5]

“一次写入多次读取”设备被称为 WORM。[SCSI外围设备代码为4]

当 sr 驱动程序在内核引导时或稍后作为模块加载时,它能够识别 256 个 CDROM/DVD 驱动器。然而,一旦加载,它就只能识别固定数量的附加驱动器。可容纳的附加驱动器数量由内核配置参数 CONFIG_SR_EXTRA_DEVS 设置,默认值为 2。

人们经常使用dd命令来读取包含iso9660文件系统的数据CDROM。如果未给出计数参数,则dd命令将读取 SCSI 读取容量命令指示的 2048 字节扇区数。不幸的是,这可能包括映像末尾未写入(或“用完”)的扇区,从而导致 I/O 错误。使用isosize命令(参见其手册页)查找 iso9660 映像的真实长度,并将其用在 dd 命令的“count=”参数中。

SR启动参数

没有任何。

SR模块参数

进行测试以确定 cdrom 驱动器是否支持 XA 模式(模式 2)会触发某些驱动器上的固件错误。因此,默认情况下会关闭对 XA 模式支持的检查。提供以下模块参数:

    xa_test=<0|1>

覆盖默认值。【目前好像没有办法在sr驱动内置到内核的情况下开启XA模式测试。】

SR过程接口

以下所有文件均可被所有人读取并在读取时生成 ASCII 输出:

 /proc/sys/dev/cdrom/autoclose
 /proc/sys/dev/cdrom/autoeject
 /proc/sys/dev/cdrom/check_media
 /proc/sys/dev/cdrom/debug
 /proc/sys/dev/cdrom/info
 /proc/sys/dev/cdrom/lock

它们反映了 CDROM 子系统的当前状态。此位置是 procfs 窗口到 sysctl 配置机制的一部分(请参阅man sysctl)。除了 信息之外的所有内容都可由超级用户写入。信息中系统中的每个 CDROM 和 DVD 播放器(不仅仅是 SCSI 设备) 都有一列 。

例如,超级用户可以使用命令echo “1” > /proc/sys/dev/cdrom/autoeject打开自动弹出功能。这将导致卸载时 CDROM 从驱动器中弹出。

ATAPI 光盘

许多 Linux 用户的系统中没有 SCSI 设备(或适配器)。他们对为什么 cd 刻录软件(例如 cdrecord和cdrdao)和 cd 音乐读取程序(例如cdparanoia)使用 Linux SCSI 子系统感到有点困惑。答案是这些程序需要对这些设备进行较低级别的访问。ATAPI(ATA 数据包接口)本质上是通过 ATA [ 10 ]传输发送的 SCSI 命令集 。[本节中的讨论也适用于 ATAPI 磁带驱动器和 ATAPI 软盘驱动器。]

目前,cdrecord和cdparanoia都 与 SCSI 通用驱动程序 (sg) 接口,并且对于 ATAPI cd 设备,使用 ide-scsi 伪设备驱动程序来访问硬件。将来这可能会改变,因为在 2.4 系列内核中,数据包接口 ioctl 已添加到统一的 cdrom 层(请参见上面“ CDROM 驱动程序(sr 或 scd)”部分中的图表)。 [ 11 ]

Linux 中 IDE 子系统的默认操作是为其内置驱动程序声明所有 ATA 设备。对于 ATAPI cd 刻录机,它将由内置 ide-cd 驱动程序声明。一旦发生这种情况,SCSI 子系统就无法控制 ATAPI 设备。ide-scsi(伪低级 SCSI)驱动程序只能在 SCSI 子系统中注册IDE 子系统尚未声明的 ATAPI设备。

请注意上一段中的内置限定条件。如果 ide-cd 和 ide-scsi 驱动程序都是模块,则加载的第一个驱动程序将声明 ATAPI cd 设备(例如 cd/dvd 读取器和写入器)。此外,您可以通过rmmod -ing 一个和modprobe -ing 另一个 来切换控制驱动程序模块 。

也许最灵活的方法来指示 IDE 核心驱动程序您希望/dev/hdd 上的 cd writer可以访问 cdrecord是使用内核引导选项:“hdd=ide-scsi”。这将导致 ide-cd 驱动程序绕过 /dev/hdd(无论 ide-cd 驱动程序是内置的还是模块)。只要 ide-scsi 驱动程序是内置的或模块,它就会“捕获”位于/dev/hdd的 cd 写入器(如果需要,IDE 核心驱动程序会加载 ide-scsi 模块)。

可以使用以下语法指示 ide-cd 驱动程序模块忽略某些 ATA 设备:

modprobe ide-cd ignore='hdc hdd'

在这种情况下,ide-cd 驱动程序将忽略/dev/hdc和/dev/hdd 处的设备 。这种效果也可以通过在/etc/modules.conf文件中放置这样一行来实现:“options ide-cdignore=hdd” 。

lk 2.4 系列中添加的新选项的形式为“hdd=scsi”。该选项似乎与上面讨论的“hdd=ide-scsi”选项具有类似的功能。此外,只有当 SCSI 中级驱动程序和 ide-scsi 驱动程序均内置于内核中时,才能使用“hdd=scsi”(否则 ide_setup 函数会报告“BAD OPTION”)。

要查明 ATAPI cd 设备是否由 SCSI 子系统“拥有”,可以检查cat /proc/scsi/scsi 的输出。另一种技术是观察 cat /proc/sys/dev/cdrom/info的“drive name:”行中的“sr”条目。以下输出来自我的系统:

$ cat /proc/sys/dev/cdrom/info 
CD-ROM information, Id: cdrom.c 3.12 2000/10/18

drive name:             sr1     sr0
drive speed:            16      0
drive # of slots:       1       1
Can close tray:         1       1
Can open tray:          1       1
Can lock tray:          1       1
Can change speed:       1       1
Can select disk:        0       0
Can read multisession:  1       1
Can read MCN:           1       1
Reports media changed:  1       1
Can play audio:         1       1
Can write CD-R:         1       0
Can write CD-RW:        1       0
Can read DVD:           0       1
Can write DVD-R:        0       0
Can write DVD-RAM:      0       0

一旦 /dev/hdd 处的 ATAPI cd 写入器已被 SCSI 子系统注册,则应通过“scd”设备名称安装 cdrom,并且 CD 播放器也应使用“scd”设备。奇怪的是, hdparm命令仍应使用 /dev/hdd设备文件(或本节中描述的“echo … > /proc/ide/hdd/settings”方法)。 [ 12 ]

磁带驱动器(st)

磁带驱动程序接口记录在文件 /usr/src/linux/drivers/scsi/README.st和 st(4) 手册页(键入man st)中。文件 README.st还记录了驱动程序的不同参数和选项以及驱动程序中使用的基本机制。

通常通过mt 命令访问磁带驱动程序(请参阅man mt)。mtx是一个用于控制磁带自动加载器的关联程序(请参阅mtx.sourceforge.net)。

st 驱动程序检测那些外围设备类型为“顺序访问”(代码号 1)的 SCSI 设备,除非它们出现在驱动程序的“reject_list”上。[目前,OnStream 磁带驱动器(在下一节中描述)是此拒绝列表中的唯一条目。]

st 驱动程序能够识别 32 个磁带驱动器。每个磁带机有 8 个设备文件名:4 种模式(编号 0 到 3)各有一个倒带和非倒带变体。请参阅有关设备名称的“设备名称”部分中的磁带设备文件名示例。加载 st 驱动程序后,可以添加任意数量的磁带驱动器(总体限制为 32 个)。

在 ide-scsi 伪适配器驱动程序的帮助下,该驱动程序可以控制 ATAPI 磁带驱动器。“ATAPI cdrom”一节中的讨论 也适用于 ATAPI 磁带驱动器(和 ATAPI 软盘)。

st启动参数
st=xxx[,yyy] where xxx is one of the following:
buffer_kbs:<n>
write_threshold_kbs:<n>
max_buffers:<n>
max_sg_segs:<n>

(旧的引导参数 st=aa[,bb[,cc[,dd]]] 支持但已弃用)
默认驱动程序缓冲区大小 (buffer_kbs) 为 32(即 32 KB)。默认异步写入阈值(write_threshold_kbs)为30(即30 KB)。初始化时分配的默认缓冲区数量 (max_buffers) 为 4。要使用的分散/聚集段的默认数量 (max_sg_segs) 为 32。

st模块参数
buffer_kbs=<n>
write_threshold_kbs=<n>
max_buffers=<n>
max_sg_segs=<n>
ST过程接口

没有任何。

OnStream 设备的 osst 驱动程序

OnStream 制造的磁带机有一个辅助磁带驱动程序。它是一个附加的上层驱动程序,可以与 st 驱动程序共存。其驱动程序名称为“osst”(与其模块名称相同)。

OnStream SC-x0 SCSI 磁带驱动器无法由标准 st 驱动程序驱动,而是需要此特殊的 osst 驱动程序并使用 /dev/osst字符设备节点(主要为 206)。[其中 遵循与“设备名称”部分中概述的 st 设备相同的命名方案。]通过 usb-storage 和 ide-scsi,您也可以驱动 USB-x0 和 DI-x0 驱动器。请注意,还有第二代 OnStream 磁带驱动器 (ADR-x0),它支持磁带的标准 SCSI-2 命令 (QIC-157),并且可以由标准驱动程序 st 驱动。有关更多信息,您可以查看内核源文件/usr/src/linux/drivers/scsi/README.osst。有关 OnStream 驱动程序的更多信息可以在linux1.onstream.nl/test/上找到 。

通用驱动程序 (SG)

所有类型的 SCSI 设备都可以通过 sg 驱动程序访问。这意味着 CDROM 驱动器等设备可以通过 sr 和 sg 驱动程序访问。其他 SCSI 设备(例如扫描仪)只能通过 sg 驱动程序访问。sg 驱动程序能够识别 256 个 SCSI 设备。加载 sg 驱动程序后,可以添加任意数量的设备(总体限制最多为 256 个)。

请参阅参考W4以获取 SCSI 通用 (sg) 驱动程序文档(还可以找到 sg_utils 包)。有关 SCSI 标准,请参阅参考文献W1,有关 SCSI 编程和直通机制主题的书籍,请参阅参考文献B3。

lk 2.4 中的 sg 驱动程序是“版本 3”,它添加了额外的接口结构和一些新的 ioctl()。最有趣的新 ioctl() 是 SG_IO,它发送 SCSI 命令并等待其响应。 有关 sg 驱动程序的完整说明,请参阅 Linux 文档项目站点: www.tldp.org/HOWTO/SCSI-Generic-HOWTO/ 。本文档的(可能稍后)版本可以在www.torque.net/sg/p/sg_v3_ho.html中找到 。

内核中使用的缩写“sg”既指 SCSI 通用驱动程序,也指许多现代 IO 设备(通常与 DMA 相关)提供的分散-聚集功能。上下文通常可以清楚地表明所指的是哪一个。作为示例,请注意名为 SG_GET_SG_TABLESIZE 的扭曲 sg ioctl(),其中第二个“SG”指分散聚集。

sg 的公共接口可在文件 /usr/src/linux/include/scsi/sg.h中找到。根据发行版的不同,它可能包含也可能不包含与 /usr/include/scsi/sg.h相同的信息,后者由 GNU 库维护者控制。如果这两个文件不相同,则使用前一个头文件。那些基于 sg 编写应用程序的人应该查看其文档以了解有关此问题的更多信息。

sg 驱动程序注册所有可见的 SCSI 设备(当前最多为 256 个)。每个新注册的 SCSI 设备都会分配下一个可用的次设备号。至少最初,这将与中级的 cat /proc/scsi/scsi中显示的设备顺序相同。可以使用cat /proc/scsi/sg/devices或 cat /proc/scsi/sg/device_strs查看 sg devices 设备映射。当删除低级驱动程序时,cat /proc/scsi/scsi和 sg 顺序之间的差异 将会出现(例如rmmod aha1542)或使用remove-single-device删除设备时。sg 驱动程序将使剩余的 SCSI 设备映射到次要设备号保持不变。这可能会在 sg 映射中留下一个“漏洞”。示例如下

$ cat /proc/scsi/scsi 
Attached devices: 
Host: scsi0 Channel: 00 Id: 00 Lun: 00
  Vendor: IBM      Model: DNES-309170W     Rev: SA30
  Type:   Direct-Access            ANSI SCSI revision: 03
Host: scsi1 Channel: 00 Id: 02 Lun: 00
  Vendor: PIONEER  Model: DVD-ROM DVD-303  Rev: 1.10
  Type:   CD-ROM                   ANSI SCSI revision: 02
Host: scsi1 Channel: 00 Id: 06 Lun: 00
  Vendor: YAMAHA   Model: CRW4416S         Rev: 1.0g
  Type:   CD-ROM                   ANSI SCSI revision: 02

$ cat /proc/scsi/sg/device_strs 
IBM             DNES-309170W            SA30
PIONEER         DVD-ROM DVD-303         1.10
YAMAHA          CRW4416S                1.0g

$ echo "scsi remove-single-device 1 0 2 0" > /proc/scsi/scsi

$ cat /proc/scsi/scsi 
Attached devices: 
Host: scsi0 Channel: 00 Id: 00 Lun: 00
  Vendor: IBM      Model: DNES-309170W     Rev: SA30
  Type:   Direct-Access            ANSI SCSI revision: 03
Host: scsi1 Channel: 00 Id: 06 Lun: 00
  Vendor: YAMAHA   Model: CRW4416S         Rev: 1.0g
  Type:   CD-ROM                   ANSI SCSI revision: 02

$ cat /proc/scsi/sg/device_strs 
IBM             DNES-309170W            SA30
<no active device>
YAMAHA          CRW4416S                1.0g

请注意 sg 驱动程序如何在“device_strs”输出中维护剩余设备的行位置。因此,当删除 Pioneer DVD 播放器时,sg 设备映射中会出现一个漏洞,该漏洞不会反映在cat /proc/scsi/scsi 输出中。该对应于设备名称 /dev/sg1。

新的 sg_io_hdr 接口包括一个称为“resid”的数据传输剩余计数字段。只有一些较低级别的适配器支持此功能,而那些在该字段中并不总是产生零的适配器。在撰写本文时,advansys、aha152x 和 sym53c8xx 驱动程序支持此功能。

sg启动参数

sg 驱动程序为每个打开的文件描述符维护一个保留的缓冲区。目的是保证应用程序传输的数据达到保留缓冲区的大小,不会因为内核内存不足而失败。这对于像 cdrecord 这样无法轻松从 ENOMEM 错误中恢复(CDR)的应用程序非常重要。

如果缺少引导参数“sg_def_reserved_size”或 sg 模块参数“def_reserved_size”,则每次打开 sg 文件描述符时,保留缓冲区大小都会从 include/linux/sg.h 中定义的 SG_DEF_RESERVED_SIZE继承。

SG_DEF_RESERVED_SIZE 定义值可以被此内核引导选项覆盖:

    sg_def_reserved_size=<n>
SG模块参数

以下所有文件均可被所有人读取并在读取时生成 ASCII 输出。文件“def_reserved_size”也可由 root 写入。ASCII 输出已被格式化为人类和机器可读的方式(因此是一种妥协)。使用cat device_hdrs devices 形式的 Unix 命令来查看表的输出。

/proc/scsi/sg/debug [sg 驱动程序的内部状态]
/proc/scsi/sg/def_reserved_size [如启动/模块加载参数]
/proc/scsi/sg/devices [数字设备数据表]
/proc/scsi/sg/device_hdr [sg/devices 的列标题]
/proc/scsi/sg/device_strs [来自 INQUIRY 的字符串表]
/proc/scsi/sg/hosts [数字主机数据表]
/proc/scsi/sg/host_hdr [sg/hosts 的列标题]
/proc/scsi/sg/host_strs [主机字符串 ID 表]
/proc/scsi/sg/version [sg 版本号和日期]

上述所有文件均归 root 所有并可供所有人读取,而 def_reserved_size可由 root 写入。对于 devices和device_strs文件,第一行输出对应于/dev/sg0 (sg 小设备号 0)。第二行输出对应于 /dev/sg1等。对于主机和host_strs 文件,第一行输出对应于主机(适配器编号)0 等。对于数字表,丢失的设备或主机由一行“-”指示1" 值。对于字符串表,丢失的设备或主机由包含“<no active device/host>”的行指示。

[ 10 ] ATA 是以前称为 IDE 和/或 EIDE 的现代名称。请注意,由于历史原因,Linux 中控制 ATA 设备的子系统被称为“IDE”子系统。

[ 11 ] 其他 ATA 设备(例如磁带和软盘)通常使用 ATAPI 接口。然而,绝大多数ATA磁盘并不使用ATAPI接口。

[ 12 ]在linux 2.4 内核系列中,当使用ide-scsi 驱动程序以便cdrecord可以控制ATAPI (IDE) cd 刻录机 时,问题有所增加。该问题可能与 IDE 子系统尝试优化其控制的设备上的数据传输速度的积极方式有关。一些遇到超时和机器锁定的人发现,通过hdparm 命令减少 DMA 设置可以解决该问题。如果 CD 写入器连接到 /dev/hdd,则用户已报告使用以下两个命令之一成功:


    hdparm -d0 -c1 /dev/hdd
    hdparm -d 1 -X 34 /dev/hdd

第一个完全关闭 DMA,而第二个将其设置为“多字 DMA 模式 2”。CD 刻录机不需要现代磁盘所使用的速度类型。即使以“x16”刻录也意味着持续传输速率为 150 KB/秒的 16 倍,大约为 2.4 MB/秒,实际上并没有那么快。还有一份报告称,将 CD 刻录机从高速 IDE 控制器(Promise)移回主板的低速 IDE 控制器可以解决随机 IDE 总线重置问题。另一份报告建议减少(或关闭)IDE 硬盘上的 DMA 也可以停止锁定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值