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 驱动程序访问
CD-ROM 设备(包括 DVD 播放器)[SCSI 外围设备代码为 5]
“一次写入多次读取” 设备,称为 WORM。[SCSI 外围设备代码为 4]
sr 驱动程序能够在内核启动时或稍后作为模块加载时识别 256 个 CDROM/DVD 驱动器。但是,一旦加载,它将仅识别固定数量的额外驱动器。可以容纳的额外驱动器的数量由内核配置参数 CONFIG_SR_EXTRA_DEVS 设置,其默认值为 2。
人们经常使用 dd 命令读取包含 iso9660 文件系统的数据 CDROM。如果未给出 count 参数,则 dd 命令将读取 SCSI 读取容量命令指示的 2048 字节扇区数。不幸的是,这可能包括映像末尾未写入(或 “耗尽”)的扇区,这些扇区可能会导致 I/O 错误。使用 isosize 命令(参见其手册页)查找 iso9660 映像的真实长度,并在提供给 dd 命令的 “count=” 参数中使用它。
进行测试以找出 cdrom 驱动器是否支持 XA 模式(模式 2)会触发某些驱动器上的固件错误。因此,默认情况下关闭了 XA 模式支持检查。提供以下模块参数
xa_test=<0|1> |
以下所有文件都可由所有人读取,并在读取时生成 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 |
例如,可以使用命令 echo "1" > /proc/sys/dev/cdrom/autoeject 以超级用户身份打开自动弹出功能。这将导致 cdrom 在卸载时从驱动器中弹出。
许多 Linux 用户的系统中没有 SCSI 设备(或适配器)。他们有点困惑,为什么 cd 刻录软件(例如 cdrecord 和 cdrdao)和 cd 音乐读取程序(例如 cdparanoia)使用 Linux SCSI 子系统。答案是这些程序需要对这些设备进行更底层的访问。ATAPI(ATA 数据包接口)本质上是通过 ATA [1] 传输发送的 SCSI 命令集。[本节中的讨论也适用于 ATAPI 磁带驱动器和 ATAPI 软盘驱动器。]
目前,cdrecord 和 cdparanoia 都与 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' |
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,则用户报告以下两个命令之一成功
|