#!/bin/bash # # makeblankimage.sh # Make a blank M5 disk image # while getopts "m" OPT do case "$OPT" in m) MOUNT_IT=1 esac done DEBUG=0 if [ $DEBUG -ne 0 ]; then set -x -e OUTPUT="" else OUTPUT="> /dev/null 2>&1" fi abort() { echo $@ exec /bin/false } find_prog() { PROG_PATH=`which $1` if [ $? -ne 0 ]; then abort "Unable to find program $1, check your PATH variable" fi echo $PROG_PATH } run_priv() { if [ "$HAVE_SUDO" = "y" ]; then eval $SUDO $@ $OUTPUT else eval $@ $OUTPUT fi if [ $? -ne 0 ]; then abort "Failed to run $@ as root" fi } usage() { abort "Usage: $0 [root-path to copy] [extra ownership commands ...]" } # Setup PATH to look in the sbins export PATH=$PATH:/sbin:/usr/sbin # Get all of the programs needed, or exit DD=`find_prog dd` SFDISK=`find_prog sfdisk` LOSETUP=`find_prog losetup` SUDO=`find_prog sudo` MKE2FS=`find_prog mke2fs` MKDIR=`find_prog mkdir` MOUNT=`find_prog mount` UMOUNT=`find_prog umount` WHOAMI=`find_prog whoami` CP=`find_prog cp` CHOWN=`find_prog chown` # Prompt for the root password, if needed CUR_USER=`$WHOAMI` if [ $# -ge 1 ]; then if [ ! $MOUNT_IT ]; then ROOT_PATH=$1 if [ ! -d $ROOT_PATH ]; then usage fi else ROOT_PATH="" fi else ROOT_PATH="" fi if [ ! "$CUR_USER" = "root" ]; then echo -n "Do you have sudo access? [y/n] " read HAVE_SUDO if [ ! "$HAVE_SUDO" = "y" ]; then abort "You must have sudo access or run this script as root" fi fi echo -n "How large do you want this disk image (in MB): " read USER_SIZE_MB # size in bytes = SIZE_MB * 1024 * 1024 # size in blocks = SIZE_BYTE / 512 let BLK_SIZE=$USER_SIZE_MB*1024*2 let MAX_LBA=16383*16*63 if [ $BLK_SIZE -ge $MAX_LBA ]; then CYLS=16383 HEADS=16 SECTORS=63 else # Set Sectors if [ $BLK_SIZE -ge 63 ]; then SECTORS=63 else SECTORS=$BLK_SIZE fi # Set Heads let HEAD_SIZE=$BLK_SIZE/$SECTORS if [ $HEAD_SIZE -ge 16 ]; then HEADS=16 else HEADS=$BLK_SIZE fi # Set Cylinders let SEC_HEAD=$SECTORS*$HEADS let CYLS=$BLK_SIZE/$SEC_HEAD fi # Recalculate number of sectors let BLK_SIZE=$CYLS*$HEADS*$SECTORS # Get the name of the file and directory to build in echo -n "What directory would you like to build the image in? " read IMAGE_DIR if [ ! -d $IMAGE_DIR ]; then abort "The directory $IMAGE_DIR does not exist" fi echo -n "What would you like to name the image? " read IMAGE_NAME IMAGE_FILE=$IMAGE_DIR/$IMAGE_NAME # DD the blank image echo echo "dd'ing the blank image (this make take a while)..." eval $DD if=/dev/zero of=$IMAGE_FILE bs=512 count=$BLK_SIZE $OUTPUT if [ $? -ne 0 ]; then abort "Unable to create the blank image $IMAGE_NAME in $IMAGE_DIR" fi # losetup the image with no offset to do the fdisk echo echo "Binding the image and partitioning..." run_priv $LOSETUP /dev/loop0 $IMAGE_FILE if [ $? -ne 0 ]; then abort "losetup to /dev/loop0 failed, make sure nothing is setup on loop0 (check by typing 'mount') " fi # fdisk the image run_priv $SFDISK --no-reread -D -C $CYLS -H $HEADS -S $SECTORS /dev/loop0 <