From d6b229ea0f46de3a622ebb1ef86cb526625ebc2e Mon Sep 17 00:00:00 2001 From: Nathan Binkert Date: Wed, 3 Dec 2008 04:57:55 -0800 Subject: [PATCH] Add the mkblankimage.sh utility to the utils directory. --- util/mkblankimage.sh | 219 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 219 insertions(+) create mode 100644 util/mkblankimage.sh diff --git a/util/mkblankimage.sh b/util/mkblankimage.sh new file mode 100644 index 000000000..43a3cca29 --- /dev/null +++ b/util/mkblankimage.sh @@ -0,0 +1,219 @@ +#!/bin/sh +# +# 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 <