summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimo Leone <simo@archlinux.org>2008-03-30 02:49:47 -0500
committerSimo Leone <simo@archlinux.org>2008-03-30 02:49:47 -0500
commit97ed563f00fc6cd4be3f91041fe455529bc1c89c (patch)
tree023c8fb081f0d39da824489c70290efcadeffa16
parenta278dabe5541bdd6e05ff12710ef5e47973e3b9e (diff)
Added USB image creation script
mkusbimg creates bootable raw disk images that can be written to USB devices. It's intended to be on the same functional level as mkisofs. Signed-off-by: Simo Leone <simo@archlinux.org>
-rwxr-xr-xmkusbimg98
1 files changed, 98 insertions, 0 deletions
diff --git a/mkusbimg b/mkusbimg
new file mode 100755
index 0000000..6a41f4c
--- /dev/null
+++ b/mkusbimg
@@ -0,0 +1,98 @@
+#!/bin/bash
+#
+# mkusbimg - creates a bootable disk image
+# Copyright (C) 2008 Simo Leone <simo@archlinux.org>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# next_avail_loop()
+# prints the next available loopback device
+# returns 0 on success
+# 1 on failure
+# XXX: this is only necessary because
+# the cryptoloop patch for losetup
+# destroys losetup -f
+next_avail_loop()
+{
+ for i in /dev/loop/*; do
+ echo `losetup -a|cut -d':' -f1` | grep -q $i
+ if [ $? -eq 1 ]; then
+ echo $i
+ return 0
+ fi
+ done
+ return 1
+}
+
+# usage(exitvalue)
+# outputs a usage message and exits with value
+APPNAME=$(basename "${0}")
+usage()
+{
+ echo "usage: ${APPNAME} <imageroot> <imagefile>"
+ exit $1
+}
+
+##################################################
+
+if [ $# -ne 2 ]; then
+ usage 1
+fi
+
+IMG="${2}"
+IMGROOT="${1}"
+LOOPDEV=$(next_avail_loop)
+TMPDIR=$(mktemp -d)
+
+# TODO: there are better ways to do this
+# than adding 5MB to the rootsize
+# IMGSZ >= filesystem overhead + rootsize + 512bytes
+# must hold or there will be insufficient space
+IMGSZ=$(( $(du -ms ${IMGROOT}|cut -f1) + 5 ))
+
+# create the image file
+dd if=/dev/zero of="$IMG" bs=1M count="$IMGSZ"
+
+# loop mount the disk image
+losetup "$LOOPDEV" "$IMG"
+
+# create a partition table
+# if this looks like voodoo, it's because it is
+echo "63,,,*,"|sfdisk -uS "$LOOPDEV"
+
+# loop mount the partition we just made
+# that magic number (offset in bytes to first partition) is more voodoo
+losetup -d "$LOOPDEV"
+losetup -o32256 "$LOOPDEV" "$IMG"
+
+# create a filesystem on our partition
+mke2fs -m 0 "$LOOPDEV"
+
+# mount the filesystem and copy data
+mount "$LOOPDEV" "$TMPDIR"
+cp -a "$IMGROOT"/* "$TMPDIR"
+
+# unmount filesystem and loopback
+umount "$TMPDIR"
+losetup -d "$LOOPDEV"
+
+# install grub on the image
+grub --no-floppy --batch << EOF
+device (hd0) $IMG
+root (hd0,0)
+setup (hd0)
+EOF
+
+# all done :)
+rm -fr "$TMPDIR"