จะรีไซเคิลเครื่องเก่า มาทำเครื่องคัดลอกซีดีเพื่อถวายวัด
ถ้าซื้อเครื่องคัดลอกซีดีตัวจริงใหม่ราคาประมาณหมื่นเศษ
ของเราใช้รีไซเคิลเอา ราคาไม่เกินสองพันบาท (คิดเฉพาะอุปกรณ์ที่ซื้อใหม่)
สเปคเครื่องเก่าคือ 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