After some internet searching I failed to find any other suitable tool for free that could do what I wanted it to; so I decided to create one. My involvement in the MythDora project fueled the need for a tool that could burn multiple copies of disks across multiple burners un-attended. Many of the gui tools can burn multiple copies, but some have issues with verification, plus no tool that I found could address more than 1 burning drive simultaneously.
The tool is called bulk-burn.sh and you can grab it below.
The usage is quite simple ./bulk-burn.sh /path/to/iso [number of copies]
The version being uploaded has a key part commented out however, as I found out the hard-way my old system that I installed 4 DVD burners in does not have the i/o capability needed to buffer and burn 4 disks at a time reliably.
On line 97 you'll find an ampersand that is commented out, and this will allow jobs to fall into the background if you want more than one drive in use at a time. Otherwise, the script will burn one disk at a time and eject the completed disk before moving on to the next available drive.
You'll notice in the beginning of execution the script will generate md5sum values of the isos, and it'll also store these values in your home directory. This will allow you to come back to an ISO you've burnt previously and for-go the extra time for md5sum.
Keep in mind that growisofs, md5sum, and dd are required.
Enjoy -
Pisani
Code:
#!/bin/bash
#Ryan Pisani - March, 20th 2010
#Please give feedback to mythdora -at- thepisanis dot com
PATH=/bin:/sbin:/usr/sbin:/usr/bin
#Incoming options
ISO="$1"
COUNT="$2"
SCRIBE="3"
if [[ ! -e $ISO || -z $COUNT ]]; then
echo "Usage: $0 /path/to/image.iso count"
exit
fi
#Get basename of the iso file to use in caches
ISONAME=$(basename $ISO)
#Determine how many writers we have
DRIVES=($(ls /dev/sr* | grep -v sr0))
#DRIVES=($(ls /dev/sr*))
DRIVECOUNT=$(echo $DRIVES | wc -w)
#Check to see if there is a cache file setup already for the iso
if [[ ! -d "$HOME/.bulk-burn" ]]; then
mkdir -p $HOME/.bulk-burn
fi
#Check to see if the cache exists for this iso, if not we create one
if [[ ! -e "$HOME/.bulk-burn/$ISONAME.isosum" ]]; then
#echo that we're generating md5sums
echo -e "\nGenerating md5sum & block counts for the ISO. This may take a bit..\n"
#First get md5 information on the target iso to be used later in verification
ISOSUM=$(md5sum $ISO | awk '{print $1}')
ISOBLKS=$(ls -l $ISO | awk '{print $5}')
BLKCNT=$(echo $[ISOBLKS / 2048])
echo "$ISOSUM" >$HOME/.bulk-burn/$ISONAME.isosum
echo "$BLKCNT" >$HOME/.bulk-burn/$ISONAME.blkcnt
else
#Retrieve the existing values
ISOSUM=$(cat $HOME/.bulk-burn/$ISONAME.isosum)
BLKCNT=$(cat $HOME/.bulk-burn/$ISONAME.blkcnt)
fi
echo -e "\nMD5SUM: $ISOSUM BLOCKS: $ISOBLKS BLKCNT: $BLKCNT\n"
#lets start burning the images
while [[ $COUNT -gt 0 ]]; do
for DRIVE in ${DRIVES[@]}; do
if [[ $COUNT -gt 0 ]]; then
DRV=$(basename $DRIVE)
#Check to see if a disk is there already
if ! ( lshal | grep -A1 volume_empty_dvd_r | grep block.device | grep $DRIVE ); then
echo "Please insert a blank disk into $DRIVE"
eject $DRIVE
read -p "Press enter to continue"
fi
until [[ ! -e "/var/tmp/lock.$DRV" ]]; do
echo "Waiting for $DRIVE to be free"
sleep 30
done
#Write the disk and background it so we can move on to another disk
(touch /var/tmp/lock.$DRV;
growisofs -Z $DRIVE=$ISO;
echo -e "\nVerifying burned disk.. this may take a few minutes\n"
BRNSUM=$(dd if=$DRIVE bs=2048 count=$BLKCNT 2>/dev/null| md5sum | awk '{print $1}');
echo -e "$DRIVE:\nISO:$ISOSUM\nDisk:$BRNSUM\n"
if [[ $BRNSUM != $ISOSUM ]]; then
echo "Burn on drive $DRIVE failed to verify"
fi
rm -rf /var/tmp/lock.$DRV; eject $DRIVE) #& #uncomment ampersan to allow concurrent background writing on multiple drives
fi
sleep 30;
let COUNT="$COUNT - 1"
done
done
#Lets wait for child processes to exit before we exit
wait