181 lines
5.0 KiB

# --- SDE-COPYRIGHT-NOTE-BEGIN ---
# This copyright note is auto-generated by ./scripts/Create-CopyPatch.
#
# Filename: package/.../grub/stone_mod_grub.sh
# Copyright (C) 2006 - 2008 The OpenSDE Project
# Copyright (C) 2004 - 2006 The T2 SDE Project
# Copyright (C) 1998 - 2003 Clifford Wolf
#
# More information can be found in the files COPYING and README.
#
# This program 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; version 2 of the License. A copy of the
# GNU General Public License can be found in the file COPYING.
# --- SDE-COPYRIGHT-NOTE-END ---
#
# [MAIN] 70 grub GRUB Boot Loader Setup
# [SETUP] 90 grub
create_kernel_list() {
first=1
for x in `(cd /boot/ ; ls vmlinuz_* ) | sort -r` ; do
ver=${x/vmlinuz_/}
if [ $first = 1 ] ; then
label=linux ; first=0
else
label=linux-$ver
fi
cat << EOT
title $label
kernel $bootdrive$bootpath/$x root=$rootdev ro
initrd $bootdrive$bootpath/initrd-${ver}.img
EOT
done
}
create_device_map() {
gui_cmd '(Re-)Create GRUB Device Map' "$( cat << "EOT"
rm -vf /boot/grub/device.map
echo quit | grub --batch --device-map=/boot/grub/device.map
EOT
)"
}
convert_device () {
device="$1"
# extract device type (block) and major number for root drive
user_drive_maj=`ls -Ll $device |
awk '{if ($6 < 64) printf("%c%d0", $1, $5); else printf("%c%d1", $1, $5)}'`
# does your bios know about the above drive?
for bios_drive in `grep -v '^#' /boot/grub/device.map|awk '{print $2}'`; do
bios_drive_maj=`ls -l $bios_drive |
awk '{if ($6 < 64) printf("%c%d0", $1, $5); else printf("%c%d1", $1, $5)}'`
if [ "$user_drive_maj" = "$bios_drive_maj" ]; then
# yupi ya yeh! we found your drive!
root_drive=`grep $bios_drive /boot/grub/device.map | awk '{print $1}'`
tmp_part=`ls -Ll $device | awk '{print $6}'`
break
fi
done
# convert the partition number to GRUB style
if [ $tmp_part -gt 64 ]; then
# hd[bdfh]
# this doesn't handle the disk itself correctly - just the partitions
root_part=$[$tmp_part-65]
else
root_part=$[$tmp_part-1]
fi
unset tmp_part
drive=`echo $root_drive | sed "s:)$:,$root_part):"`
# Do we need some user confirmation to this result???
# ...
unset device
echo $drive
}
create_boot_menu() {
cat << EOT > /boot/grub/menu.lst
timeout 8
default 0
fallback 1
EOT
[ -f /boot/opensde-grub-splash.xpm.gz ] && cat << EOT >> /boot/grub/menu.lst
foreground = 000000
background = e4e6e3
splashimage $bootdrive$bootpath/opensde-grub-splash.xpm.gz
EOT
create_kernel_list >> /boot/grub/menu.lst
[ -f /boot/memtest86.bin ] && cat << EOT >> /boot/grub/menu.lst
title MemTest86 (memory tester)
kernel $bootdrive$bootpath/memtest86.bin
EOT
gui_message "This is the new /boot/grub/menu.lst file:
$( cat /boot/grub/menu.lst )"
}
grub_install() {
gui_cmd 'Installing GRUB' "echo -e 'root $bootdrive\\nsetup (hd0)\\nquit' | grub --batch --device-map=/boot/grub/device.map"
}
main() {
rootdev="`grep ' / ' /proc/mounts | tail -n 1 | \
awk '/\/dev\// { print $1; }'`"
bootdev="`grep ' /boot ' /proc/mounts | tail -n 1 | \
awk '/\/dev\// { print $1; }'`"
[ -z "$bootdev" ] && bootdev="$rootdev"
i=0
rootdev="$( cd `dirname $rootdev` ; pwd -P )/$( basename $rootdev )"
while [ -L $rootdev ] ; do
directory="$( cd `dirname $rootdev` ; pwd -P )"
rootdev="$( ls -l $rootdev | sed 's,.* -> ,,' )"
[ "${rootdev##/*}" ] && rootdev="$directory/$rootdev"
i=$(( $i + 1 )) ; [ $i -gt 20 ] && rootdev="Not found!"
done
i=0
bootdev="$( cd `dirname $bootdev` ; pwd -P )/$( basename $bootdev )"
while [ -L $bootdev ] ; do
directory="$( cd `dirname $bootdev` ; pwd -P )"
bootdev="$( ls -l $bootdev | sed 's,.* -> ,,' )"
[ "${bootdev##/*}" ] && bootdev="$directory/$bootdev"
i=$(( $i + 1 )) ; [ $i -gt 20 ] && bootdev="Not found!"
done
if [ -s /boot/grub/device.map ] ; then
rootdrive=`convert_device $rootdev`
bootdrive=`convert_device $bootdev`
else
rootdrive='No Device Map found!'
bootdrive='No Device Map found!'
fi
if [ "$rootdev" = "$bootdev" ]
then bootpath="/boot" ; else bootpath= ; fi
if [ ! -f /boot/grub/menu.lst ] ; then
if gui_yesno "GRUB does not appear to be configured.
Automatically install GRUB now?"; then
create_device_map
rootdrive=`convert_device $rootdev`
bootdrive=`convert_device $bootdev`
create_boot_menu
if ! grub_install; then
gui_message "There was an error while installing GRUB."
fi
fi
fi
while
gui_menu grub 'GRUB Boot Loader Setup' \
'(Re-)Create GRUB Device Map' 'create_device_map' \
"Root Device ... $rootdev" "" \
"Boot Drive .... $bootdrive$boot_path" "" \
'' '' \
'(Re-)Create boot menu with installed kernels' 'create_boot_menu' \
'(Re-)Install GRUB in MBR of (hd0)' 'grub_install' \
'' '' \
"Edit /boot/grub/device.map (Device Map)" \
"gui_edit 'GRUB Device Map' /boot/grub/device.map" \
"Edit /boot/grub/menu.lst (Boot Menu)" \
"gui_edit 'GRUB Boot Menu' /boot/grub/menu.lst"
do : ; done
}