15b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#! /bin/sh 25b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# grub-image - Create a GRUB boot filesystem image and tarball 35b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Gordon Matzigkeit <gord@fig.org>, 2000-07-25 45b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# 55b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Copyright (C) 2000, 2002 Free Software Foundation, Inc. 65b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# 75b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# This file is free software; you can redistribute it and/or modify it 85b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# under the terms of the GNU General Public License as published by 95b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# the Free Software Foundation; either version 2 of the License, or 105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# (at your option) any later version. 115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# 125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# This program is distributed in the hope that it will be useful, but 135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# WITHOUT ANY WARRANTY; without even the implied warranty of 145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# General Public License for more details. 165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# 175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# You should have received a copy of the GNU General Public License 185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# along with this program; if not, write to the Free Software 195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectprefix=/usr/local 225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectexec_prefix=${prefix} 235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectsbindir=${exec_prefix}/sbin 245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectlibdir=${exec_prefix}/lib 255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectPACKAGE=grub 265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecthost_cpu=x86_64 275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecthost_os=linux-gnu 285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecthost_vendor=unknown 295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectcontext=${host_cpu}-${host_vendor} 305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectpkglibdir=${libdir}/${PACKAGE}/${context} 315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectmke2fs=`which mke2fs` 335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectprogname=`echo "$0" | sed 's%^.*/%%'` 355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectthisdir=`echo "$0" | sed 's%/[^/]*$%%'` 365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecttest "X$thisdir" = "X$0" && thisdir=. 375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# See if we were invoked from within the build directory, and if so, 395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# use the built files rather than the installed ones. 405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectif test -f $thisdir/../stage2/stage2; then 415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project grub_shell="$thisdir/../grub/grub" 425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project stage1dir="$thisdir/../stage1" 435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project stage2dir="$thisdir/../stage2" 445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectelse 455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project grub_shell=${sbindir}/grub 465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project stage1dir="$pkglibdir" 475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project stage2dir="$pkglibdir" 485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectfi 495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Exit on any error. 515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectset -e 525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Get GRUB's version from the Grub shell, since we use the 545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# installed files. 555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectVERSION=`$grub_shell --version | sed -e 's/^.* \([0-9.]*\).*$/\1/'` 565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecttest "X$VERSION" != X 575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectbootdir=${PACKAGE}-${VERSION}-${context} 595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectimage=$bootdir.ext2fs 605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Create the tarball. 625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectif test ! -f $bootdir.tar.gz; then 635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project echo "# Creating \`$bootdir.tar.gz'" 645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mkdir -p $bootdir/boot/grub 655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project cp -p $stage1dir/stage1 $stage2dir/*_stage1_5 $stage2dir/stage2 \ 665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project $bootdir/boot/grub 675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project test ! -f menu.lst || cp -p menu.lst $bootdir/boot/grub 685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project trap "rm -f $bootdir.tar.gz" 0 695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project GZIP=-9 tar -zcf $bootdir.tar.gz $bootdir 705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project trap '' 0 715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project rm -rf $bootdir 725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectfi 735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Create a new filesystem image of the specified size. 755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectif test ! -f $image; then 765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tarsize=`zcat $bootdir.tar.gz | wc -c` 775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project # Add about 30% (20% overhead plus 10% breathing room), and convert 795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project # to kilobytes. This factor was determined empirically. 805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project SIZE=`expr $tarsize \* 130 / 100 / 1024`k 815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project echo "# Creating $SIZE disk image \`$image'" 825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project trap "rm -f $image" 0 835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project dd if=/dev/zero of=$image bs=$SIZE count=1 >/dev/null 845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project $mke2fs -F $image 855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project trap '' 0 865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectfi 875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Attempt to mount the image. 905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectecho "# Mounting \`$image'" 915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecttest -d $bootdir || mkdir $bootdir 925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectcase "$host_os" in 935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectgnu*) 945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project settrans -a $bootdir /hurd/ext2fs $image 955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project umount="settrans -a $bootdir" 965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ;; 975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectlinux*) 995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project # This requires running as root, and using the loop device. 1005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project i=0 1015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project while test -e /dev/loop$i; do 1025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if /sbin/losetup /dev/loop$i $image; then 1035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break 1045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project fi 1055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project i=`expr $i + 1` 1065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project done 1075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project # Silly losetup doesn't report an error! 1095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mount /dev/loop$i $bootdir 1105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project umount="umount $bootdir && /sbin/losetup -d /dev/loop$i && trap '' 0" 1115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ;; 1125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project*) 1145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project echo "$progname: Mounting \`$image' under \`$host_os' is not supported" 1>&2 1155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project exit 1 1165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ;; 1175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectesac 1185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecttrap "$umount" 0 1195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Extract our tarball into the image, then unmount it. 1215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectecho "# Copying files into \`$image':" 1225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecttar -zxvf $bootdir.tar.gz 1235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectecho "# \`$image' usage:" 1255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectdf $bootdir 1265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecteval $umount 1275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectrmdir $bootdir || : 1285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# Use the GRUB shell to properly set up GRUB on the image. 1305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectecho "# Installing GRUB in \`$image'" 1315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectcat <<EOF | $grub_shell --batch --device-map=/dev/null 1325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectdevice (fd0) $image 1335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectroot (fd0) 1345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectinstall /boot/grub/stage1 (fd0) /boot/grub/stage2 1355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectquit 1365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectEOF 1375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectexit 0 139