a1447506fe
* util/sparc64/ieee1275/grub-setup.c: New file. * util/sparc64/ieee1275/grub-ofpathname.c: New file. * util/sparc64/ieee1275/grub-mkimage.c: New file. * util/sparc64/ieee1275/grub-install.in: New file. * util/ieee1275/ofpath.c: New file. * util/ieee1275/devicemap.c: New file. * util/devicemap.c: New file. * util/deviceiter.c: New file. * kern/sparc64/ieee1275/init.c: New file. * include/grub/util/ofpath.h: New file. * include/grub/util/deviceiter.h: New file. * util/grub-mkdevicemap.c: Include deviceiter.h. Implement using grub_util_emit_devicemap_entry and grub_util_iterate_devices. * conf/i386-corebook.rmk: Build util/deviceiter.c and util/devicemap.c into grub-mkdevicemap * conf/i386-efi.rmk: Likewise. * conf/i386-ieee1275.rmk: Likewise. * conf/i386-pc.rmk: Likewise. * conf/powerpc-ieee1275.rmk: Likewise. * conf/sparc64-ieee1275.rmk: Add rules to build boot block images and installation utilities. Build kernel as image instead of as elf binary. Use common rules as much as possible.
276 lines
8.1 KiB
Bash
276 lines
8.1 KiB
Bash
#! /bin/sh
|
|
|
|
# Install GRUB on your drive.
|
|
# Copyright (C) 1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009 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@
|
|
sbindir=@sbindir@
|
|
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_setup=${sbindir}/`echo grub-setup | sed ${transform}`
|
|
grub_mkimage=${bindir}/`echo grub-mkimage | sed ${transform}`
|
|
grub_mkdevicemap=${sbindir}/`echo grub-mkdevicemap | sed ${transform}`
|
|
grub_probe=${sbindir}/`echo grub-probe | sed ${transform}`
|
|
rootdir=
|
|
grub_prefix=`echo /boot/grub | sed ${transform}`
|
|
modules=
|
|
|
|
install_device=
|
|
no_floppy=
|
|
force_lba=
|
|
recheck=no
|
|
debug=no
|
|
|
|
# Usage: usage
|
|
# Print the usage.
|
|
usage () {
|
|
cat <<EOF
|
|
Usage: grub-install [OPTION] install_device
|
|
Install GRUB on your drive.
|
|
|
|
-h, --help print this message and exit
|
|
-v, --version print the version information and exit
|
|
--modules=MODULES pre-load specified modules MODULES
|
|
--root-directory=DIR install GRUB images under the directory DIR
|
|
instead of the root directory
|
|
--grub-setup=FILE use FILE as grub-setup
|
|
--grub-mkimage=FILE use FILE as grub-mkimage
|
|
--grub-mkdevicemap=FILE use FILE as grub-mkdevicemap
|
|
--grub-probe=FILE use FILE as grub-probe
|
|
--no-floppy do not probe any floppy drive
|
|
--recheck probe a device map even if it already exists
|
|
|
|
INSTALL_DEVICE can be a GRUB device name or a system device filename.
|
|
|
|
grub-install copies GRUB images into the DIR/boot directory specified by
|
|
--root-directory, and uses grub-setup to install grub into the boot
|
|
sector.
|
|
|
|
Report bugs to <bug-grub@gnu.org>.
|
|
EOF
|
|
}
|
|
|
|
# Check the arguments.
|
|
for option in "$@"; do
|
|
case "$option" in
|
|
-h | --help)
|
|
usage
|
|
exit 0 ;;
|
|
-v | --version)
|
|
echo "grub-install (GNU GRUB ${PACKAGE_VERSION})"
|
|
exit 0 ;;
|
|
--modules=*)
|
|
modules=`echo "$option" | sed 's/--modules=//'` ;;
|
|
--root-directory=*)
|
|
rootdir=`echo "$option" | sed 's/--root-directory=//'` ;;
|
|
--grub-setup=*)
|
|
grub_setup=`echo "$option" | sed 's/--grub-setup=//'` ;;
|
|
--grub-mkimage=*)
|
|
grub_mkimage=`echo "$option" | sed 's/--grub-mkimage=//'` ;;
|
|
--grub-mkdevicemap=*)
|
|
grub_mkdevicemap=`echo "$option" | sed 's/--grub-mkdevicemap=//'` ;;
|
|
--grub-probe=*)
|
|
grub_probe=`echo "$option" | sed 's/--grub-probe=//'` ;;
|
|
--no-floppy)
|
|
no_floppy="--no-floppy" ;;
|
|
--recheck)
|
|
recheck=yes ;;
|
|
# This is an undocumented feature...
|
|
--debug)
|
|
debug=yes ;;
|
|
-*)
|
|
echo "Unrecognized option \`$option'" 1>&2
|
|
usage
|
|
exit 1
|
|
;;
|
|
*)
|
|
if test "x$install_device" != x; then
|
|
echo "More than one install_devices?" 1>&2
|
|
usage
|
|
exit 1
|
|
fi
|
|
install_device="${option}" ;;
|
|
esac
|
|
done
|
|
|
|
# for make_system_path_relative_to_its_root()
|
|
. ${libdir}/grub/grub-mkconfig_lib
|
|
|
|
if test "x$install_device" = x; then
|
|
echo "install_device not specified." 1>&2
|
|
usage
|
|
exit 1
|
|
fi
|
|
|
|
# If the debugging feature is enabled, print commands.
|
|
setup_verbose=
|
|
if test $debug = yes; then
|
|
set -x
|
|
setup_verbose="--verbose"
|
|
fi
|
|
|
|
# Initialize these directories here, since ROOTDIR was initialized.
|
|
bootdir=${rootdir}/boot
|
|
grubdir=${bootdir}/`echo grub | sed ${transform}`
|
|
device_map=${grubdir}/device.map
|
|
|
|
grub_probe="${grub_probe} --device-map=${device_map}"
|
|
|
|
# Check if GRUB is installed.
|
|
set $grub_setup dummy
|
|
if test -f "$1"; then
|
|
:
|
|
else
|
|
echo "$1: Not found." 1>&2
|
|
exit 1
|
|
fi
|
|
|
|
set $grub_mkimage dummy
|
|
if test -f "$1"; then
|
|
:
|
|
else
|
|
echo "$1: Not found." 1>&2
|
|
exit 1
|
|
fi
|
|
|
|
set $grub_mkdevicemap dummy
|
|
if test -f "$1"; then
|
|
:
|
|
else
|
|
echo "$1: Not found." 1>&2
|
|
exit 1
|
|
fi
|
|
|
|
# Create the GRUB directory if it is not present.
|
|
test -d "$bootdir" || mkdir "$bootdir" || exit 1
|
|
test -d "$grubdir" || mkdir "$grubdir" || exit 1
|
|
|
|
# If --recheck is specified, remove the device map, if present.
|
|
if test $recheck = yes; then
|
|
rm -f $device_map
|
|
fi
|
|
|
|
# Create the device map file if it is not present.
|
|
if test -f "$device_map"; then
|
|
:
|
|
else
|
|
# Create a safe temporary file.
|
|
test -n "$mklog" && log_file=`$mklog`
|
|
|
|
$grub_mkdevicemap --device-map=$device_map $no_floppy || exit 1
|
|
fi
|
|
|
|
# Make sure that there is no duplicated entry.
|
|
tmp=`sed -n '/^([fh]d[0-9]*)/s/\(^(.*)\).*/\1/p' $device_map \
|
|
| sort | uniq -d | sed -n 1p`
|
|
if test -n "$tmp"; then
|
|
echo "The drive $tmp is defined multiple times in the device map $device_map" 1>&2
|
|
exit 1
|
|
fi
|
|
|
|
# Copy the GRUB images to the GRUB directory.
|
|
for file in ${grubdir}/*.mod ${grubdir}/*.lst ${grubdir}/*.img; do
|
|
if test -f $file && [ "`basename $file`" != menu.lst ]; then
|
|
rm -f $file || exit 1
|
|
fi
|
|
done
|
|
for file in ${pkglibdir}/*.mod ${pkglibdir}/*.lst; do
|
|
cp -f $file ${grubdir} || exit 1
|
|
done
|
|
|
|
for file in ${pkglibdir}/*.img; do
|
|
cp -f $file ${grubdir} || exit 1
|
|
done
|
|
|
|
# Write device to a variable so we don't have to traverse /dev every time.
|
|
grub_device=`$grub_probe --target=device ${grubdir}`
|
|
|
|
# Create the core image. First, auto-detect the filesystem module.
|
|
fs_module=`$grub_probe --target=fs --device ${grub_device}`
|
|
if test "x$fs_module" = x -a "x$modules" = x; then
|
|
echo "Auto-detection of a filesystem module failed." 1>&2
|
|
echo "Please specify the module with the option \`--modules' explicitly." 1>&2
|
|
exit 1
|
|
fi
|
|
|
|
# Then the partition map module. In order to support partition-less media,
|
|
# this command is allowed to fail (--target=fs already grants us that the
|
|
# filesystem will be accessible).
|
|
partmap_module=`$grub_probe --target=partmap --device ${grub_device} 2> /dev/null`
|
|
|
|
# Device abstraction module, if any (lvm, raid).
|
|
devabstraction_module=`$grub_probe --target=abstraction --device ${grub_device}`
|
|
|
|
modules="$modules $fs_module $partmap_module $devabstraction_module"
|
|
|
|
prefix_drive=
|
|
if [ "x${devabstraction_module}" = "x" ] ; then
|
|
if echo "${install_device}" | grep -qx "(.*)" ; then
|
|
install_drive="${install_device}"
|
|
else
|
|
install_drive="`$grub_probe --target=drive --device ${install_device}`"
|
|
fi
|
|
grub_drive="`$grub_probe --target=drive --device ${grub_device}`"
|
|
|
|
# Strip partition number
|
|
install_drive="`echo ${install_drive} | sed -e s/,[0-9]*//g`"
|
|
grub_drive="`echo ${grub_drive} | sed -e s/,[0-9]*//g`"
|
|
if [ "x${grub_drive}" != "x${install_drive}" ] ; then
|
|
uuid="`$grub_probe --target=fs_uuid --device ${grub_device}`"
|
|
if [ "x${uuid}" = "x" ] ; then
|
|
echo "You attempted a cross-disk install, but the filesystem containing ${grubdir} does not support UUIDs." 1>&2
|
|
exit 1
|
|
fi
|
|
prefix_drive="(UUID=${uuid})"
|
|
modules="$modules fs_uuid"
|
|
fi
|
|
else
|
|
prefix_drive=`$grub_probe --target=drive --device ${grub_device}`
|
|
fi
|
|
|
|
relative_grubdir=`make_system_path_relative_to_its_root ${grubdir}` || exit 1
|
|
if [ "x${relative_grubdir}" = "x" ] ; then
|
|
relative_grubdir=/
|
|
fi
|
|
|
|
$grub_mkimage --output=${grubdir}/core.img --prefix=${prefix_drive}${relative_grubdir} $modules || exit 1
|
|
|
|
# Now perform the installation.
|
|
$grub_setup ${setup_verbose} --directory=${grubdir} --device-map=${device_map} \
|
|
${install_device} || exit 1
|
|
|
|
# Prompt the user to check if the device map is correct.
|
|
echo "Installation finished. No error reported."
|
|
echo "This is the contents of the device map $device_map."
|
|
echo "Check if this is correct or not. If any of the lines is incorrect,"
|
|
echo "fix it and re-run the script \`grub-install'."
|
|
echo
|
|
|
|
cat $device_map
|
|
|
|
# Bye.
|
|
exit 0
|