debian: เครื่องคัดลอกแผ่นซีดี

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

สเปคเครื่องเก่าคือ Celeron 850MHz (เครื่องตรวจสอบได้ 600MHz), RAM 128MB, HD 8G (เป็น /dev/hda)
ลงทุนซื้อใหม่คือ CD-Writer 3 ตัว ตัวละ 630 บาท
เนื่องจากจะไม่มีจอภาพ จึงจะใช้เสียงเป็นตัวแจ้งสถานะ

จะทำให้มีการทำงานคือ

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

หมายเหตุ

  • เนื่องจากเป็นการทำงานแบบขนาน ทุกไดร์ฟจึงทำงานเป็นอิสระ
  • กำหนดให้ความเร็วในการเขียนเป็นแค่ 8x เพื่อให้ฮาร์ดดิสก์อ่านข้อมูลได้ทัน และเพิ่มความคงทนของข้อมูล
  • แผ่นต้นฉบับควรเป็นแผ่นที่ดี ถึงดีมาก ผลจึงจะออกมาดี

วิธีการสร้าง
เริ่มด้วยติดตั้งเดเบียน 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

เสร็จแล้วก็รีบูตทดสอบได้เลยครับ

อ้างอิง

ท่านใดเก่งเชลล์สคริปต์ฝากช่วยปรับปรุง และเผยแพร่ ด้วยนะครับ

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

จะรีไซเคิลเครื่องเก่า มาทำเครื่องคัดลอกซีดีเพื่อถวายวัด

สเปคเครื่องเก่าคือ AMD Sempron(tm) 2000+, RAM 512MB, HD 40G (เป็น /dev/sda)
ลงทุนซื้อใหม่คือ CD-Writer 4 ตัว ตัวละ 545 บาท (IDE 3 และ SATA 1)
เนื่องจากจะไม่มีจอภาพ จึงจะใช้เสียงเป็นตัวแจ้งสถานะ

จะทำให้มีการทำงานคือ

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

หมายเหตุ

  • เนื่องจากเป็นการทำงานแบบขนาน ทุกไดร์ฟจึงทำงานเป็นอิสระ
  • กำหนดให้ความเร็วในการเขียนเป็นแค่ 1x เพื่อให้ฮาร์ดดิสก์อ่านข้อมูลได้ทัน และเพิ่มความคงทนของข้อมูล
  • แผ่นที่เป็นเสียง Audio อ่านช้ามาก

ธีการสร้าง

เริ่มด้วยติดตั้งเดเบียน squeeze แบบไม่ติดตั้งอะไรเพิ่มเติมเลย
ดามด้วยเอาแพกเกจที่จำเป็นที่สคริปต์เราต้องเรียกใช้ คือ

  • eject สำหรับดีดถาดเข้า/ออก
  • setcd สำหรับตรวจสถานะถาด และ
  • cdrdao สำหรับการคัดลอกและเขียนข้อมูล
    • # 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

ปรับปรุงจาก 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 และเขียนด้วยความเร็วต่ำสุดที่เป็นไปได้ ทั้งนี้เพื่อให้แผ่นมีความทนทานใช้งานได้ยาวนาน

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

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

  • แก้ปัญหาแผ่นธรรมดาอ่านผิดพลาด ด้วยการพยายามแยกแผ่น
    • ถ้าเป็นตระกูล VCD ซึ่งเป็น multitrack ใช้ readcd+cdrecord -clone
    • แต่ถ้าเป็นพวก mp3 ธรรมดา ใช้ dd+cdrecord แบบ normal
  • เนื่องจากทดสอบด้วย debian-desktop (etch) เลยต้องเพิ่มฟังก์ชั่นการยกเลิกการเมาต์อัตโนมัติด้วย
  • ฝากทดสอบและช่วยปรับปรุงให้ด้วยครับ

# 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