Tag Archives: mkisofs

เขียนแผ่นซีดีบนลินุกซ์ด้วย cdrecord และ mkisofs

ข้อมูลในฮาร์ดดิสก์เริ่มเยอะขึ้นๆ ทุกวัน สงสัยต้องเขียนลงแผ่นซีดีซักหน่อย แต่ในลินุกซ์ทะเล 5.0 ไม่มีโปรแกรมสำหรับเขียนซีดีง่ายๆ เลยครับ .. เอาวะ เล่นมันถึกๆ นี่ล่ะ ใช้ mkisofs + cdrecord ก็ได้ :D .. สองโปรแกรมนี้เป็นโปรแกรมหลักที่ใช้เขียนซีดีบนลินุกซ์ ส่วนโปรแกรมที่เป็นอินเทอร์เฟซสวยๆ ใช้ง่ายๆ อย่างพวก EClipt Roaster เป็นแค่หน้ากากที่ช่วยให้ใช้งานได้ง่ายขึ้นเท่านั้นเอง และเอาเข้าจริงๆ แล้วใช้ mkisofs + cdrecord ก็ไม่ได้ยากอะไรเลย จำแค่สองคำสั่งก็ใช้ได้แล้วครับ .. ที่เราจะทำก็คือใช้โปรแกรม mkisofs สร้างอิมเมจของแผ่นซีดีก่อน แล้วจึงเอาอิมเมจที่ได้ไปเขียนลงแผ่นจริงๆ อีกทีด้วย cdrecord ..

สร้าง ISO อิมเมจ

เริ่มกันที่สร้างอิมเมจก่อน คำสั่งพื้นฐานในการสร้างอิมเมจก็คือ

[root@yggdrasil kitt]$ mkisofs -o image.iso /source/tree

mkisofs จะสร้างไฟล์ซิสเต็มและจัดโครงสร้างการจัดเก็บข้อมูลเสมือนกับว่า image.iso เป็นแผ่นซีดีแผ่นนึง แล้วก๊อปปี้ข้อมูลทั้งหมดจากไดเรคทอรี่ /source/tree ลงไป .. แต่การใช้งานจริงเรามักต้องการให้ซีดีใช้กับวินโดวส์หรือโอเอสอื่นๆ ได้ด้วย .. นอกจากนั้นอาจจะต้องการใช้ชื่อไฟล์ยาวๆ และชื่อไฟล์ภาษาไทยอีก จึงต้องระบุออพชันเพิ่มเติมเข้าไป ..อืมม.. เอาเป็นว่าจำคำสั่งนี้ไปเลยก็แล้วกันครับ:

mkisofs -V "My Label" -v -r -jcharset cp874 -o image.iso /source/tree

อธิบายสักนิด

-V "My Label" เป็นการกำหนด volume label ของแผ่น เป็น “My Label” .. เปลี่ยนข้อความตามใจชอบ แต่อย่าลืมใส่เครื่องหมายคำพูดกันไว้สักหน่อย

-v หมายถึง verbose ที่จริงไม่จำเป็นเท่าไหร่ ไม่ต้องระบุก็ได้ แต่ผมชอบให้มันแสดงข้อความเยอะๆ จะได้รู้สึกว่ามันกำลังทำงานอยู่ :P

-r ตั้ง permission เป็น public permission อันนี้ใส่กันเอาไว้ เผื่อเอาแผ่นไปใช้กับลินุกซ์หรือยูนิกซ์อื่นๆ จะได้ไม่มีปัญหาเรื่อง permission ของไฟล์..

-jcharset cp874 เป็นการกำหนดให้ใช้ Joliet ซึ่งทำให้เก็บชื่อไฟล์ได้ยาว 64 ตัวอักษร และตั้ง charset สำหรับ Joliet เป็นภาษาไทย (cp874 คือ codepage ภาษาไทย) .. ออพชันนี้ทำให้วินโดวส์แสดงชื่อไฟล์และไดเรคทอรี่ภาษาไทยได้ถูกต้อง

หลังจากได้ไฟล์ image.iso แล้ว อาจจะอยากทดสอบดูก่อนเขียนลงแผ่นซีดี.. ไม่ยากๆ .. เพราะเราสร้าง image.iso เสมือนเป็นแผ่นซีดีอยู่แล้ว การทดสอบจึงทำได้โดยการเมาท์ไฟล์ image.iso ..

[root@yggdrasil kitt]# mount -o loop image.iso /mnt

คำสั่งนี้จะเมาท์ไฟล์ image.iso ไว้ที่ /mnt ออพชัน -o loop เป็นการระบุว่าเราต้องการเมาท์อิมเมจของไฟล์ซิสเต็ม .. เมาท์ได้แล้วก็ลอง ls -lR /mnt ดู .. ถ้าทุกอย่างดูเรียบร้อยดีแล้วก็ umount /mnt แล้วก็เตรียมเขียนลงแผ่นจริงๆ กันล่ะครับ

เผาแผ่นกันล่ะ

ก่อนอื่นต้องสแกนหาไดรว์ที่จะใช้เขียนเสียก่อน โดยใช้คำสั่ง:

[root@yggdrasil kitt]# cdrecord -scanbus
Cdrecord 2.0 (i686-pc-linux-gnu) Copyright (C) 1995-2002 J#rg Schilling
Using libscg version 'schily-0.7'
scsibus0:
        0,0,0     0) 'LITE-ON ' 'LTR-40125S      ' 'ZS0N' Removable CD-ROM
        0,1,0     1) *
        0,2,0     2) *
        0,3,0     3) *
        0,4,0     4) *
        0,5,0     5) *
        0,6,0     6) *
        0,7,0     7) *

จากตัวอย่างจะเห็นว่าไดรว์เขียนซีดีเป็นดีไวซ์ 0,0,0 .. หมายเลขดีไวซ์นี้จะเอาไปใช้ระบุไดรว์เมื่อสั่ง cdrecord ..

[root@yggdrasil kitt]# cdrecord -v speed=32 dev=0,0,0 -data image.iso

ออพชันที่ระบุประกอบด้วย

-v หมายถึง verbose .. เช่นเคย

speed=32 หมายถึงเขียนที่ 32x แต่อัตราการเขียนจริงๆ อาจจะไม่ตรงกับค่านี้

dev=0,0,0 เป็นการระบุให้ใช้ดีไวซ์หมายเลข 0,0,0 ในการเขียนซีดี

-data image.iso เป็นการระบุให้เอาไฟล์ image.iso ไปเขียนลงซีดี

ทีนี้ก็นั่งรอ ไม่กี่นาทีก็ได้แผ่นซีดีอุ่นๆ ออกมา :)

Cdrecord 2.0 (i686-pc-linux-gnu) Copyright (C) 1995-2002 J#rg Schilling
TOC Type: 1 = CD-ROM
scsidev: '0,0,0'
scsibus: 0 target: 0 lun: 0
Linux sg driver version: 3.1.24
Using libscg version 'schily-0.7'
atapi: 1
Device type    : Removable CD-ROM
Version        : 0
Response Format: 2
Capabilities   :
Vendor_info    : 'LITE-ON '
Identifikation : 'LTR-40125S      '
Revision       : 'ZS0N'
Device seems to be: Generic mmc CD-RW.
Using generic SCSI-3/mmc CD-R driver (mmc_cdr).
Driver flags   : MMC-3 SWABAUDIO BURNFREE FORCESPEED
Supported modes: TAO PACKET SAO SAO/R96P SAO/R96R RAW/R16 RAW/R96P RAW/R96R
Drive buf size : 1422080 = 1388 KB
FIFO size      : 4194304 = 4096 KB
Track 01: data   676 MB
Total size:      776 MB (76:56.77) = 346258 sectors
Lout start:      777 MB (76:58/58) = 346258 sectors
Current Secsize: 2048
ATIP info from disk:
  Indicated writing power: 7
  Is not unrestricted
  Is not erasable
  ATIP start of lead in:  -11597 (97:27/28)
  ATIP start of lead out: 359849 (79:59/74)
Disk type:    Short strategy type (Phthalocyanine or similar)
Manuf. index: 20
Manufacturer: Princo Corporation
Blocks total: 359849 Blocks current: 359849 Blocks remaining: 13591
Forcespeed is OFF.
Starting to write CD/DVD at speed 32 in real TAO mode for single session.
Last chance to quit, starting real write    0 seconds. Operation starts.
Waiting for reader process to fill input buffer ... input buffer ready.
BURN-Free is ON.
Turning BURN-Free off
Performing OPC...
Starting new track at sector: 0
Track 01:  676 of  676 MB written (fifo 100%) [buf  98%]  32.9x.
Track 01: Total bytes read/written: 709132288/709132288 (346256 sectors).
Writing  time:  177.016s
Average write speed  27.3x.
Min drive buffer fill was 97%
Fixating...
Fixating time:   26.745s
cdrecord: fifo had 11170 puts and 11170 gets.
cdrecord: fifo was 0 times empty and 6789 times full, min fill was 51%.

สำหรับใครที่มีเครื่องเร็วพอ จะเขียนซีดีจากข้อมูลในไดเรคทอรีโดยไม่ต้องสร้างอิมเมจก็ได้ โดยสั่ง

[root@yggdrasil kitt]# mkisofs -V "My Label" -v -r -jcharset cp874 /source/tree
 | cdrecord -v fs=8m speed=36 dev=0,0,0 -

จะเห็นว่าเราไม่ได้ระบุ -o image.iso ใน mkisofs กรณีนี้ mkisofs จะส่งเอาท์พุตออก stdout แทน เราจึง pipe เข้าไปเป็นอินพุตของ cdrecord ได้โดยระบุออพชัน – (อยู่ท้ายบรรทัด) ซึ่งเป็นการกำหนดให้ cdrecord รับอินพุตจาก stdin … ส่วนออพชัน fs=8m เป็นการกำหนดขนาดของบัฟเฟอร์ในการเขียนซีดีให้มีขนาดเป็น 8 MB (ถ้าไม่ระบุจะเป็น 4 MB) .. ตามเอกสารของ cdrecord บอกไว้ว่าบัฟเฟอร์ควรมีขนาด 4 – 32 MB และแนะนำว่าขนาดอย่างน้อยควรจะเท่ากับบัฟเฟอร์ของไดรว์เขียนซีดี และอย่างมากไม่เกินครึ่งหนึ่งของหน่วยความจำของเครื่อง .. โดยทั่วไป 8 MB ก็เพียงพอแล้วครับ

สำหรับการก๊อปปี้ซีดีจากแผ่นนึงไปอีกแผ่นนึง ทำได้โดยสร้างอิมเมจของแผ่นต้นฉบับ ด้วยคำสั่ง

[root@yggdrasil kitt]# dd if=/dev/cdrom of=image.iso bs=1k

จากนั้นก็เอา image.iso ไปเขียนลงซีดีด้วย cdrecord หรือกรณีที่มีไดรว์สองตัวจะก๊อปแผ่นโดยไม่ทำอิมเมจก็ได้เหมือนกัน

สมมติว่า /dev/hdd เป็นไดรว์ที่ใส่แผ่นต้นฉบับ และ /dev/hdc เป็นไดรว์สำหรับเขียนแผ่นซีดี มี dev=0,0,0 ก็จะสามารถสั่งให้ก๊อปปี้แผ่นได้โดยใช้คำสั่ง

[root@yggdrasil kitt]# dd if=/dev/hdd bs=1k | cdrecord -v fs=8m speed=36 dev=0,0,0 -

เห็นเปล่า สั่งไม่เกินสองบรรทัดก็เขียนซีดีได้แล้ว ไม่ยากเลย :D