ปรับปรุงเครื่องคัดลอกซีดี บน Lenny

ปรับปรุงจาก ทำเครื่องคัดลอกแผ่นซีดีแบบลูกทุ่ง

ทำบนเดเบียน Lenny โดยจะปรับให้สามารถเขียนแผ่น DVD ได้ด้วย มีการเปลี่ยนแปลงสคริปต์เล็กน้อย แต่คราวนี้ขอเขียนขั้นตอนแบบเริ่มใหม่ตั้งแต่ต้น

สมบัติของเครื่องที่นำมาใช้ทดสอบและรุ่นของเดเบียน

  • CPU: AMD Athlon (tm) XP 2400+
  • motherboard: ECS L7VMM2
  • RAM: DDR 512M
  • harddisk: Seagate 10G เป็น /dev/hda
  • CD-ROM: DVD-Writer Lite-on จำนวน 3 เครื่อง เป็น /dev/hdb /dev/hdc และ /dev/hdd ตามลำดับ
  • OS: Debian GNU/Linux 5.0 (2.6.26-2-686) - Lenny
  • packages: wodim setcd dvd+rw-tools

ความสามารถของโปรแกรม

สามารถคัดลอก CD, VCD และ DVD ได้ เป็นแบบเข้า 1 ออก 3 และเขียนด้วยความเร็วต่ำสุดที่เป็นไปได้ ทั้งนี้เพื่อให้แผ่นมีความทนทานใช้งานได้ยาวนาน

การทำงานของเครื่อง

  1. เมื่อเปิดเครื่อง ถาด /dev/hdb จะดีดออกมารับแผ่นต้นฉบับ เครื่องจะส่งเสียง 1 ปี๊ปเว้น 3 วินาที ไปเรื่อย ๆ จนกว่าจะใส่แผ่นต้นฉบับ หรือดังครบ 100 ครั้งเครื่องจะดับตัวเอง
  2. เมื่อใส่แผ่นต้นฉบับแล้ว เครื่องจะทำการอ่านข้อมูลไปเก็บในฮาร์ดดิสก์จนเสร็จ เครื่องเขียนซีดีทั้ง 3 ถาดจะดีดออกมาเพื่อรับแผ่นว่าง โดยจะส่งเสียง 2 ปี๊ปเว้น 3 วินาที ไปเรื่อย ๆ จนกว่าจะใส่แผ่นว่าง เว้นแต่ถ้าเขียนผิดพลาดจะส่งเสียง 6 ปี๊ปครั้งเดียว
  3. หากเสร็จแล้วให้กดถาดเปล่ากลับเข้าไป ซีดีเครื่องนั้นจะหยุดการทำงาน
  4. หลังจากหยุดการทำงานครบทั้ง 3 ถาดแล้ว เครื่องจะดับตัวเอง

เริ่มสร้างด้วย...

การติดตั้งเดเบียนแบบเปล่า ๆ ดูตัวอย่างจาก การติดตั้ง Debian เป็น Desktop แต่ของเราไม่ต้องเลือก Desktop Environment

ติดตั้งแพกเกจที่ต้องการ

# aptitude install vim less wodim dvd+rw-tools setcd

สร้างไฟล์เริ่มการทำงานอ่านซีดี ชื่อ d.inittab-cpcd

# vi /root/d.inittab-cpcd
#!/bin/bash
# CD COPIER PROGRAM
# PREREQUISITE:
#       # aptitude install wodim setcd dvd+rw-tools
#       file: d.inittab-cpcd d.func-cpcd
# PUT THE LINE
#       D1:2345:once:/root/d.inittab-cpcd
# IN /etc/inittab THEN REBOOT
#

#VARIABLE
DEV=/dev/hdb            #SOURCE DRIVE
TMP=/tmp/x.bin          #TEMP.IMAGE FILE

beep() {
    echo -e "\a"
}

beeperror() {
    for i in `seq 1 6`; do beep; sleep .15; done
}

wait_read_close() {
    # MAX RETRY LOOP = 100
    for (( i=0; i<=100; i++ ))
    do
        if setcd -i $DEV | grep open >> /dev/null; then
            # SLEEP 1 SECONDS
            beep; sleep 3
        else
            #TRY CLONE MODE
            readom -v dev=$DEV f=$TMP -clone retries=128 ts=128k
            ISCLONE=$?
            if [ $ISCLONE -ne 0 ]; then
                readom -v dev=$DEV f=$TMP retries=128 ts=128k
            fi
            return
        fi
    done
    eject -t $1
    /sbin/shutdown -h now
    return
}

rm -rf $TMP

#CHECK 1ST CDR IS ORIGINAL CD THEN DUP. TO /tmp
while ! [ -s $TMP ]
do
    eject $DEV
    wait_read_close $DEV
    beep
done

# CALL MULTIPLE INSTANCE IN 3 DRIVES /dev/hdb /dev/hdc AND /dev/hdd
/root/d.func-cpcd /dev/hdb $ISCLONE 1 $TMP &
/root/d.func-cpcd /dev/hdc $ISCLONE 1 $TMP &
/root/d.func-cpcd /dev/hdd $ISCLONE 1 $TMP &
wait
/sbin/shutdown -h now
# chmod 755 /root/d.inittab-cpcd

สร้างไฟล์ฟังก์ชันเขียนซีดีแบบขนาน

# vi /root/d.func-cpcd
#!/bin/bash

DEV=$1
ISCLONE=$2
SPEED=$3
TMP=$4

beep() {
    echo -e "\a"
}

beepwrite() {
    beep; sleep .15; beep
}

beeperror() {
    for i in `seq 1 6`; do beep; sleep .15; done
}

wait_write_close() {
    # MAX RETRY LOOP = 100
    for (( i=0; i<=100; i++ ))
    do
        # WAIT FOR INSERT DISC
        if setcd -i $DEV | grep 'is open' > /dev/null; then
            beepwrite; sleep 3
        # IF NO DISC INSERTED THEN BREAK
        elif setcd -i $DEV | grep 'No disc' > /dev/null; then
            exit 1
        else
            if [ $ISCLONE -ne 0 ]; then
                wodim -v gracetime=2 dev=$DEV speed=$SPEED \
driveropts=burnfree -overburn -eject $TMP
            else
                wodim -v gracetime=2 dev=$DEV speed=$SPEED \
driveropts=burnfree -raw96r -clone -overburn -eject $TMP
            fi
            # LAST CHECK WRITING
            if setcd -i $DEV | grep 'error' > /dev/null; then
                beeperror; sleep 3
            else
                eject $DEV
                return
            fi
        fi
    done
    #END PROG
    eject -t $1
    exit 1
}
if [ ! $1 ] && [ ! $2 ] && [ ! $3 ] ; then
    echo "   USAGE : $0 DRIVE SPEED TEMP-IMG"
    echo "   EXAM1 : $0 /dev/hdb 8 /tmp/x.bin"
    exit 1
fi

#CHECK IMAGE FILE
if ! [ -f $TMP ] ; then
        echo "  Image file $TMP does not existed"
        exit 1
fi

#COPY TO NEW BLANK CD
while [ -f $TMP ]
do
        eject $DEV
        wait_write_close $DEV
        beepwrite
done
# chmod 755 /root/d.func-cpcd

แก้ไข inittab ให้เรียกโปรแกรมตอนเริ่มต้นเปิดเครื่อง

# vi /etc/inittab
...
#COPY CD
D1:2345:once:/root/d.inittab-cpcd

เสร็จแล้ว บูตเครื่องแล้วใช้ได้เลย

เที่ยวนี้มีเวลาทดสอบน้อย ฝากทดสอบกันเองนะครับ

Creative Commons License ลิขสิทธิ์ของบทความเป็นของเจ้าของบทความแต่ละชิ้น
ผลงานนี้ ใช้สัญญาอนุญาตของครีเอทีฟคอมมอนส์แบบ แสดงที่มา-อนุญาตแบบเดียวกัน 3.0 ที่ยังไม่ได้ปรับแก้