| #! /bin/sh |
| # grub-image - Create a GRUB boot filesystem image and tarball |
| # Gordon Matzigkeit <gord@fig.org>, 2000-07-25 |
| # |
| # Copyright (C) 2000 Free Software Foundation, Inc. |
| # |
| # This file 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 2 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, write to the Free Software |
| # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
| |
| prefix=@prefix@ |
| exec_prefix=@exec_prefix@ |
| sbindir=@sbindir@ |
| datadir=@datadir@ |
| PACKAGE=@PACKAGE@ |
| host_cpu=@host_cpu@ |
| host_os=@host_os@ |
| host_vendor=@host_vendor@ |
| context=${host_cpu}-${host_vendor} |
| pkgdatadir=${datadir}/${PACKAGE}/${context} |
| |
| mke2fs=/sbin/mke2fs |
| |
| progname=`echo "$0" | sed 's%^.*/%%'` |
| thisdir=`echo "$0" | sed 's%/[^/]*$%%'` |
| test "X$thisdir" = "X$0" && thisdir=. |
| |
| # See if we were invoked from within the build directory, and if so, |
| # use the built files rather than the installed ones. |
| if test -f $thisdir/../stage2/stage2.c; then |
| grub_shell="$thisdir/../grub/grub" |
| stage1dir="$thisdir/../stage1" |
| stage2dir="$thisdir/../stage2" |
| else |
| grub_shell=${sbindir}/grub |
| stage1dir="$pkgdatadir" |
| stage2dir="$pkgdatadir" |
| fi |
| |
| # Exit on any error. |
| set -e |
| |
| # Get GRUB's version from the Grub shell, since we use the |
| # installed files. |
| VERSION=`$grub_shell --version | sed 's/^.* //'` |
| test "X$VERSION" != X |
| |
| bootdir=${PACKAGE}-${VERSION}-${context} |
| image=$bootdir.ext2fs |
| |
| # Create the tarball. |
| if test ! -f $bootdir.tar.gz; then |
| echo "# Creating \`$bootdir.tar.gz'" |
| mkdir -p $bootdir/boot/grub |
| cp -p $stage1dir/stage1 $stage2dir/*_stage1_5 $stage2dir/stage2 \ |
| $bootdir/boot/grub |
| test ! -f menu.lst || cp -p menu.lst $bootdir/boot/grub |
| trap "rm -f $bootdir.tar.gz" 0 |
| GZIP=-9 tar -zcf $bootdir.tar.gz $bootdir |
| trap '' 0 |
| rm -rf $bootdir |
| fi |
| |
| # Create a new filesystem image of the specified size. |
| if test ! -f $image; then |
| tarsize=`zcat $bootdir.tar.gz | wc -c` |
| |
| # Add about 30% (20% overhead plus 10% breathing room), and convert |
| # to kilobytes. This factor was determined empirically. |
| SIZE=`expr $tarsize \* 130 / 100 / 1024`k |
| echo "# Creating $SIZE disk image \`$image'" |
| trap "rm -f $image" 0 |
| dd if=/dev/zero of=$image bs=$SIZE count=1 >/dev/null |
| $mke2fs -F $image |
| trap '' 0 |
| fi |
| |
| |
| # Attempt to mount the image. |
| echo "# Mounting \`$image'" |
| test -d $bootdir || mkdir $bootdir |
| case "$host_os" in |
| gnu*) |
| settrans -a $bootdir /hurd/ext2fs $image |
| umount="settrans -a $bootdir" |
| ;; |
| |
| linux*) |
| # This requires running as root, and using the loop device. |
| i=0 |
| while test -e /dev/loop$i; do |
| if /sbin/losetup /dev/loop$i $image; then |
| break |
| fi |
| i=`expr $i + 1` |
| done |
| |
| # Silly losetup doesn't report an error! |
| mount /dev/loop$i $bootdir |
| umount="umount $bootdir && /sbin/losetup -d /dev/loop$i && trap '' 0" |
| ;; |
| |
| *) |
| echo "$progname: Mounting \`$image' under \`$host_os' is not supported" 1>&2 |
| exit 1 |
| ;; |
| esac |
| trap "$umount" 0 |
| |
| # Extract our tarball into the image, then unmount it. |
| echo "# Copying files into \`$image':" |
| tar -zxvf $bootdir.tar.gz |
| |
| echo "# \`$image' usage:" |
| df $bootdir |
| eval $umount |
| rmdir $bootdir || : |
| |
| # Use the GRUB shell to properly set up GRUB on the image. |
| echo "# Installing GRUB in \`$image'" |
| cat <<EOF | $grub_shell --batch --device-map=/dev/null |
| device (fd0) $image |
| root (fd0) |
| install /boot/grub/stage1 (fd0) /boot/grub/stage2 |
| quit |
| EOF |
| |
| exit 0 |