6. 常见问题解答

6.1. 非 root 用户如何挂载和卸载光盘?

大多数mount命令支持 user 选项。如果您在/etc/fstab:

/dev/sbpcd  /mnt/cdrom   iso9660     user,noauto,ro

中添加如下条目,则普通用户将被允许使用以下命令挂载和卸载驱动器

% mount /mnt/cdrom
% umount /mnt/cdrom

默认情况下,光盘将以一些有助于加强安全性的选项挂载(例如,程序无法执行,设备文件被忽略)。如果这过于限制,您可以使用其他选项(例如,“exec”选项将启用程序执行)。有关详细信息,请参阅 mount(8) 手册页。

另一种方法是获取usermount软件包,该软件包允许非 root 用户挂载和卸载可移动设备(如软盘和 CD-ROM),但限制访问其他设备(如硬盘分区)。它在主要的存档站点上可用。

还有一种选择是使用sudo程序,该程序允许用户以 root 权限运行选定的程序。

6.2. 为什么卸载 CD-ROM 时会出现设备繁忙?

如果任何进程正在访问驱动器,包括将其默认目录设置为已挂载的文件系统,则无法卸载光盘。如果您无法识别正在使用光盘的进程,则可以使用fuser命令,如下例所示。

% umount /cdrom
umount: /dev/hdd: device is busy
% fuser -v /cdrom
                     USER       PID ACCESS COMMAND
/mnt/cdrom           tranter    133 ..c..  bash

在某些系统上,您可能需要以 root 身份运行fuser命令才能查看其他用户的进程。

6.3. 如何通过 NFS 将 CD-ROM 导出到其他主机?

您需要向/etc/exports文件添加一个条目。然后,其他机器上的用户将能够挂载该设备。有关详细信息,请参阅exports(5)手册页。

6.4. 我可以从 CD-ROM 启动 Linux 吗?

大多数 Linux 发行版都支持直接从 CD 启动 Linux 内核,作为启动软盘的替代方案。这需要可启动 CD 以及支持从 CD 启动的 ROM BIOS 和 CD-ROM 驱动器。

最新版本的mkisofs支持使用 El Torito 可启动 CD 标准创建此类光盘。

6.5. 如何从音频 CD 读取数字数据?

Heiko Eissfeldt (heiko@colossus.escape.de) 和 Olaf Kindel 编写了一个实用程序,可以读取音频数据并将其保存为.wav格式的声音文件。该软件包名为cdda2wav.tar.gz,可以在www.ibiblio.org.

上找到。另一个提取数字音频的实用程序是cdparanoia,可从 http://www.xiph.org/paranoia 获取。

由于 CD-ROM 驱动器变化非常快,因此很难列出哪些型号支持读取数字数据。最好的办法是获取最新的cdda2wavcdparanoia软件包并阅读文档。

有关此主题的更多信息,请参阅网站 http://www.tardis.ed.ac.uk/~psyche/cdda/ 和参考文献部分中列出的 alt.cd-rom FAQ。

6.6. 为什么 find 命令无法正常工作?

在没有 Rock Ridge 扩展的 ISO-9660 格式光盘上,您需要向-noleaf命令添加find选项。有关详细信息,请参阅 find(1) 手册页。

(根据我的经验,几乎所有最新的 Linux CD 都使用 Rock Ridge 扩展,因此这个问题应该很少发生。)

6.7. Linux 是否支持任何可刻录 CD-ROM 驱动器?

Linux 支持大多数 CD-R 和 CD-RW 驱动器。cdrecord 和 mkisofs 工具可用于刻录 CD,还有许多这些工具的图形前端。有关更多信息,请参阅 Linux CD 写入 HOWTO

6.8. 为什么挂载 CD-ROM 时会出现 mount: Read-only file system 错误?

CD-ROM 是只读介质。在一些早期的内核中,您可以以读/写方式挂载 CD-ROM;尝试将数据写入 CD 将被简单地忽略。从内核版本 1.1.33 开始,这已被纠正,因此 CD-ROM 必须以只读方式挂载(例如,使用 mount 的 -r 选项)。

6.9. 为什么当我关闭系统时光盘托盘会打开?

sbpcd 驱动程序支持在卸载 CD 时自动弹出 CD。在一些较旧的内核版本中,这是默认行为。如果您关闭系统,已挂载的 CD 将被卸载,导致其弹出。

此功能是为了方便更换光盘。如果在您挂载或读取 CD 时托盘是打开的,它也会自动关闭。

我发现这给一些程序(例如 cdplay 和 workbone)带来了问题。从 1.1.60 内核开始,您可以在软件控制下控制此功能。sbpcd 文档文件中包含了一个示例程序(或使用 eject 程序)。您还可以通过编辑内核源文件来控制默认行为sbpcd.h.

6.10. 我有一个无法挂载的“特殊”CD

如果您有特定光盘无法挂载,以下是一些可能的原因

  1. 它是 XA、CD-R 或 CD-RW 光盘,并且您的驱动器或 Linux 驱动程序不支持读取这些光盘(这仅适用于非常旧的驱动器)。

  2. 它是 DVD 光盘,只能由 DVD-ROM 驱动器读取。

  3. 光盘未使用 ISO-9660 文件系统(例如,某些光盘使用 SunOS 或 HFS)。

  4. 它是音频 CD。

  5. CD 已损坏或有缺陷。

  6. 您将其倒置放入驱动器中 :-)

6.11. 多碟 CD-ROM 驱动器是否适用于 Linux?

一些用户报告了 SCSI 多碟 CD-ROM 换碟机的成功使用。您可能需要启用“Probe all LUNs on each SCSI device”内核配置选项(如果您的 CD 换碟机已被 SCSI 驱动程序识别,则不需要这样做。请查看/usr/src/linux/drivers/scsi.c).

至少有一位用户还必须增加内核驱动程序中的 SCSI 超时值。其症状是尝试首次挂载 CD 时出现类似“wrong fs type, bad option, bad superblock on /dev/sr5, or too many mounted file systems”的错误消息,但在之后立即进行的第二次挂载会成功。要增加超时,请增加/usr/src/linux/drivers/scsi/sr_ioctl.c开头处的 IOCTL_TIMEOUT 值,并重新编译内核。据报告,使用 NEC Multispin 4Xc 时,将值设置为 10000 而不是默认值 3000 可以工作。

可能需要创建额外的块特殊文件,以便可以访问所有 LUN。每个 LUN 都需要一个设备文件。因此,对于 7 碟换碟机,需要/dev/sr0/dev/sr6(如果您有其他 SCSI CD-ROM 驱动器,则需要更多)。要创建块特殊文件,请以 root 身份执行mknod /dev/sr? b 11 ?,其中 ? 是所需的数字。

据报告,Nakamichi MBR-7 7 碟换碟机、NEC Multispin 4Xc 和 Pioneer 12 碟换碟机可以工作。

EIDE/ATAPI 多碟换碟机也可用。内核使用 CDROM_SELECT_DISC ioctl 函数支持一些驱动器。IDE-CD 内核驱动程序文档文件包含用于选择换碟槽的程序的源代码,或者您可以使用各种实用程序,例如eject程序(如前所述)。

6.12. 我收到 "/cdrom: Permission denied" 错误

某些 CD 的根目录文件权限仅允许用户root读取它们。这是 CD-ROM 供应商的错误,并且确实很不方便。更常见的情况是某些文件或目录不可全局读取。有些人修补了他们的内核以解决此问题。

另请参阅本文档后面关于隐藏文件的相关问题。

6.13. 如何解释 IDE CD 内核错误消息?

当我收到来自 IDE CD-ROM 驱动程序的内核消息,例如 "hdxx: code: xx key: x asc: xx ascq: x" 时,它是什么意思?

这是来自 IDE CD-ROM 驱动器的状态/错误消息。默认情况下,IDECD 驱动程序会打印原始信息,而不是浪费内核空间来显示错误消息。您可以通过进入/usr/src/linux/drivers/block/ide-cd.c,将 VERBOSE_IDE_CD_ERRORS 的值更改为 1,并重新编译内核,来更改默认设置以显示实际的错误消息。

6.14. 如何判断我的 CD-ROM 速度是多少?

这是一种方法。此命令测量从 CD 读取 1500K 数据需要多长时间

% time -p dd if=/dev/cdrom of=/dev/null bs=1k count=1500
1500+0 records in
1500+0 records out
real 5.24
user 0.03
sys 5.07

单速驱动器的传输速率为每秒 150 千字节,应该大约需要 10 秒。双倍速需要 5 秒,四倍速需要 2.5 秒,依此类推。

上面的“实际”时间可能是最好的参考数字——在本例中,它表示一个双倍速驱动器。您可以增加传输的数据量以获得更准确的值(数据不会被缓存)。您可能应该多次运行该命令并取平均值。

我还编写了一个小型 C 程序,用于测量和报告 CD-ROM 数据传输速率;我可以根据您的要求将其发送给您。

6.15. 安装 Linux 后,我的 CD-ROM 停止工作了

通常的症状是,最初用于安装 Linux 的启动盘识别了您的 CD-ROM 驱动器,但在硬盘或软盘上安装 Linux 并重新启动后,它不再识别 CD-ROM。

此问题最常见的原因是,在某些 Linux 发行版中,安装在硬盘(或软盘)上的内核不一定与启动盘上的内核相同。您选择了与您的 CD-ROM 硬件匹配的启动盘,而您安装的内核是一个“通用”内核,缺少 CD-ROM 支持。您可以通过遵循本文档前面讨论的故障排除指南来验证这一点(例如,首先检查/proc/devices).

解决方案是重新编译内核,确保包含您的 CD-ROM 驱动器以及任何其他需要的驱动程序(例如 SCSI 控制器、ISO-9660 文件系统)。如果您不知道如何执行此操作,请参阅 内核 HOWTO

如果您向启动盘传递了任何命令行选项(例如 “hdc=cdrom”),则需要将这些选项添加到您的启动程序配置文件(通常是 /etc/lilo.conf)。

6.16. CD 上有“隐藏”文件,我无法读取

某些 CD 上的文件设置了“隐藏”位。通常,这些文件是不可见的。如果您使用 “unhide” 选项挂载 CD,则应该可以访问这些文件(这似乎在任何地方都没有文档记录)。

6.17. CD-ROM API 的文档在哪里?

如果您想编写自己的应用程序,例如音频 CD 播放器程序,您将需要了解 Linux 提供的应用程序编程接口 (API)。

最初,CD-ROM 内核驱动程序使用自己的 ioctl() 函数来支持特定于每个驱动器的功能。诸如/usr/include/linux/sbpcd.h之类的头文件描述了这些函数。由于许多驱动程序都基于其他驱动程序,因此接口虽然不完全相同,但有很多共同之处。

最近,David van Leeuwen (david@tm.tno.nl) 领导了一项倡议,旨在标准化 CD-ROM 驱动器的 API,将公共代码放在一个位置,并确保所有驱动程序都表现出相同的行为。这在文件/usr/src/linux/Documentation/cdrom/cdrom-standard.tex中进行了文档记录。一些内核驱动程序支持这一点。从 2.0 内核开始,所有 CD-ROM 驱动程序都符合此 API。

我的书《Linux 多媒体指南》详细介绍了如何编程 CD-ROM 驱动器,特别是音频功能。请参阅参考文献部分的末尾。

6.18. 为什么我在这张 Windows CD-ROM 上看不到长文件名?

如果您有一张 CD-ROM 在 Windows 下具有长文件名,但在 Linux 下没有,则它可能使用 Microsoft 的专有 Joliet 文件系统格式化。有关解决方案,请参阅下一个问题。

6.19. Microsoft 的 Joliet 文件系统是否受支持?

Microsoft 创建了 ISO CD-ROM 格式的扩展,称为 Joliet。它允许使用 16 位 UNICODE 格式编码的长文件名。

从 2.0.34 版本开始,Linux 内核支持 Microsoft Joliet 文件系统扩展。您需要在内核中启用对其的支持。

如果您想在屏幕上正确显示来自 Joliet CD-ROM 的带有本地语言字符的文件名,则需要在内核中启用对相应 NLS ISO8859 字符集的支持。

6.20. Linux 是否支持“增强型” CD?

一些音频 CD 是“增强型”的,带有额外的数据。通常,您会发现这些 CD 既有通常的音频 CD 音轨,也有一个可以挂载为 ISO-9660 文件系统的数据音轨。

我检查过的一张增强型 CD 上有 Microsoft Windows 和 Apple Macintosh 应用程序(当然,这些应用程序无法直接在 Linux 下运行,尽管我在 WINE Windows 模拟器下运行 Windows 应用程序取得了一些部分成功)。有一些 GIF 图像可以使用标准查看器(如xv)查看,还有一些 Apple QuickTime 格式的动画可以使用xanim程序查看。它是一张多会话光盘,一些非常旧的 CD-ROM 驱动器不支持读取。光盘上有一个readme.txt文件,其中包含增强型 CD FAQ。

6.21. Linux 是否支持 DVD-ROM?

SCSI 和 ATAPI 兼容的 DVD-ROM 驱动器应该可以在 Linux 下工作,用于读取使用 ISO-9660 文件系统格式化的光盘。换句话说,它们将作为(可能很大的)CD-ROM 驱动器工作。

许多 DVD-ROM 光盘使用 UDF 文件系统。最近的内核具有 UDF 文件系统支持。

许多 Linux MPEG-2 DVD 播放器可用。有关更多信息,请参阅 DVD 播放 HOWTO

6.22. Linux 是否支持 CD-RW?

SCSI 和 ATAPI 兼容的 CD-RW 驱动器在 Linux 下可以用于使用 ISO-9660 或 UDF 文件系统格式化的光盘。这包括写入光盘的能力。cdrecord 等实用程序可用于擦除光盘。

6.23. 如何挂载多会话光盘?

您可以像挂载任何其他 CD-ROM 一样挂载多会话光盘。多会话支持的正常行为是,当您挂载光盘时,将看到最后一个会话。您将看不到多个分区。如果它不起作用,则可能是由于以下三个原因

  1. 您的 CD-ROM 驱动器不支持读取多会话 CD(这可能只发生在非常旧的驱动器上)。

  2. 您的 CD-ROM 类型的 Linux 内核驱动程序不支持多会话(主要只有一些旧的专有、非 IDE/ATAPI 和非 SCSI 驱动器属于此类)。

  3. 如果您要挂载的文件系统不是 ISO-9660 的 CD,则可能不支持多会话。

6.24. 如何读取 CD 卷标?

有一个名为volname的小实用程序,包含在最新版本的eject程序中。或者,您可以运行以下 shell 命令

dd if=/dev/cdrom bs=1 skip=32808 count=32 

假设 /dev/cdrom 是您的驱动器的设备文件名。

6.25. 我的 IDE CD-R 或 CD-RW 驱动器在 Linux 下无法工作

您需要对可写驱动器使用 IDE SCSI 仿真驱动程序。有关更多信息,请参阅 Linux CD 写入 HOWTO

6.26. 在此处插入您的品牌/型号 IDE CD-ROM 驱动器是否受支持?

是的,当然支持。Linux 支持所有现代 IDE CD-ROM 驱动器使用的 IDE 接口。自内核版本 1.1.85 以来一直如此。

6.27. 我似乎在内核源代码中找不到我的 IDE 驱动器的驱动程序?

与较旧的专有驱动器不同,没有针对每种 ATAPI/IDE CD-ROM 驱动器型号的特定驱动程序。所有符合标准的驱动器都应与标准 Linux 内核中包含的 ATAPI CD-ROM 驱动程序一起工作。

6.28. 我在使用 Red Hat 7.1 上的 CD-ROM 时遇到问题

您可能遇到了硬件不支持 DMA(直接内存访问)的问题。RedHat 发布了一个高度优化的 Linux 内核版本,该版本在选定的 IDE 控制器芯片组上启用了 DMA。有关此问题的更多信息,请访问 http://www.exocore.com/linux/rhl71dma/