#!/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/>. # 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 DISKIMG="${2}" IMGROOT="${1}" TMPDIR=$(mktemp -d) FSIMG=$(mktemp) # ext2 overhead's upper bound is 6% # empirically tested up to 1GB rootsize=$(du -bs ${IMGROOT}|cut -f1) IMGSZ=$(( (${rootsize}*106)/100/512 + 1)) # image size in sectors # create the filesystem image file dd if=/dev/zero of="$FSIMG" bs=512 count="$IMGSZ" # create a filesystem on the image mke2fs -m 0 -F "$FSIMG" # mount the filesystem and copy data mount -o loop "$FSIMG" "$TMPDIR" cp -a "$IMGROOT"/* "$TMPDIR" # unmount filesystem umount "$TMPDIR" # add sectors 0-62, then glue together dd if=/dev/zero of="$DISKIMG" bs=512 count=63 cat "$FSIMG" >> "$DISKIMG" # create a partition table # if this looks like voodoo, it's because it is sfdisk -uS -f "$DISKIMG" << EOF 63,$IMGSZ,83,* 0,0,00 0,0,00 0,0,00 EOF # install grub on the image grub --no-floppy --batch << EOF device (hd0) $DISKIMG root (hd0,0) setup (hd0) EOF # all done :) rm -fr "$TMPDIR" "$FSIMG"