if [ ! -f "$PRODUCTPATH/images/diskboot.img" ]; then echo "! Disk image not found: $PRODUCTPATH/images/diskboot.img" exit 1 fi if [ ! -f "$PRODUCTPATH/iso/$PRODUCTCODE-$VERSION.iso" ]; then echo "! ISO image not found: $PRODUCTPATH/iso/$PRODUCTCODE-$VERSION.iso" exit 1 fi # FIXME -- rename "iso" directory? # Output image filename image_filename=$PRODUCTPATH/iso/usbboot.img # Image mount point image_mount=/var/tmp/usbmnt mkdir -p image_mount # Total image size in MiB image_size=900 # Partition editor (parted) v1.8.8 or above is required parted=/sbin/parted if [ -x "$(dirname $0)/parted" ]; then parted="$(dirname $0)/parted" echo "- Using local parted: $parted" elif [ ! -x "$parted" ]; then echo "! Required parted not found." exit 1 fi # Create empty image file echo "- Creating $image_size MiB image: $image_filename" dd if=/dev/zero of=$image_filename bs=1M count=$image_size || exit 1 # Create msdos partition table echo "- Creating MS-DOS disk label" $parted -s $image_filename mklabel msdos || exit 1 # Create primary partition echo "- Creating primary parition" $parted -s $image_filename mkpart primary 0 $image_size || exit 1 # Make first partition bootable echo "- Enabling boot on first partition" $parted -s $image_filename set 1 boot on echo $parted -s $image_filename print # Find first partition's offset in bytes partition_offset=$($parted -sm $image_filename unit b print | egrep '^1:' | cut -d : -f 2 | sed -e 's/B//') [ -z "$partition_offset" ] && exit 1 echo "- First partition offset: $partition_offset bytes" # Find first available loop device for loop_id in $(seq 0 7); do losetup /dev/loop$loop_id || break done losetup /dev/loop$loop_id && exit 1 echo "- Using loop device: /dev/loop$loop_id" # Attach loop device to first partition losetup -o $partition_offset /dev/loop$loop_id $image_filename || exit 1 # Make FAT16 filesystem echo "- Creating FAT16 filesystem" mkdosfs -F 16 /dev/loop$loop_id || exit 1 # Mount filesystem sync mkdir -vp $image_mount mount /dev/loop$loop_id $image_mount || exit 1 # Mount diskboot.img mkdir -vp $image_mount-diskboot mount -o loop,ro $PRODUCTPATH/images/diskboot.img $image_mount-diskboot || exit 1 # Copy diskboot.img contents to usbboot.img echo "- Copying diskboot.img contents" cp -vr $image_mount-diskboot/* $image_mount || exit 1 # Copy ISO image to usbboot.img echo "- Copying ISO image" cp -v $PRODUCTPATH/iso/$PRODUCTCODE-$VERSION.iso $image_mount || exit 1 # Unmount umount $image_mount-diskboot umount $image_mount losetup -d /dev/loop$loop_id # Install syslinux echo "- Installing syslinux" syslinux -o $partition_offset $image_filename || exit 1 sync echo "* Success: $image_filename"