ubuntu: เครื่องคัดลอกแผ่นซีดี
จะรีไซเคิลเครื่องเก่า มาทำเครื่องคัดลอกซีดีเพื่อถวายวัด
เครื่องใหม่ราคาประมาณหมื่นเศษ
สเปคเครื่องเก่าคือ Celeron 850MHz, RAM 128MB, HD 15G (เป็น /dev/hda)
ลงทุนซื้อใหม่คือ CD-Writer 3 ตัว ตัวละ 750 บาท
เนื่องจากจะไม่มีจอภาพ จึงจะใช้เสียงเป็นตัวแจ้งสถานะ
จะทำให้มีการทำงานคือ
- เมื่อเปิดเครื่อง ถาด /dev/hdb จะดีดออกเพื่อรอการอ่านข้อมูล ใช้เสียงดัง 1 ปี๊บ ทุก 3 วินาที
- เมื่อใส่แผ่นต้นฉบับ เครื่องจะตรวจสอบแผ่น ถ้าแผ่นเสียจะแจ้งเป็นเสียง 6 ปี๊บ ทุก 3 วินาที เพื่อรออ่านแผ่นใหม่
- ถ้าแผ่นดีจะอ่านจนเสร็จ แล้วทั้งสามถาดจะถูกดีดออกเพื่อรอการเขียนข้อมูล โดยใช้เสียงดัง 2 ปี๊บ ทุก 3 วินาที
- จะเขียนวนไปเรื่อยจนกระทั่งปิดเครื่องเขียนด้วยถาดเปล่า ไดร์ฟนั้นก็จะหยุดทำงาน
- เมื่อหยุดทำงานครบสามไดร์ฟแล้ว เครื่องจะปิดตัวเอง
- ในระหว่างที่ถาดถูกดีดออก ถ้าไม่มีการใส่แผ่นใหม่เข้าไป หลังจากผ่านไป 100 ปี๊ป (หรืออาจเป็นเรากดถาดเปล่าดีดกลับเข้าไป) ถาดจะปิดตัวเอง และปิดการทำงานของถาดนั้นตลอดไป
หมายเหตุ
- เนื่องจากเป็นการทำงานแบบขนาน ทุกไดร์ฟจึงทำงานเป็นอิสระ
- กำหนดให้ความเร็วในการเขียนเป็นแค่ 8x เพื่อให้ฮาร์ดดิสก์อ่านข้อมูลได้ทัน และเพิ่มความคงทนของข้อมูล
- แผ่นต้นฉบับควรเป็นแผ่นที่ดี ถึงดีมาก ผลจึงจะออกมาดี
วิธีการสร้าง
เริ่มด้วย ติดตั้งอูบุนตู dapper แบบ server โดยเลือกไม่ติดตั้งอะไรเพิ่มเติมเลย
ดามด้วยเอาแพคเก็จที่จำเป็นคือ setcd สำหรับเขียนสคริปต์ และ cdrecord
$ su
# aptitude install eject setcd cdrecord
สร้างสคริปต์สำหรับให้ init เรียกใช้ตอนเปิดเครื่อง สำหรับให้อ่านแผ่นต้นฉบับ
ตั้งชื่อว่า d.inittab-cpcd
# vi d.inittab-cpcd
#!/bin/bash # THIS IS THE COPY CD PROGRAM # PUT THE LINE # D1:2345:once:/root/d.inittab-cpcd # IN /etc/inittab THEN REBOOT # beep() { echo -e "\7" } 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 readcd -clone dev=$DEV f=$TMP return fi done eject -t $1 /sbin/shutdown -h now return } # TEMPOLARY IMAGE FILE DEV=/dev/hdb #KERNEL-2.4 #ATA="ATAPI:0,1,0" #KERNEL-2.6 #ATA=/dev/hdb ATA=/dev/hdb TMP=/tmp/x.bin 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 #d.func.cpcd DEVICE SPEED ISOFILE #KERNEL-2.4 #/root/sh-func-cpcd /dev/hdb ATAPI:0,1,0 8 $TMP & #/root/sh-func-cpcd /dev/hdc ATAPI:1,0,0 8 $TMP & #/root/sh-func-cpcd /dev/hdd ATAPI:1,1,0 8 $TMP & #KERNEL-2.6 /root/d.func-cpcd /dev/hdb /dev/hdb 8 $TMP & /root/d.func-cpcd /dev/hdc /dev/hdc 8 $TMP & /root/d.func-cpcd /dev/hdd /dev/hdd 8 $TMP & wait /sbin/shutdown -h now
อีกไฟล์นึงเป็นฟังก์ชั่นสำหรับเขียนซีดี ตั้งชื่อว่า d.func-cpcd
# vi d.func-cpcd
#!/bin/bash beep() { echo -e "\7" } 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 cdrecord -clone -raw96r dev=$ATA speed=$SPEED driveropts=burnfree gracetime=2 -overburn -eject $TMP # 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 ] && [ ! $4 ] ; then echo " USAGE : $0 DRIVE ATAPI SPEED TEMP-IMG" echo " EXAM1 : $0 /dev/hdb ATAPI:0,1,0 4 /tmp/x.bin" exit 1 fi DEV=$1 ATA=$2 SPEED=$3 TMP=$4 #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
ต่อไปแก้ไขไฟล์ /etc/inittab ให้มาเรียกใช้โปรแกรม d.inittab-cpcd ตอนเปิดเครื่อง
# vi /etc/inittab
(ไปบรรทัดล่างสุด กด G)
... D1:2345:once:/root/d.inittab-cpcd
เสร็จแล้วก็รีบูตทดสอบได้เลยครับ
update: 49-11-25
cdrecord เติมพารามิเตอร์ gracetime=2
update: ubuntu edgy
edgy ใช้แพกเกจ upstart แทน sysvinit ทำให้บูตเร็วขึ้น
upstart ไม่ใช้ไฟล์ /etc/inittab แต่ใช้สคริปต์ใน /etc/event.d แทน
เราต้องสร้างสคริปต์ สมมุติว่าชื่อ cpcd เอาไว้ใน /etc/event.d
(สคริปต์นี้ ห้ามรันได้ คือแอตทริบิวต์ x ต้องไม่ถูกเซ็ต)
$ sudo vi /etc/event.d/cpcd
# start on runlevel-2 start on runlevel-3 start on runlevel-4 start on runlevel-5 # stop on shutdown # exec /root/d.inittab-cpcd console output
รีบูตเครื่องก็ใช้ได้
update: 49-11-28
มีปัญหากับไดร์ฟ
- Liteon SOHR-5239V 2$0D
- Liteon SOHR-5239S 2$0B
ไม่สามารถอ่านดิสก์แบบ multisession ที่ถูก overburn ได้ (เช่นแผ่น VCD)
ยังแก้ไม่ตก
- Printer-friendly version
- Log in or register to post comments
- 8392 reads
Recent comments