| #! /bin/sh -e |
| |
| # Make GRUB rescue image |
| # Copyright (C) 1999,2000,2001,2002,2003,2004,2005,2006,2007,2008 Free Software Foundation, Inc. |
| # |
| # GRUB 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. |
| # |
| # GRUB 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 GRUB. If not, see <http://www.gnu.org/licenses/>. |
| |
| # Initialize some variables. |
| transform="@program_transform_name@" |
| |
| prefix=@prefix@ |
| exec_prefix=@exec_prefix@ |
| bindir=@bindir@ |
| libdir=@libdir@ |
| PACKAGE_NAME=@PACKAGE_NAME@ |
| PACKAGE_TARNAME=@PACKAGE_TARNAME@ |
| PACKAGE_VERSION=@PACKAGE_VERSION@ |
| target_cpu=@target_cpu@ |
| platform=@platform@ |
| pkglibdir=${libdir}/`echo ${PACKAGE_TARNAME}/${target_cpu}-${platform} | sed ${transform}` |
| |
| grub_mkimage=${bindir}/`echo grub-mkimage | sed ${transform}` |
| |
| # Usage: usage |
| # Print the usage. |
| usage () { |
| cat <<EOF |
| Usage: grub-mkrescue [OPTION] output_image |
| Make GRUB rescue image. |
| |
| -h, --help print this message and exit |
| -v, --version print the version information and exit |
| --modules=MODULES pre-load specified modules MODULES |
| --overlay=DIR overlay directory DIR in the memdisk image |
| (may be specified multiple times) |
| --pkglibdir=DIR use images from directory DIR instead of ${pkglibdir} |
| --grub-mkimage=FILE use FILE as grub-mkimage |
| --image-type=TYPE select floppy or cdrom (default) |
| --emulation=TYPE select El Torito boot emulation type floppy |
| or none (default) (cdrom only) |
| |
| grub-mkimage generates a bootable rescue image of the specified type. |
| |
| Report bugs to <bug-grub@gnu.org>. |
| EOF |
| } |
| |
| image_type=cdrom |
| input_dir=${pkglibdir} |
| emulation=none |
| |
| # Check the arguments. |
| for option in "$@"; do |
| case "$option" in |
| -h | --help) |
| usage |
| exit 0 ;; |
| -v | --version) |
| echo "grub-mkrescue (GNU GRUB ${PACKAGE_VERSION})" |
| exit 0 ;; |
| --modules=*) |
| modules=`echo "$option" | sed 's/--modules=//'` ;; |
| --overlay=*) |
| overlay=${overlay}${overlay:+ }`echo "$option" | sed 's/--overlay=//'` ;; |
| --pkglibdir=*) |
| input_dir=`echo "$option" | sed 's/--pkglibdir=//'` ;; |
| --grub-mkimage=*) |
| grub_mkimage=`echo "$option" | sed 's/--grub-mkimage=//'` ;; |
| --image-type=*) |
| image_type=`echo "$option" | sed 's/--image-type=//'` |
| case "$image_type" in |
| floppy|cdrom) ;; |
| *) |
| echo "Unknown image type \`$image_type'" 1>&2 |
| exit 1 ;; |
| esac ;; |
| --emulation=*) |
| emulation=`echo "$option" | sed 's/--emulation=//'` |
| case "$emulation" in |
| floppy|none) ;; |
| *) |
| echo "Unknown emulation type \`$emulation'" 1>&2 |
| exit 1 ;; |
| esac ;; |
| -*) |
| echo "Unrecognized option \`$option'" 1>&2 |
| usage |
| exit 1 |
| ;; |
| *) |
| if test "x$output_image" != x; then |
| echo "Unrecognized option \`$option'" 1>&2 |
| usage |
| exit 1 |
| fi |
| output_image="${option}" ;; |
| esac |
| done |
| |
| if test "x$output_image" = x; then |
| usage |
| exit 1 |
| fi |
| |
| aux_dir=`mktemp -d` |
| mkdir -p ${aux_dir}/boot/grub |
| |
| for file in ${input_dir}/*.mod ${input_dir}/efiemu??.o \ |
| ${input_dir}/command.lst ${input_dir}/moddep.lst ${input_dir}/fs.lst \ |
| ${input_dir}/handler.lst ${input_dir}/parttool.lst; do |
| if test -f "$file"; then |
| cp -f "$file" ${aux_dir}/boot/grub/ |
| fi |
| done |
| |
| modules="biosdisk `cat ${input_dir}/partmap.lst` ${modules}" |
| for i in ${modules} ; do |
| echo "insmod $i" |
| done > ${aux_dir}/boot/grub/grub.cfg |
| |
| for d in ${overlay}; do |
| echo "Overlaying $d" |
| cp -dpR "${d}"/* "${aux_dir}"/ |
| done |
| |
| if [ "x${image_type}" = xfloppy -o "x${emulation}" = xfloppy ] ; then |
| # build memdisk |
| memdisk_img=`mktemp` |
| tar -C ${aux_dir} -cf ${memdisk_img} boot |
| rm -rf ${aux_dir} |
| |
| # build core.img |
| core_img=`mktemp` |
| ${grub_mkimage} -d ${input_dir}/ -m ${memdisk_img} -o ${core_img} memdisk tar |
| rm -f ${memdisk_img} |
| |
| # build floppy image |
| if [ "x${image_type}" = xcdrom ] ; then |
| floppy_dir=`mktemp -d` |
| floppy_img=${floppy_dir}/grub_floppy.img |
| else |
| floppy_img=${output_image} |
| fi |
| cat ${input_dir}/boot.img ${core_img} /dev/zero | dd bs=1024 count=1440 > ${floppy_img} |
| rm -f ${core_img} |
| |
| if [ "x${image_type}" = xcdrom ] ; then |
| # build iso image |
| genisoimage -b grub_floppy.img \ |
| -o ${output_image} -r -J ${floppy_dir} |
| rm -rf ${floppy_dir} |
| fi |
| else |
| # build core.img |
| core_img=`mktemp` |
| ${grub_mkimage} -d ${input_dir}/ -o ${core_img} biosdisk iso9660 |
| |
| # build grub_eltorito image |
| cat ${input_dir}/cdboot.img ${core_img} > ${aux_dir}/boot/grub/grub_eltorito |
| rm -f ${core_img} |
| |
| # build iso image |
| genisoimage -b boot/grub/grub_eltorito \ |
| -no-emul-boot -boot-load-size 4 -boot-info-table \ |
| -o ${output_image} -r -J ${aux_dir} |
| rm -rf ${aux_dir} |
| fi |
| |
| exit 0 |