a53cf77e3f
Fixes FS#10614 sfdisk and the kernel cannot accurately detect disk geometry from the disk image file, causing automatic partition size calculations to fail. The whole partition table is now calculated in mkusbimg rather than letting sfdisk do it. mkusbimg doesn't directly use losetup anymore either, eliminating some code. This also fixes issues with needing to make the partition much larger than necessary, so image size has been minimized. Signed-off-by: Simo Leone <simo@archlinux.org>
79 lines
1.9 KiB
Bash
Executable File
79 lines
1.9 KiB
Bash
Executable File
#!/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"
|