จะรีไซเคิลเครื่องเก่า มาทำเครื่องคัดลอกซีดีเพื่อถวายวัด
ถ้าซื้อเครื่องคัดลอกซีดีตัวจริงใหม่ราคาประมาณหมื่นเศษ
ของเราใช้รีไซเคิลเอา ราคาไม่เกินสองพันบาท (คิดเฉพาะอุปกรณ์ที่ซื้อใหม่)
สเปคเครื่องเก่าคือ Celeron 850MHz (เครื่องตรวจสอบได้ 600MHz), RAM 128MB, HD 8G (เป็น /dev/hda)
ลงทุนซื้อใหม่คือ CD-Writer 3 ตัว ตัวละ 630 บาท
เนื่องจากจะไม่มีจอภาพ จึงจะใช้เสียงเป็นตัวแจ้งสถานะ
จะทำให้มีการทำงานคือ
หมายเหตุ
วิธีการสร้าง
เริ่มด้วยติดตั้งเดเบียน etch แบบไม่ติดตั้งอะไรเพิ่มเติมเลย
(ผมใช้แผ่น sarge แล้วอัปเกรดเป็น etch เลือกใช้เคอร์เนล 2.6.18-3-686)
ดามด้วยเอาแพกเกจที่จำเป็นที่สคริปต์เราต้องเรียกใช้ คือ
eject สำหรับดีดถาดเข้า/ออก setcd สำหรับตรวจสถานะถาด และ cdrecord สำหรับการคัดลอกและเขียนข้อมูล
$ su
# aptitude install eject setcd cdrecord
หมายเหตุ สำหรับแพกเกจ cdrecord นั้น เป็นแพกเกจเสมือน ซึ่งจะไปติดตั้งแพกเกจจริงชื่อ wodim อีกทีนึง
ช่วงก่อนหน้านี้ แพกเกจ wodim มีความสามารถน้อยกว่า cdrecord ตัวจริงมาก bug ก็เยอะมาก
แต่ตอน etch ใกล้จะออกนี้ แพกเกจนี้มีความสามารถทัดเทียมแพกเกจจริงแล้ว สามารถนำมาใช้งานได้จริงเลยครับ
สร้างสคริปต์สำหรับให้ 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 "\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 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 "\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 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
เสร็จแล้วก็รีบูตทดสอบได้เลยครับ
อ้างอิง
ท่านใดเก่งเชลล์สคริปต์ฝากช่วยปรับปรุง และเผยแพร่ ด้วยนะครับ
จะรีไซเคิลเครื่องเก่า มาทำเครื่องคัดลอกซีดีเพื่อถวายวัด
สเปคเครื่องเก่าคือ AMD Sempron(tm) 2000+, RAM 512MB, HD 40G (เป็น /dev/sda)
ลงทุนซื้อใหม่คือ CD-Writer 4 ตัว ตัวละ 545 บาท (IDE 3 และ SATA 1)
เนื่องจากจะไม่มีจอภาพ จึงจะใช้เสียงเป็นตัวแจ้งสถานะ
จะทำให้มีการทำงานคือ
เริ่มด้วยติดตั้งเดเบียน squeeze แบบไม่ติดตั้งอะไรเพิ่มเติมเลย
ดามด้วยเอาแพกเกจที่จำเป็นที่สคริปต์เราต้องเรียกใช้ คือ
# aptitude install eject setcd cdrdao
สร้างสคริปต์สำหรับให้ rc.local เรียกใช้ตอนเปิดเครื่อง สำหรับให้อ่านแผ่นต้นฉบับ
ตั้งชื่อว่า d.rc-cpcd
# vi /usr/local/sbin/d.rc-cpcd
#!/bin/bash # CD COPIER PROGRAM # PREREQUISITE: # # aptitude install eject cdrdao setcd dvd+rw-tools # file: d.rc-cpcd d.func-cpcd # PUT d.rc-cpcd AND d.func-cpcd IN /usr/local/sbin # THEN CALL d.rc-cpcd FROM /etc/rc.local #VARIABLE SRC=/dev/sr0 #SOURCE DRIVE TOC=/tmp/toc.bin #TEMP.IMAGE FILE DSC=" /dev/sr0 /dev/sr1 /dev/sr2 /dev/sr3 " #DESTINATION DRIVE . /usr/local/sbin/d.common-func wait_read_close() { # MAX RETRY LOOP = 100 for (( i=0; i<=100; i++ )); do if setcd -i $SRC | grep 'CD tray is open' >> /dev/null; then # SLEEP 1 SECONDS beep_close elif setcd -i $SRC | grep 'Drive is not ready' >> /dev/null; then sleep 1 else if setcd -i $SRC | grep 'No disc is inserted' >> /dev/null; then break else #DO READ cdrdao read-cd --device $SRC --read-raw --datafile /tmp/data.bin $TOC return fi fi done eject -t $SRC /sbin/shutdown -h now return } rm -rf $TOC #CHECK 1ST CDR IS ORIGINAL CD THEN DUP. TO /tmp while ! [ -s $TOC ]; do eject $SRC echo "eject $SRC" wait_read_close $SRC beep done # CALL MULTIPLE INSTANCE IN $DSC DRIVES for i in $DSC; do if [ "$i" ]; then /usr/local/sbin/d.func-cpcd $i $TOC & fi done wait /sbin/shutdown -h now
อีกไฟล์นึงเป็นฟังก์ชั่นสำหรับเขียนซีดี ตั้งชื่อว่า d.func-cpcd
# vi /usr/local/sbin/d.func-cpcd
#!/bin/bash DEV=$1 TOC=$2 SPEED=1 . /usr/local/sbin/d.common-func 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 beep_write; sleep 3 elif setcd -i $DEV | grep 'Drive is not ready' >> /dev/null; then sleep 1 elif setcd -i $DEV | grep 'No disc' >> /dev/null; then # IF NO DISC INSERTED THEN BREAK exit 1 else # DO WRITE cdrdao write --device $DEV --speed $SPEED --overburn -n $TOC # LAST CHECK WRITING if setcd -i $DEV | grep 'error' >> /dev/null; then beep_error; sleep 3 eject $DEV else eject $DEV return fi fi done #END PROG eject -t $DEV exit 1 } if [ ! $1 ] && [ ! $2 ] ; then echo " USAGE : $0 DRIVE SPEED TEMP-IMG" echo " EXAM1 : $0 /dev/sr0 /tmp/toc.bin" exit 1 fi #CHECK IMAGE FILE if ! [ -f $TOC ] ; then echo " Image file $TOC does not existed" exit 1 fi #COPY TO NEW BLANK CD while [ -f $TOC ]; do eject $DEV wait_write_close beep_write done
และสุดท้ายคือไฟล์ฟังก์ชั่นที่ใช้ร่วมกัน
# vi /usr/local/sbin/d.common-func
#!/bin/bash beep() { echo -e "\a" } beep_close() { beep; sleep 1; } beep_write() { beep; sleep .15; beep } beep_error() { for i in `seq 1 6`; do beep; sleep .15; done }
ต่อไปแก้ไขไฟล์ /etc/rc.local ให้มาเรียกใช้โปรแกรม d.rc-cpcd ตอนเปิดเครื่อง
# vi /etc/rc.local
... /usr/local/sbin/d.rc-cpcd exit 0
เสร็จแล้วรีบูตทดสอบได้เลย
ปรับปรุงจาก debian: เครื่องคัดลอกแผ่นซีดี
ทำบนเดเบียน Lenny โดยจะปรับให้สามารถเขียนแผ่น DVD ได้ด้วย
มีการเปลี่ยนแปลงสคริปต์เล็กน้อย แต่คราวนี้ขอเขียนขั้นตอนแบบเริ่มใหม่ตั้งแต่ต้น
สมบัติของเครื่องที่นำมาใช้ทดสอบและรุ่นของเดเบียน
cpu: AMD Athlon (tm) XP 2400+
motherboard: ECS L7VMM2
ram: DDR 512M
harddisk: Seagate 10G เป็น /dev/hda
cdrom: 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 และเขียนด้วยความเร็วต่ำสุดที่เป็นไปได้ ทั้งนี้เพื่อให้แผ่นมีความทนทานใช้งานได้ยาวนาน
การทำงานของเครื่อง
เริ่มสร้างด้วย...
การติดตั้งเดเบียนแบบเปล่า ๆ ดูตัวอย่างจาก debianclub: การติดตั้ง 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
เสร็จแล้ว บูตเครื่องแล้วใช้ได้เลย
เที่ยวนี้มีเวลาทดสอบน้อย ฝากทดสอบกันเองนะครับ
ปรับปรุงครั้งที่ 1
# vi d.inittab-cpcd
#!/bin/bash # THIS IS THE CD COPIER PROGRAM # - REQUIRE PACKAGE: setcd eject cdrecord(wodim) # - PUT THE LINE # D1:2345:once:/root/d.inittab-cpcd # IN /etc/inittab THEN REBOOT # - PUT THESE 2 FILES IN /root # - RUN AS ROOT #if [ $USER != "ROOT" ]; then # su #fi DEV=/dev/hdb # SOURCE DRIVE TMP=/tmp/x.bin # TEMP IMAGE FILE SPEED=8 # WRITE SPEED MNT="/mnt/tmp" # TEMP MOUNT DIR beep() { echo -e "\a" } beeperror() { for i in `seq 1 6`; do beep; sleep .15; done } check_disk_type() { # RETURN 1=CLONE 2=NORMAL while mount | grep "$DEV "; do umount $DEV >> /dev/null; sleep 1; done if setcd -i $DEV | grep 'Disc found in drive: audio disc' >> /dev/null; then return 1; fi if ! [ -d $MNT ]; then mkdir $MNT; fi if mount | grep "$MNT "; then umount $MNT >> /dev/null; fi mount $DEV $MNT VAR=`ls $MNT | tr '[A-Z]' '[a-z]'` VAR=`echo $VAR | grep vcd | grep mpeg | grep segment | grep ext` while mount | grep "$DEV "; do umount $DEV >> /dev/null; sleep 1; done if [ "$VAR" == "" ]; then return 2; fi return 1 } wait_read_close() { # MAX RETRY LOOP = 100 for (( i=0; i<=100; i++ )) do umount $DEV if setcd -i $DEV | grep open >> /dev/null; then # SLEEP 3 SECONDS beep; sleep 3 else check_disk_type ISCLONE=$? if [ $ISCLONE -eq 1 ]; then readcd -clone dev=$DEV f=$TMP else dd if=$DEV of=$TMP fi return $ISCLONE fi done eject -t $1 /sbin/shutdown -h now return } # BEGIN MAIN rm -rf $TMP #CHECK 1ST CDR IS ORIGINAL CD THEN DUP. TO /tmp while ! [ -s $TMP ] do eject $DEV beep wait_read_close $DEV done ISCLONE=$? # CALL MULTIPLE INSTANCE TO DESTINATION DRIVES #d.func.cpcd DEVICE SPEED ISOFILE #KERNEL-2.6 /root/d.func-cpcd /dev/hdb $ISCLONE $SPEED $TMP & /root/d.func-cpcd /dev/hdc $ISCLONE $SPEED $TMP & /root/d.func-cpcd /dev/hdd $ISCLONE $SPEED $TMP & wait /sbin/shutdown -h now
# vi d.func-cpcd
#!/bin/bash # THIS IS THE CD COPIER PROGRAM # - REQUIRE PACKAGE: setcd eject cdrecord(wodim) # - PUT THE LINE # D1:2345:once:/root/d.inittab-cpcd # IN /etc/inittab THEN REBOOT # - PUT THESE 2 FILES IN /root # - RUN AS ROOT 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 while mount | grep "$DEV "; do umount $DEV >> /dev/null; sleep 1; done if [ $ISCLONE -eq 1 ]; then cdrecord -clone gracetime=2 -raw96r dev=$DEV speed=$SPEED driveropts=burnfree -overburn -multi -xa1 -eject $TMP else cdrecord gracetime=2 dev=$DEV speed=$SPEED driveropts=burnfree -overburn -eject $TMP fi # LAST CHECK WRITING if setcd -i $DEV | grep 'error' >> /dev/null; then beeperror; sleep 3 exit 1 else eject $DEV return fi fi done #END PROG eject -t $1 exit 1 } if [ ! $1 ] && [ ! $2 ] && [ ! $3 ] && [ ! $4 ] ; then echo " USAGE : $0 DRIVE ISCLONE(1=CLONE,2=NORMAL) SPEED TEMP-IMG" echo " EXAM1 : $0 /dev/hdb 1 4 /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 beepwrite done