Add the mkblankimage.sh utility to the utils directory.
This commit is contained in:
parent
74f10be526
commit
d6b229ea0f
1 changed files with 219 additions and 0 deletions
219
util/mkblankimage.sh
Normal file
219
util/mkblankimage.sh
Normal file
|
@ -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;
|
Loading…
Reference in a new issue