219 lines
4.4 KiB
Bash
Executable file
219 lines
4.4 KiB
Bash
Executable file
#!/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 <<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;
|