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

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

以下是说明 CDROM 子系统(sr 是其一部分)的图表

CD-ROM 子系统的架构。

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

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

sr 驱动程序能够在内核启动时或稍后作为模块加载时识别 256 个 CDROM/DVD 驱动器。但是,一旦加载,它将仅识别固定数量的额外驱动器。可以容纳的额外驱动器的数量由内核配置参数 CONFIG_SR_EXTRA_DEVS 设置,其默认值为 2。

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

9.2.1. sr 启动参数

无。

9.2.2. sr 模块参数

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

    xa_test=<0|1>
以覆盖默认值。[目前,当 sr 驱动程序内置到内核中时,似乎没有办法打开 XA 模式测试。]

9.2.3. sr proc 接口

以下所有文件都可由所有人读取,并在读取时生成 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)。除了info之外,都可由超级用户写入。系统中每个 CDROM 和 DVD 播放器都有一列,位于info(不仅仅是 SCSI 设备)。

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

9.2.4. ATAPI cdrom

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

目前,cdrecordcdparanoia 都与 SCSI 通用驱动程序 (sg) 接口,并且在 ATAPI cd 设备的情况下,使用 ide-scsi 伪设备驱动程序来访问硬件。这在未来可能会改变,因为在 2.4 系列内核中,已向统一 cdrom 层添加了数据包接口 ioctl(请参见上面 第 9.2 节 中的图表)。[2]

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 刻录机可以被 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-cd ignore=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” 方法)。[3]

注释

[1]

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

[2]

其他 ATA 设备(如磁带和软盘)通常使用 ATAPI 接口。但是,绝大多数 ATA 磁盘使用 ATAPI 接口。

[3]

在 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” 刻录甚至意味着 16 倍 150 KB/秒的持续传输速率,大约为 2.4 MB/秒,并不是真的那么快。还有一份报告表明,将 cd 刻录机从高速 IDE 控制器 (Promise) 移回主板的低速 IDE 控制器已解决了一个随机 IDE 总线重置问题。另一份报告建议降低(或关闭)IDE 硬盘上的 DMA 也可以阻止锁死。