多數 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/ 找到修補檔.