1*1b8adde7SWilliam Kucharski#! /bin/sh 2*1b8adde7SWilliam Kucharski# grub-image - Create a GRUB boot filesystem image and tarball 3*1b8adde7SWilliam Kucharski# Gordon Matzigkeit <gord@fig.org>, 2000-07-25 4*1b8adde7SWilliam Kucharski# 5*1b8adde7SWilliam Kucharski# Copyright (C) 2000, 2002 Free Software Foundation, Inc. 6*1b8adde7SWilliam Kucharski# 7*1b8adde7SWilliam Kucharski# This file is free software; you can redistribute it and/or modify it 8*1b8adde7SWilliam Kucharski# under the terms of the GNU General Public License as published by 9*1b8adde7SWilliam Kucharski# the Free Software Foundation; either version 2 of the License, or 10*1b8adde7SWilliam Kucharski# (at your option) any later version. 11*1b8adde7SWilliam Kucharski# 12*1b8adde7SWilliam Kucharski# This program is distributed in the hope that it will be useful, but 13*1b8adde7SWilliam Kucharski# WITHOUT ANY WARRANTY; without even the implied warranty of 14*1b8adde7SWilliam Kucharski# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15*1b8adde7SWilliam Kucharski# General Public License for more details. 16*1b8adde7SWilliam Kucharski# 17*1b8adde7SWilliam Kucharski# You should have received a copy of the GNU General Public License 18*1b8adde7SWilliam Kucharski# along with this program; if not, write to the Free Software 19*1b8adde7SWilliam Kucharski# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 20*1b8adde7SWilliam Kucharski 21*1b8adde7SWilliam Kucharskiprefix=@prefix@ 22*1b8adde7SWilliam Kucharskiexec_prefix=@exec_prefix@ 23*1b8adde7SWilliam Kucharskisbindir=@sbindir@ 24*1b8adde7SWilliam Kucharskilibdir=@libdir@ 25*1b8adde7SWilliam KucharskiPACKAGE=@PACKAGE@ 26*1b8adde7SWilliam Kucharskihost_cpu=@host_cpu@ 27*1b8adde7SWilliam Kucharskihost_os=@host_os@ 28*1b8adde7SWilliam Kucharskihost_vendor=@host_vendor@ 29*1b8adde7SWilliam Kucharskicontext=${host_cpu}-${host_vendor} 30*1b8adde7SWilliam Kucharskipkglibdir=${libdir}/${PACKAGE}/${context} 31*1b8adde7SWilliam Kucharski 32*1b8adde7SWilliam Kucharskimke2fs=`which mke2fs` 33*1b8adde7SWilliam Kucharski 34*1b8adde7SWilliam Kucharskiprogname=`echo "$0" | sed 's%^.*/%%'` 35*1b8adde7SWilliam Kucharskithisdir=`echo "$0" | sed 's%/[^/]*$%%'` 36*1b8adde7SWilliam Kucharskitest "X$thisdir" = "X$0" && thisdir=. 37*1b8adde7SWilliam Kucharski 38*1b8adde7SWilliam Kucharski# See if we were invoked from within the build directory, and if so, 39*1b8adde7SWilliam Kucharski# use the built files rather than the installed ones. 40*1b8adde7SWilliam Kucharskiif test -f $thisdir/../stage2/stage2; then 41*1b8adde7SWilliam Kucharski grub_shell="$thisdir/../grub/grub" 42*1b8adde7SWilliam Kucharski stage1dir="$thisdir/../stage1" 43*1b8adde7SWilliam Kucharski stage2dir="$thisdir/../stage2" 44*1b8adde7SWilliam Kucharskielse 45*1b8adde7SWilliam Kucharski grub_shell=${sbindir}/grub 46*1b8adde7SWilliam Kucharski stage1dir="$pkglibdir" 47*1b8adde7SWilliam Kucharski stage2dir="$pkglibdir" 48*1b8adde7SWilliam Kucharskifi 49*1b8adde7SWilliam Kucharski 50*1b8adde7SWilliam Kucharski# Exit on any error. 51*1b8adde7SWilliam Kucharskiset -e 52*1b8adde7SWilliam Kucharski 53*1b8adde7SWilliam Kucharski# Get GRUB's version from the Grub shell, since we use the 54*1b8adde7SWilliam Kucharski# installed files. 55*1b8adde7SWilliam KucharskiVERSION=`$grub_shell --version | sed -e 's/^.* \([0-9.]*\).*$/\1/'` 56*1b8adde7SWilliam Kucharskitest "X$VERSION" != X 57*1b8adde7SWilliam Kucharski 58*1b8adde7SWilliam Kucharskibootdir=${PACKAGE}-${VERSION}-${context} 59*1b8adde7SWilliam Kucharskiimage=$bootdir.ext2fs 60*1b8adde7SWilliam Kucharski 61*1b8adde7SWilliam Kucharski# Create the tarball. 62*1b8adde7SWilliam Kucharskiif test ! -f $bootdir.tar.gz; then 63*1b8adde7SWilliam Kucharski echo "# Creating \`$bootdir.tar.gz'" 64*1b8adde7SWilliam Kucharski mkdir -p $bootdir/boot/grub 65*1b8adde7SWilliam Kucharski cp -p $stage1dir/stage1 $stage2dir/*_stage1_5 $stage2dir/stage2 \ 66*1b8adde7SWilliam Kucharski $bootdir/boot/grub 67*1b8adde7SWilliam Kucharski test ! -f menu.lst || cp -p menu.lst $bootdir/boot/grub 68*1b8adde7SWilliam Kucharski trap "rm -f $bootdir.tar.gz" 0 69*1b8adde7SWilliam Kucharski GZIP=-9 tar -zcf $bootdir.tar.gz $bootdir 70*1b8adde7SWilliam Kucharski trap '' 0 71*1b8adde7SWilliam Kucharski rm -rf $bootdir 72*1b8adde7SWilliam Kucharskifi 73*1b8adde7SWilliam Kucharski 74*1b8adde7SWilliam Kucharski# Create a new filesystem image of the specified size. 75*1b8adde7SWilliam Kucharskiif test ! -f $image; then 76*1b8adde7SWilliam Kucharski tarsize=`zcat $bootdir.tar.gz | wc -c` 77*1b8adde7SWilliam Kucharski 78*1b8adde7SWilliam Kucharski # Add about 30% (20% overhead plus 10% breathing room), and convert 79*1b8adde7SWilliam Kucharski # to kilobytes. This factor was determined empirically. 80*1b8adde7SWilliam Kucharski SIZE=`expr $tarsize \* 130 / 100 / 1024`k 81*1b8adde7SWilliam Kucharski echo "# Creating $SIZE disk image \`$image'" 82*1b8adde7SWilliam Kucharski trap "rm -f $image" 0 83*1b8adde7SWilliam Kucharski dd if=/dev/zero of=$image bs=$SIZE count=1 >/dev/null 84*1b8adde7SWilliam Kucharski $mke2fs -F $image 85*1b8adde7SWilliam Kucharski trap '' 0 86*1b8adde7SWilliam Kucharskifi 87*1b8adde7SWilliam Kucharski 88*1b8adde7SWilliam Kucharski 89*1b8adde7SWilliam Kucharski# Attempt to mount the image. 90*1b8adde7SWilliam Kucharskiecho "# Mounting \`$image'" 91*1b8adde7SWilliam Kucharskitest -d $bootdir || mkdir $bootdir 92*1b8adde7SWilliam Kucharskicase "$host_os" in 93*1b8adde7SWilliam Kucharskignu*) 94*1b8adde7SWilliam Kucharski settrans -a $bootdir /hurd/ext2fs $image 95*1b8adde7SWilliam Kucharski umount="settrans -a $bootdir" 96*1b8adde7SWilliam Kucharski ;; 97*1b8adde7SWilliam Kucharski 98*1b8adde7SWilliam Kucharskilinux*) 99*1b8adde7SWilliam Kucharski # This requires running as root, and using the loop device. 100*1b8adde7SWilliam Kucharski i=0 101*1b8adde7SWilliam Kucharski while test -e /dev/loop$i; do 102*1b8adde7SWilliam Kucharski if /sbin/losetup /dev/loop$i $image; then 103*1b8adde7SWilliam Kucharski break 104*1b8adde7SWilliam Kucharski fi 105*1b8adde7SWilliam Kucharski i=`expr $i + 1` 106*1b8adde7SWilliam Kucharski done 107*1b8adde7SWilliam Kucharski 108*1b8adde7SWilliam Kucharski # Silly losetup doesn't report an error! 109*1b8adde7SWilliam Kucharski mount /dev/loop$i $bootdir 110*1b8adde7SWilliam Kucharski umount="umount $bootdir && /sbin/losetup -d /dev/loop$i && trap '' 0" 111*1b8adde7SWilliam Kucharski ;; 112*1b8adde7SWilliam Kucharski 113*1b8adde7SWilliam Kucharski*) 114*1b8adde7SWilliam Kucharski echo "$progname: Mounting \`$image' under \`$host_os' is not supported" 1>&2 115*1b8adde7SWilliam Kucharski exit 1 116*1b8adde7SWilliam Kucharski ;; 117*1b8adde7SWilliam Kucharskiesac 118*1b8adde7SWilliam Kucharskitrap "$umount" 0 119*1b8adde7SWilliam Kucharski 120*1b8adde7SWilliam Kucharski# Extract our tarball into the image, then unmount it. 121*1b8adde7SWilliam Kucharskiecho "# Copying files into \`$image':" 122*1b8adde7SWilliam Kucharskitar -zxvf $bootdir.tar.gz 123*1b8adde7SWilliam Kucharski 124*1b8adde7SWilliam Kucharskiecho "# \`$image' usage:" 125*1b8adde7SWilliam Kucharskidf $bootdir 126*1b8adde7SWilliam Kucharskieval $umount 127*1b8adde7SWilliam Kucharskirmdir $bootdir || : 128*1b8adde7SWilliam Kucharski 129*1b8adde7SWilliam Kucharski# Use the GRUB shell to properly set up GRUB on the image. 130*1b8adde7SWilliam Kucharskiecho "# Installing GRUB in \`$image'" 131*1b8adde7SWilliam Kucharskicat <<EOF | $grub_shell --batch --device-map=/dev/null 132*1b8adde7SWilliam Kucharskidevice (fd0) $image 133*1b8adde7SWilliam Kucharskiroot (fd0) 134*1b8adde7SWilliam Kucharskiinstall /boot/grub/stage1 (fd0) /boot/grub/stage2 135*1b8adde7SWilliam Kucharskiquit 136*1b8adde7SWilliam KucharskiEOF 137*1b8adde7SWilliam Kucharski 138*1b8adde7SWilliam Kucharskiexit 0 139