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