changeset c45e8cb7f4ea in /z/repo/m5
details: http://repo.m5sim.org/m5?cmd=changeset;node=c45e8cb7f4ea
description:
        Add the mkblankimage.sh utility to the utils directory.

diffstat:

1 file changed, 109 insertions(+)
util/mkblankimage.sh |  109 ++++++++++++++++++++++++++++++++++++++++++++++++++

diffs (223 lines):

diff -r 88038cdbb9e1 -r c45e8cb7f4ea util/mkblankimage.sh
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/util/mkblankimage.sh      Wed Dec 03 04:57:55 2008 -0800
@@ -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 <<EOF
+0,
+;
+;
+;
+EOF
+
+# Un-losetup the image
+run_priv $LOSETUP -d /dev/loop0
+
+# Mount the image with an offset and make the filesystem
+echo
+echo "Remounting image and formatting..."
+let BASE_OFFSET=63*512
+
+run_priv $LOSETUP -o $BASE_OFFSET /dev/loop0 $IMAGE_FILE
+
+run_priv $MKE2FS /dev/loop0
+
+# If a root path was specified then copy the root path into the image
+if [ ! -z "$ROOT_PATH" ]; then
+    echo "Copying root from $ROOT_PATH to image file"
+
+    run_priv $MKDIR -p /tmp/mnt
+
+    run_priv $MOUNT /dev/loop0 /tmp/mnt
+
+    run_priv $CP -a $ROOT_PATH/* /tmp/mnt
+
+    run_priv $CHOWN -R root.root /tmp/mnt
+
+    # run extra permissions while disk is mounted
+    TOPDIR=`pwd`
+    cd /tmp/mnt
+    i=2
+    while [ $i -le $# ]; do
+        run_priv ${!i}
+        let i=i+1
+    done
+    cd $TOPDIR
+
+    run_priv $UMOUNT /tmp/mnt
+fi
+
+run_priv $LOSETUP -d /dev/loop0
+
+
+if [ $MOUNT_IT -eq 1 ]; then
+        run_priv mount -o loop,offset=$BASE_OFFSET $IMAGE_FILE /tmp/mnt
+else
+        echo
+        echo "Disk image creation complete."
+        echo "To mount the image, run the following commands:"
+        echo "# $MOUNT -o loop,offset=$BASE_OFFSET $IMAGE_FILE /mount/point"
+        echo
+        echo "And to unmount the image, run:"
+        echo "# $UMOUNT /mount/point"
+fi;
_______________________________________________
m5-dev mailing list
m5-dev@m5sim.org
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to