LINUX 燒錄實作
目的:說明linux命令列下燒錄方法
最後更新日期:2005/02/25

使 用作業系統:
FC3
使用軟體:
cdrecord(cdrecord,readcd)-燒錄軟體
mkisofs-建立合乎CD燒錄的影像檔
cdrdao-針對一次光碟燒錄
cdda2wav-抓取音樂光碟音軌
sox-變更音樂檔格式
上述套件均含有rpm套件,可在fc3光碟上找到

說 明:
在網路上實在找不到較完整說明linux命令列燒錄的中文說明,我看到的只針對下列某幾項,並沒有類似windows下完整的套件完整功能的說明,以下是 我測試的燒錄的記錄:
包含下述燒錄方法
  1. 光碟複製
  2. 資料複製
  3. 多次資料複製(multi-session)
  4. 音樂檔案複製為音樂光碟
#本說明沒有談到開機光碟的製作,如果 要製作請在mkisofs的manual尋找說明-b
#本文重點在實作燒錄,不原理

基本常識:
目前linux命令下最常見的燒錄軟體是cdrecord,mkisofs 這兩個程式,其基本操作你一定要學會
IDE的燒錄機是目前最常用的,其設備名稱和IDE硬碟使用的相同,然而根據cdrecord的manual上所寫,它是使用於SCSI的命令界面,但後 來由於大量的IDE介面的燒錄機問世,因此它加入IDE的命令界面,但你必須額外指定,其中dev 設為如下dev=ATAPI:x,y,x或dev=ATA:x,y,x  而x,y,z是三個數字對應於SCSI的代碼.至於如何得知你燒錄機的號碼其依下面指令
查詢你燒錄機
  1. cdrecord -scanbus
  2. cdrecord -scanbus dev=ATAPI
共有兩種命令可用,1是用於較新版本的 cdrecord,如果命令1可以找出你的光碟機則命令2可略過,反之則執行2,執行後會產生類似下面的輸出
scsibus1:         
        1,0,0   100) *
      1,1,0   101) 'BENQ    ' 'CDRW 5232X      ' 'KPBY' Removable CD-ROM
        1,2,0   102) *
        1,3,0   103) *
上述範列中紅色這一行1,1,0就是燒錄機設備的scsi代碼,如果你是使用1指令查到參數請用 dev=ATA: 1,1,0 ,如果是2指令查到參數請用 dev=ATAPI:1,1,0

#較新版的cdrecord,亦支援標準的設備名稱表示法,如: dev=/dev/hdd
至於你燒錄機所在,
可以使用下述命令來查詢:
$ dmesg | grep "^hd"

mkisofs 的基本用法
用來建立CD影像檔
語法:
mkisofs -o 輸出的檔案 -參數.......   目錄

重要參數
問題
#變更根目錄(沒法指定 多個目錄)
mkisofs -r 
-root /linux -o test.iso /etc/
#變更多個來源的目錄所 在
mkisofs -o test.iso -graft-points /linux/etc=/etc /linux/sbin=/sbin
●例如我要備份多個linux的目錄如果沒有指定會將/etc及 /sbin全放在根目錄下,很亂...
-graft-points 目的目錄=來源目錄 ...=... ...=... ...........
●必須放在所有的參數之 後,否則後面的參數會被視為-graft- points的參數
#排除不需要的檔案
多筆使用-exclude-list 檔名 ,其中檔名將不需要的檔案名稱每一行一個檔案,也可以使用*(萬用符號)


cdrecord基本用法
語法:
cdrecord -參數 .....  dev=x,y,z iso檔案

重要參數:
#注意:dev設備及檔案在燒錄時是必要參數,一般我都是放於最後,其它的參數請放於前面,如此比較不會有問題
$cdrecord -v -eject speed=8 dev=0,1,0 test.iso
cdrecord將會試著執行燒錄機的最快速度,所以你不需要指定速度, 但是必需根據你的經驗(測試你的機器).指定一個較慢的速度是較有用來修正錯誤和燒錄時的buffer underruns. 較新的設備使用"burn-proof" 的科技 (對抗BUFFER UNDERRUNS).
#driveropts=的參數中有一個burnfree有下述不同的說 法(sanyo BURN-Proof/Ricoh Just-Link/Yamaha Lossless-link或是類似的名稱),

資料光碟燒錄

光碟的燒錄可分為兩個重要步驟:
  1. 建立一個iso檔
  2. 燒錄iso檔到CD
#大部份的軟體,都是分成這兩個步驟, 然而記住這並不是絕對,也有只有一個步驟的軟體
#在使用兩個步驟的操作方式你還必須考慮到硬碟空間,足以建立iso檔

例:
$ mkisofs -o test.iso -Jrv -V test_disk /home/samba/

現在 mount該.iso檔來驗證; 建立一個mount的目錄:

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

你可以簡化如下:
$ mount -t iso9660 -o loop test.iso /test_iso
$ mount -o loop test.iso /test_iso

進入test_iso檢查是否所有你要都檔案 都在堶,如果均正常可以開始燒錄了

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


資料光碟對燒

如果你有兩個光碟機,一個來源(讀取),一為目的(寫入),  使用參數-isosize 後面接來源光碟

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

你的機器太慢無法直接燒錄/只有一個光碟機
可分為兩段,變為下面指令

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

dd是複製原始的資料
注意:cdrecord的參數, fs=8m-dummy. fs=8m 定義ring buffer的大小:愈大愈好,根據這個觀點.記住,任何的中斷都算是重大錯誤; fs=8m 建立足夠大的buffer來保持燒錄器的運作如果某些事來減緩資料的傳送. 如果 8 MB不足夠,你可能需要較好的電腦.換句話說,超過8MB是沒有必要的, 如同作業系統會浪費時間來重載MMU (Memory Management Unit)的表格. 預設是4 MB.

-dummy 燒錄器所有的動作都執行只有雷射關閉,專用於測試.


資料光碟(多次燒錄)

Multisession
所謂Multisession是說cd-r片可以多次的燒錄,沒有燒完的可以再燒
光碟片的燒錄是以sessions來稱呼每一次燒錄工作,而每一個sessions所燒錄是以track為單位.在單一 session碟片, 我們稱為單一TOC (table of contents),並無法再寫入.如果你要允許多次燒錄,必須使用mkisofs將不同sessions串在一起,它會使用 多個TOC來串並且會浪費一些空間,在燒完時前面燒過的資料會變成隱藏,如 果你要讀取前次燒錄的資料,在有安裝nero軟體的windows系統,可對光碟機按右鍵->內容 選取你要的toc

燒錄原理:
1.使用cdrecord 做第一次燒錄,加入 -multi 這個參數
2.使用cdrecord 取的目前已燒錄光碟片的啟始及結束磁區使用參數-msinfo (multi-session informaton)
3.使用mkisofs 來建立iso暫存檔,但要加入-C(由2取得的啟始及結束磁區) 及-M (燒錄機SCSI的設備號碼)

範例:
1.

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

2.

$cdrecord dev=0,1,0 -msinfo
0,27139

3.確定有光碟在你的燒錄機中.然後加入兩個 新的選項, -C-M:

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

或合併2、3如下

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

音 樂CD對燒(cdrdao)
使用DAO的燒錄方式來燒錄音樂CD
1.讀取cd到檔案
  cdrdao read-cd --device ATAPI:1,1,0 test
2.寫入cd
  cdrdao write   --device ATAPI:1,1,0  test
3.清空cdrw
  cdrdao blank   --device ATAPI:1,1,0
4.直接複製光碟(使用同一台光碟機)
  cdrdao copy    --device ATAPI:1,1,0
5.直接複製光碟(使用不同台光碟機)
  cdrdao copy    --device ATAPI:1,1,0 --source-device ATAPI:1,0,0

#暫存image的名稱cddata<pid>.bin

音樂CD抓取音軌到硬碟
使用cdda2wav,並可使用sox將聲音檔轉為你要的格式
cdda2wav用法:
先建一個目錄來放音樂檔
$cdda2wav -d /dev/cdrom -B
-B是複製所有的音軌到不同的檔案
sox用法:
sox 輸入音樂檔  輸出音樂檔
至於sox支援的格式請參考manual

音樂檔燒錄音樂CD
音樂光碟的音軌檔為cdr
cdrecord可接受的音樂檔.au .wav .cdr
如果是其它音樂檔案類型可以使用sox來轉換
$sox music1.mp3 music2.cdr
燒錄音軌
cdrecord -v  dev=0,0,0  -audio  track1.cdr track2.cdr...
#注意:音樂光碟linux是無法使用 mount指令來掛載到檔案系統中

映像檔轉成iso
以下程式可以轉換一些燒錄程式所產生的映像為iso檔方便變來燒錄
nrg2iso (.nrg)
bin2iso (.cue)



資料燒錄命令集
一般燒錄資料,除了上述所提的兩個步驟外,其實還有一些細節的動作,如清 除cd+rw上的上次所燒錄的資料,及光碟機的cd槽的開關操作,及iso暫存檔 的 刪除等,我將重要的動作寫成一個script,只要略加修改就可以使用:
echo "建立iso檔案!"
mkisofs -r -V `date +%Y%m%d` -o /tmp/burn_cd.iso -graft-points backup=/backup
echo "清空光碟片!"
cdrecord -eject dev=ATA:1,1,0 blank=fast
echo "關閉CD槽!"
eject  -t /dev/hdd
echo "開始燒錄....."
cdrecord -eject  dev=ATA:1,1,0 /tmp/burn_cd.iso
echo "刪除iso暫存檔"
rm -rf /tmp/burn_cd.iso
echo "燒錄工作完成!"

附錄:A
談到燒錄的規格,我們常會被五花八門名詞所搞亂,而一般的用法也是隨便使 用
以下分兩方面來討論
1.硬體
  這就是你的燒錄機,目前分為三種:
  cd+rw機
  combo機-同cd+rw但支援dvd的讀取不支援寫
  dvd+rw機
  dvd和vcd最大的不同其一是雷射,在dvd下必須寫入高密度dvd片,因此所使用的雷射不和一般
2.軟體(邏輯)
  cd+rw,是可以燒音樂cd,vcd,svcd,資料cd...等等,而其辨別方式主要是根據檔案的結構
  dvd+rw除了向下相容上述之外,還支援UDF的檔案結構,而其目錄/影片/字幕的規格請參考下面註解的網站

硬體和軟體規格有時很難分,我們這堨D要針對燒出來的光碟片而言

#如果你需要vcd/svcd/dvd的邏輯資料可以參考下述網站
http://www.videohelp.com/

硬體規格:
軟體規格:
ie + 金 => 金片
         phthalocyanie + 銀 => 白金片
                          azo + 銀 => 藍片