181 lines
5.0 KiB
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 |
|
} |
|
|
|
|