多数 mount 命令支援user选项. 假设你在 /etc/fstab 里加入了这样一行:
/dev/sbpcd /mnt/cdrom iso9660 user,noauto,ro
那麽普通使用者就可以像下面这样挂上或卸下这台机器的资料:
% mount /mnt/cdrom
% umount /mnt/cdrom
挂上程序将会加上一些额外选项以确保系统安全(例如: 程式不准执行, 片子上的设备档 将失效(不予理会)); 在有时候这限制当然严了点.
另一个办法就是抓 usermount, 它允许非 root 之使用者挂上/卸下可移除设备, 如软碟 及 CD-ROM 等, 但限制对其它设备的动作(如硬碟分割区). 它在主要的档案库都有.
在 ftp.cdrom.com 里有 mount.c 的原始码, 它允许一般使用者挂上/卸下 CD-ROM. 它必 须 setuid 後才能这麽做.
(译注 : setuid 是指, 将执行档执行时的权限变成和执行档所有人相同. 普通执行档执 行时, 权限是执行者的权限, 这样的话很多程式都不能跑(如: 你不能修改/etc/passwd, 所以不能变更密码.). 而如果setuid, 该档又是root所有, 这种执行档就有root权限了. (像passwd程式就是靠这个改密码的). 不过 setuid 反过来也可能是系统安全的主要漏 洞.)
如果有任何程序正在存取这机器, 包括它们的现行目录正在它上面, 那就不能卸下. 如果 你实在不晓得那个程序正在使用这片光碟, 你可以像下例一样的用 fuser 命令:
% umount /cdrom
umount: /dev/hdd: device is busy
% fuser -v /cdrom
/cdrom: USER PID ACCESS COMMAND
tranter 133 ..c.. bash
你需要在/etc/exports档中加入一个项目; 这样别的机器的使用者就可以挂上它了. 请看 exports(5) 这份说明页.
当安装 Linux 时最常用的方法是用软碟开机片, 有些 Linux 组件可以直接由 DOS 起动 光碟上的 Linux 核心.
Michael Fulbright (msf@redhat.com) 回报说若有正确的CD-ROM片子, ROM BIOS及 ATAPI CD-ROM机器, 从CD直接开机是可能的. 最新版的mkisofs也支援制作这种片子. 他也加入了一些修补, 以支援这种开机光碟的El Torito标准.
Heiko Eissfeldt( heiko@colossus.escape.de )和 Olaf Kindel 写了一个公用程式可以读取音讯资料, 并将它存成 .wav 格式的声音 档. 这个程式叫 cdda2wav.tar.gz, 可以在 sunsite.unc.edu 找到.
因为 CD-ROM 世代交替太快了, 很难列出哪些 CD-ROM 可读取数位音乐资料. 你最好的赌 注是抓最新版的 cdda2wav 套件, 并读它的文件.
若想要更进一步的资讯, 请上 http://www.tardis.ed.ac.uk/~psyche/pc/cdrom/CDDA.html 这个站台看看, 还有参阅 alt.cdrom FAQ 的 reference 那节.
在没有 Rock Ridge Extension 的 ISO-9660 光碟上, 你需要在 find 後加上 -noleaf 这选项. 请参考 find(1) 说明页.
(在我的经验中几乎所有 Linux CD-ROM 都用 Rock Ridge Extension, 这问题的发生率应 该极低.)
X-CD-Roast 套件(Linux 版)是使用 CD 烧录机的图形化前端介面. 此套件可在 sunsite.unc.edu 里的 /pub/Linux/utls/disk-management/xcdroast-0.95.tar.gz 找著.
也请参考 Linux CD-Writer mini-HOWTO 文件, 可在 ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO/mini/CD-Writer 或 http://sunsite.unc.edu/mdw/HOWTO/CD-Writer.html 处找到.
(译注 : 有位仁兄(不知道叫什麽名字)有写他对 CD-ROM 烧录机的心得, 在 http://mail.ncku.edu.tw/~thlx/, 可以参观.)
CD-ROM 是只能读取的媒体. 旧版的核心你能用可读写方法挂上 CD-ROM, 然後尝试写资料 进去并不会产生任何讯息. 在 1.1.83 版後, 这被修正为 CD-ROM 必须以唯读方式挂上( 就是说 mount 要有 -r 选项 ).
在 1.1.38 版核心, sbpcd 在卸下片子时会自动退片. 如果你下了关机指令, 那麽挂上的 CD 就会被卸下, 然後就退出来.
这样子在换片时很方便. 如果托盘打开状态下你挂上或读取CD, 那麽它也会自动进片.
我发现有时这功能会造成问题(如 cdplay 及 workbone). 在 1.1.60 版核心你可以用软 体决定要不要用这功能. 有个□例程式包含在 sbpcd 的文件里. (或者用 eject 程式).
这片``特殊''片子看来像是 XA 碟片(就像相片光碟或用 CD-R 烧的 ``一次写入'' (one-offs) 片子)多数 Linux 核心 CD-ROM 驱动程 式并不支援 XA 格式, 虽然你也许能在一些档案库找到一些修补.
sbpcd 驱动程式是支援 XA 的. 如果你用这驱动程式, 你可以依以下方法确定片子是不是 XA 的格式: 修改 sbpcd.c, 允许显示``主目录" (TOC)资讯(DBG_TOC). 然後 做新核心, 起动它, 则每次挂上时都会显示 TOC( 由主控台或记录档). 看第一个数字, 如果是 20, 那就是 XA 片子, 如果是 00, 那就是普通片子. 如果 TOC 显示不同的轨, 那也是 XA 片子的信号.
(感谢 Eberhard Moenkeberg 提供以上资讯)
其它的无法读取 CD 可能原因:
好几位使用者已报告 SCSI CD-ROM 多片机种运作顺利. 你也许要打开`` Probe all LUNs on each SCSI device'' 的核心选项. 至少有一位使用者发现 也要加大驱动程式中的 SCSI 超时等待值(timeout value). Nakamichi MBR-7 的七片装及先锋牌的 12 片装已确定能用.
EIDE/ATAPI 的多片机种也能使用. 2.0 版核心对一些机器使用 CDROMLOADFROMSLOT 这个 ioctl 函式做了初步支援. IDECD 驱动程式的文件档包含了一个原始码可做一般程式选 择换片槽的参考. 或者你也可以找最新版的 eject 程式.
有些 CD 有档案权限, 仅允许 root 读取它. 1995 年三月的 InfoMagic CD set 就是一 个好例子. 这真的是很不方便.
底下的修补, 由 Christoph Lameter( clameter@waterf.org) 好心提供, 用它修补核心, 解决这问题.
From: clameter@waterf.org (Christoph Lameter) Newsgroups: comp.os.linux.setup Subject: Infomagic Developers Set: Fix for CD-Rom permissions Date: 12 Apr 1995 20:32:03 -0700 Organization: The Water Fountain - Mining for streams of Living Water NNTP-Posting-Host: waterf.org X-Newsreader: TIN [version 1.2 PL2] The March 1995 Edition of the Infomagic Developers CD-ROM Set has problems because the information stored in the root directory permissions is causing the following problems with using the CDs (1995年三月版的InfoMagic Developers CD-ROM set有问题,因为它在根目录存取权限处 存的资讯造成以下使用CD的问题.) 1. Disc1 will always have the owner/group of 5101/51 and has write access allowed (?) (1. 第一片的拥有者/群组是5101/51,然後居然允许写入(?)) 2. Disc2 and 3 have rwx set for root and no rights at all for any other group/user. These discs cannot be accessed from any user other than root! I run a BBS and I need to make them accessible for download by others. (2. 第二,三片对root有rwx权力,而对其它人/群组什麽也不给. 这两片光碟除了 root外任何人均无法存取! 我正在跑BBS,需要让别人能下载它们!) I have seen several fixes to this problem already floating around. Trouble is that these fixes usually change the rights for ALL directories on the CD. This fix here changes ONLY the rights for the root directory of the CD-Rom. If you want to run parts of Linux directly off the CD you might run into trouble if all directories are readable for everyone and if they are all owned by root. (我已经看到这问题的几个解决之道了. 麻烦的是它们会影响光碟上所有目录的 存取权.我的修正只改了它的根目录存取权. 如果你想在光碟上跑东东,而所有目录 都可存取的话,会带来麻烦,因为他们是root所有.) This fix will set the rights for the root directory to r-xr-xr-x and the owner/group to the values indicated in the uid and gid options to the mount command. (这个修补会将根目录权限改成r-xr-xr-x,将所有人/群组改成mount那人的 uid及gid) To apply:(用法:) cd /usr/src/linux/fs/isofs patch <**THIS MESSAGE** and recompile kernel (you may have to fix up the patch by hand depending on your kernel version). (然後重编译核心(依你的核心版本,可能要手动修补.)) This fix should probably be incorporated into the kernel. What business does data on a CD have to mess around with the permissions/owners of the mount-point anyways? (这个修正也许已放进核心了. 到底是什麽事,非要存放让挂载点的权限/所有人资料 变一团糟呢?) --- inode.c.ORIG Wed Apr 12 17:24:36 1995 +++ inode.c Wed Apr 12 17:59:12 1995 @@ -552,7 +552,15 @@ these numbers in the inode structure. */ if (!high_sierra) - parse_rock_ridge_inode(raw_inode, inode); + { parse_rock_ridge_inode(raw_inode, inode); + /* check for access to the root directory rights/owner CL */ + if((inode->i_sb->u.isofs_sb.s_firstdatazone) == inode->i_ino) + { /* Change owner/rights to the ones demanded by the mount command */ + inode->i_uid = inode->i_sb->u.isofs_sb.s_uid; + inode->i_gid = inode->i_sb->u.isofs_sb.s_gid; + inode->i_mode = S_IRUGO | S_IXUGO | S_IFDIR; + } + } #ifdef DEBUG printk("Inode: %x extent: %x\n",inode->i_ino, inode->u.isofs_i.i_first_extent); @@ -805,4 +813,3 @@ } #endif -
注意以上的修补有些旧了, 可能无法完全乾净地修补最新的2.0版核心, 也请参考 本篇後面提到的隐藏档的相关问题.
核心送给我的 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, 并重编译核心.
有一个办法, 就是测试它要花多久读取 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
正常的单倍速 CD-ROM 每秒传送 150KB, 所以约要 10 秒钟. 二倍速约要 5 秒钟, 四倍
速的约 2.5 秒钟等等... real 时间也许是最好的值 -- 在上面情形指出它是二倍速机
器. 你可以增加资料量得出更准确的值. (如果你担心受快取影响的话.)你也许应该多测
几次, 求平均值.
最常见的症状是先用 Linux 安装时, Linux 承认你的 CD-ROM. 但装完後, 从软碟或硬碟 开机却又不能用它了.
最大的可能就是多数 Linux 套件中, 装在硬碟的核心不一定就是和安装片用的一样. 你 选了支援你设备的安装片, 它却给你在硬碟上装一个没有支援 CD-ROM 的 ``通用版''核心. 你可以照第四章所说的 ``问题与解决'' 去做. (从检查 /proc/devices 开始)
解法是重编译核心, 确定你需要的 CD-ROM 驱动程式及其它需要的部份(如 SCSI 卡, ISO-9660 档案系统)都编进去了. 如果你不知道怎麽做, 看 Kernel HOWTO
如果你安装时用了命令列参数(如``hdc=cdrom'')你要把它加进开机载入程式 的设定档中(通常是 /etc/lilo.conf)
有些 CD 的一些档案有设定隐藏位元. 这些档案正常状态是看不到的. 不过如果你挂上时 用了 "unhide" 选项, 那麽应该就可以读取了.(这个选项似乎没有文件记载过)
如果你想写自己的应用程式, 诸如CD唱片播放程式等, 你必须懂得Linux提供的 应用程式介面(application programming interface, 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. 已有几个核心驱动程式支援它了. 我预计下一个主要版本核心 (3.0?) 里, 所有 CD-ROM驱动程式都会符合这API.
我的书, Linux Multimedia Guide, 也提到了如何写CD-ROM程式, 特别是放音方面 的. 请看"参考文献"那节.
如果你有一片CD-ROM, 上面有Windows可看到, 但Linux看不到的长档名, 那麽这片光碟 可能是使用Microsoft专属的Joliet档案系统格式. 请看下一个问题.
Microsoft制定了一种叫Joliet的ISO CD-ROM档案系统延伸格式. 在写这篇时, 对Joliet 的支援正进行中, 可以在 http://www-plateau.cs.berkeley.edu/people/chaffee/joliet.html 或 ftp://www-plateau.cs.berkeley.edu/pub/multimedia/linux/joliet/ 找到修补档.