Linux下刻錄CD/DVD詳解

http://www.jcwcn.com/forum.php?mod=viewthread&tid=8896


Linux 爲創建 CD 提供了功能強大且靈活的工具。您可以創建在幾乎任何平臺上都可讀的盤,還可以創建 .iso 文件以供下載和分發。 

在任何平臺上從命令行刻錄 CD 都是一件令人費解且煩躁的事情,Linux 當然也不例外。不過,由於在各平臺上所用到的命令和術語都十分相似,因此學習一下如何在 Linux 上刻錄 CD 還是十分有用的。許多 Linux 軟件都是通過 .iso 映像分發的,因此如果您知道如何刻錄 CD,就可以下載 .iso 來創建您自己的安裝盤。 

Linux 和 Windows 都有可錄 CD 的程序可用,但 Linux 版本比起 Windows 版本來功能更強大通用性也更好。在本文中,我們將研究 Linux CD 刻錄命令中的兩個主力:mkisofs 和 cdrecord。mkisofs 創建預先錄製的映像,來生成 ISO9660/JOLIET/HFS 混合文件系統。它同時創建和填充文件系統。與其它數據存儲介質(如硬盤驅動器和軟盤驅動器)不同,CD 上的文件系統並不是先創建後填充資料的。CD-R 只有一次機會:首先格式化將會創建一個帶有空檔系統的盤。cdrecord 命令在橙皮書(Orange Book) CD-R/RW 上刻錄資料,這差不多就是其全部工作了。 

由於採用了諸如 CD 刻錄之類的新興技術,最好使用這些程序的較新版本。mkisofs 和 cdrecord 的版本都應該至少已經達到了 1.10。cdrecord 的最新版本 V2.0 已經被重命名爲 cdrtools。要查明機器上所安裝的版本,請輸入: 

$ cdrecord --version 

和 $ mkisofs --version 

對於那些剛接觸可刻錄 CD 的人而言,在我們繼續之前,有幾樣東西是值得先了解一下的: 

CD-R:可刻錄 CD(CD-Recordable)。它們是 WORM(寫一次,讀多次,Write Once, Read Many)。 

CD-RW:可重寫 CD(CD-Rewritable)。它們是 WMRM(寫多次,讀多次,Write Many, Read Many)。 

CD-R 的使用很廣泛,在任何 CD-ROM 驅動器上都應該可讀。 

CD-RW 在所有現代驅動器上都應該可讀。驅動器必須是“多格式讀取的(multiread)”,以便能夠讀取 CD-R 和 CD-RW 盤。較老的驅動器會出問題。扔掉那個 4 倍速的舊驅動器,買個新的;用不着發火。 

商用 CD 不是用激光刻錄成的,而是壓制而成的。 

哪一種 CD-R/RW 驅動器最好呢?隨便請教普通的硬件評論員,讓他們給您一些建議。 

下面是與文件格式有關的一些術語: 

黃皮書(Yellow Book):資料 CD 的物理格式 

橙皮書:可刻錄 CD 的物理格式: 

第一部分:CD-MO(磁-光,Magneto-Optical) 

第二部分:CD-WO(寫一次,Write-Once;包括 PhotoCD 的“混合”規範) 

第三部分:CD-RW(可重寫,Re-writable) 

ISO-9660:舊的檔佈局標準,它只允許 8.3 格式的文件名 

Rock Ridge:是對 ISO-9660 的擴展,它允許長文件名和 UNIX 樣式的符號鏈接;保留了所有文件屬性,如所有權和權限。在 Windows 系統上讀盤時,不會顯示 UNIX 文件的屬性。 

Joliet:Microsoft 對 ISO 9660 文件系統的擴展,它允許在文件名中使用 Unicode 字符,同樣也允許長文件名。爲了與 MS-DOS 兼容,它還創建截斷的文件名(這些看起來怪怪的樣子:FILENA~1.TXT)。它允許文件名長達 64 個字符(包括空格),Windows 95 或更高版本以及運行 Joliet 卷訪問(Joliet Volume Access)擴展的 Macintosh 計算機都可以讀取它。Macs 不會讀取長度超過 31 個字符的 Joliet 文件名。 

El Torito:可引導 CD-ROM(Bootable CD-ROM)格式規範 

HFS(分層文件系統,Hierarchical File System):Macintosh 使用的本機文件系統 

多段刻錄(Multisession):允許多次添加檔,而不是隻允許在單個段中添加檔。要使盤可讀,就必須“關閉”段。但是,這卻導致不能向盤中添加更多檔。多段刻錄將單個段鏈接起來,然後更新盤的目錄,使得它好象一個目錄一樣。 

CD-UDF(通用盤格式,Universal Disk Format):業界標準遞增包寫文件系統(incremental packet-writing filesystem) 

對 UDF 的一點簡單說明:UDF 意味着能夠直接將檔放入盤。目前,這是在軟件級別上完成的。讀取該盤需要用來創建該盤的軟件。計劃將 UDF 添加到 Linux 內核(可能是 2.6)。要實現這一點,CD 驅動器需要具有 CD-MRW 電路(“CD Mount Rainier ReWrite”;不要問我他們爲什麼取這麼個名字),因此它將是新型驅動器的一項功能。當這一點得到實現時,向 CD-R/RW 中複製文件將和向軟盤中複製文件一樣容易,而且這些盤將普遍可讀。而且,它還被吹捧爲古老的 3.5" 軟盤的另一種替代品。我們將拭目以待。(請參閱參考資料以獲取到更多有關 Mount Rainier 的信息的鏈接。)

Linux SCSI 仿真冒險 

如果可以的話,請使用 IDE/ATAPI 或 SCSI CD 刻錄機。並口接口是一種會給您添麻煩的棘手玩意兒,而 USB 驅動器則很慢。在 Linux 中它們都得不到很好的支持(雖然對於較新的 USB 2.0 驅動器,您的運氣可能會好一些)。 

IDE/ATAPI 驅動器最爲常見,但使用起來卻需要做些調整。那麼,如果 cdrecord 顯示沒有配置任何驅動器,會發生什麼事情呢?要想檢查是否配置有驅動器,請輸入以下命令: 

$ cdrecord -scanbus 

如果命令顯示了 CD-RW 驅動器(請參閱後面的刻錄盤),那麼您可以跳過這一節的大部分,儘管您可能還是都想流覽一下這些內容,以便有所瞭解。 

Linux 使用 SCSI 仿真子系統,因此 IDE/ATAPI CD 刻錄機需要兼容性驅動程序。如果同一臺 PC 上既有 CD-ROM 也有 CD-R/RW,那麼二者都需要 ide-scsi 僞設備驅動程序來支持盤的複製。在 CD-ROM 上使用 SCSI 仿真沒有什麼不利之處;它同樣能工作;只是名稱會改變。驅動器的名稱將會隨 Linux 的具體分發版而有所不同,其名稱可以是 /dev/cdrom0、/dev/hdc 或 /dev/scd0(要獲得 IDE/ATAPI 設備名列表,請參閱表 1)。 

表 1. IDE/ATAPI 設備名名稱 設備 

hda IDE 總線/連接器 0 主設備 

hdb IDE 總線/連接器 0 從屬設備 

hdc IDE 總線/連接器 1 主設備 

hdd IDE 總線/連接器 1 從屬設備 

要找到系統上的驅動器,請輸入: 

$ dmesg | grep '^hd.:' 

hda: IBM-DTLA-305020, ATA DISK drive 

hdb: TOSHIBA DVD-ROM SD-M1202, ATAPI CD/DVD-ROM drive 

hdc: LITE-ON LTR-24102B, ATAPI CD/DVD-ROM drive 

hda: 40188960 sectors (20577 MB) w/380KiB Cache, CHS=2501/255/63, UDMA(66) 

大多數現代 Linux 都包含了已編譯進內核的 SCSI 仿真: 

$ locate ide-scsi.o 

/lib/modules/2.4.19/kernel/drivers/scsi/ide-scsi.o 

如果您的系統不是這樣的,那麼您就必須將它編譯到您的內核中。對於這篇篇幅有限的文章來說,那是一個過大的主題,因此請參閱參考資料(當您知道如何做時,您會發現它並不難)。 

您需要編輯兩個文本文件來配置系統,讓它使用 ide-scsi 驅動程序。第一個是 /etc/modules.conf(在 Debian 中是 /etc/modules)。我的系統有一個 CD-ROM 和一個 CD-R/RW 驅動器,設備分別是 hdb 和 hdc。使用適合於您系統的值,將這兩行添加到 /etc/modules.conf(或 /etc/modules): 

ide-cd ignore=\"hdb hdc\" 

ide-scsi 

缺省情況下,IDE 子系統將所有的 ATA 設備聲明爲它自己的設備,因此 ignore 這一行使得 SCSI 子系統既能抓取 CD-R/RW 也能抓取 CD-ROM。 

接下來,爲您的引導裝載程序(GRUB 或 LILO)編輯配置文件。對於 LILO 用戶,請將下面兩行添加到 lilo.conf 的末尾: 

append="hdb=ide-scsi" 

append="hdc=ide-scsi" 

對於 GRUB 用戶,請將下面這行添加到 /etc/grub.conf(或者 Debian 中的 /boot/grub/menu.lst)中 kernel 這行的末尾: 

hdb=scsi hdc=scsi 

現在重新引導,並驗證它是否已裝入: 

$ lsmod 

這條命令將返回一個長列表;請查找 ide-scsi。 

創建 .iso 文件 

一旦選擇了您想複製的檔,對 CD 進行刻錄就只有兩步:用 mkisofs 創建 .iso,然後用 cdrecord 將這些檔刻錄進盤中。使用以下命令來創建 .iso 文件: 

$ mkisofs -o test.iso -Jrv -V test_disk /home/carla/ 

在上面的示例中: 

-o 爲新的 .iso 映像檔命名(test.iso) 

-J 爲了與 Windows 兼容而使用 Joliet 命名記錄 

-r 爲了與 UNIX/Linux 兼容而使用 Rock Ridge 命名約定,它使所有檔都公共可讀 

-v 設置詳細模式,以便在創建映像時獲得運行註釋 

-V 提供了卷標識(test_disk);該標識就是出現在 Windows 資源管理器中的盤名 

列表中的最後一項是選擇要打包到 .iso 中的文件(都在 /home/carla/ 中) 

現在,掛裝 .iso 來進行驗證;我喜歡創建一個測試目錄: 

$ mkdir /test_iso 

$ mount -t iso9660 -o ro,loop=/dev/loop0 test.iso /test_iso 

查看目錄的內容;所有的檔都應該在那裏,並且都可讀。否則,就是映像壞掉了,如果您將它刻錄到盤上,那麼您最終將得到一個刻錄失敗的光盤。 

刻錄盤 

將映像寫到盤中再簡單不過了。首先,找到 CD-R/RW 的 SCSI 地址: 

$ cdrecord -scanbus 

Cdrecord 1.10 (i686-pc-linux-gnu) Copyright (C) 1995-2001 Jrg Schilling 

Linux sg driver version: 3.1.24 

Using libscg version 'schily-0.5' 

scsibus0: 

0,0,0 0) 'TOSHIBA ' 'DVD-ROM SD-M1202' '1020' Removable CD-ROM 

0,1,0 1) 'LITE-ON ' 'LTR-24102B ' '5S54' Removable CD-ROM 

0,2,0 2) * 

0,3,0 3) * 

0,4,0 4) * 

0,5,0 5) * 

0,6,0 6) * 

0,7,0 7) * 

每一項的前三個數字分別指 SCSI 總線、設備標識和 LUN(邏輯單元號,Logical Unit Number)。(第四個數字也是設備標識。)cdrecord 需要這三個數字。在上面的示例中,CD 刻錄機是 0,1,0。SCSI 總線 0 上的設備都可以縮寫爲 1,0,即省去頭一個 0。這是一個公共約定。如果有其它總線的話,則必須指定 — 沒有快捷方式。

現在向盤中寫內容: 

$ cdrecord -v -eject speed=8 dev=0,1,0 test.iso 

在上面的示例中: 

-v 指詳細方式 

-eject 在完成寫任務後彈出盤 

-speed 指定寫速度(8) 

-dev 是從 cdrecord -scanbus 獲得的設備號(0,1,0) 

最後一個是所刻錄的映像的名稱(test.iso) 

對於創建用於公用分發的盤,這是一種簡單且可用的方法,因爲它創建了可以在任何 Windows 或 Linux 系統上讀取的盤。mkisofs 本身就非常適合於創建供下載的 .iso,而且 mkisofs 可以爲許多平臺創建文件系統。請參閱 mkisofs 聯機幫助頁以獲取更多信息。 

在一臺運行速度極快且內存很大的機器上,您可以在刻錄期間從容地處理非 CPU 密集型任務,但是在刻錄盤期間最好別做別的事情。激光器不能先停下來,然後從停下來的地方重新開始,所以任何中斷都是致命的。 

cdrecord 將試圖以最快速度運行刻錄機,因此不必指定速度,但是,應該根據經驗來判斷如何做。指定較慢的速度對於糾正錯誤和緩衝區欠載運行很有用。採用“burn-proof”技術的新型驅動器(開發這項技術的初衷與它現在的名字正好相反;同樣,誰取的這些名稱呢?)不會有老式驅動器那樣的緩衝區欠載運行煩惱。 

複製盤 

要直接將內容從源盤複製到可刻錄盤,請使用下面的命令: 

$ cdrecord -v dev=0,1,0 speed=4 -isosize /dev/scd0 

這條命令直接將 CD-ROM 即 /dev/scd0 的內容“流”入 CD 刻錄機 dev=0,1,0。不要在速度慢的舊機器上這麼做。直接複製速度很快,但卻更容易出錯。更好的做法是:先將源盤的內容複製到硬盤驅動器,再從硬盤驅動器複製到 CD 刻錄機: 

$ mount /cdrom 

$ dd if=/dev/scd0 of=/tmp/diskfile.iso 

$ cdrecord dev=0,1,0 speed=8 fs=8m -v -eject -dummy /tmp/diskfile.iso 

請注意兩個新選項 fs=8m 和 -dummy。fs=8m 定義了環形緩衝區的大小:在一定程度上,越大越好。記住,中斷是致命的;如果什麼東西讓資料傳送慢下來了,那麼 fs=8m 將創建一個足夠大的緩衝區來讓刻錄機保持運行。如果 8 MB 還不夠,那麼您可能需要一臺更好的 PC。另一方面,超過 8 MB 也不一定更好,因爲操作系統重新裝入 MMU(內存管理單元,Memory Management Unit)表時會浪費時間。缺省值是 4 MB。 

-dummy 是一個了不起的選項,可以用它來先進行一次“排練”,然後在實際的盤上冒險。刻錄機執行一切操作,但是不打開激光頭,這使用戶有機會在將內容提交到盤上之前捕獲錯誤。  
多段刻錄 

CD 由段構建而成,而段由磁道構成。只有一個段的盤上有一個導入點、一個 TOC(目錄,table of content)、資料和一個導出點,導出點標記着這張盤的終點,並阻止在這張盤上進行進一步的刻錄。mkisofs 將單獨段鏈接在一起。用 GUI 程序(如 X-CD-Roast 或 KonCD)創建多段刻錄盤可能要更容易一些,但這裏演示的是如何用命令行工具完成這一任務。 

第一次在盤上刻錄一個段時,請在 cdrecord 中使用 -multi 開關: 

$ cdrecord -v -eject speed=8 dev=0,1,0 -multi test.iso 

盤將會以某種方式被固定下來,使得盤可讀,也可以添加更多資料。要向這張盤中添加更多段,mkisofs 需要知道起始扇區號和結束扇區號,可以象下面這樣來找到這些號碼: 

$ cdrecord dev=0,1,0 -msinfo 

0,27139 

確保把要添加資料的盤放入了 CD 刻錄機。然後,添加兩個新開關 -C 和 -M: 

$ mkisofs -o test2.iso -Jr -V Session2 -C 0,27139 -M 0,1,0 /files/path/ 

或者更好的辦法是,讓命令 shell 完成這項工作: 

$ mkisofs -o test2.iso -Jr -V Session2 -C `cdrecord dev=0,1,0 -msinfo` -M 0,1,0 /files/path/ 

多段刻錄 CD 驅動器讀取已寫入的最後一個段。上面的命令從最後一個段獲取 TOC,然後將它組合進新 TOC 中。在刻錄盤上的最後一個段時,請省略 -multi 選項。 

結束語 

Linux 中的 CD 刻錄功能強大且全面。CD 刻錄機可以跨越網絡共享,還可用於自動備份;mkisofs 和 cdrecord 也能用於 DVD。雖然有許多優秀的圖形前端程序,但是完整的功能在命令行程序上。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章