|
|
# --- ROCK-COPYRIGHT-NOTE-BEGIN --- # # This copyright note is auto-generated by ./scripts/Create-CopyPatch. # Please add additional copyright information _after_ the line containing # the ROCK-COPYRIGHT-NOTE-END tag. Otherwise it might get removed by # the ./scripts/Create-CopyPatch script. Do not edit this copyright text! # # ROCK Linux: rock-src/package/x86/grub/stone_mod_grub.sh # ROCK Linux is Copyright (C) 1998 - 2006 Clifford Wolf # # 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; either version 2 of the License, or # (at your option) any later version. A copy of the GNU General Public # License can be found at Documentation/COPYING. # # Many people helped and are helping developing ROCK Linux. Please # have a look at http://www.rocklinux.org/ and the Documentation/TEAM # file for details. # # --- ROCK-COPYRIGHT-NOTE-END --- # # [MAIN] 70 grub GRUB Boot Loader Setup
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 )"
}
normalize_device() { local master_devid this_devid this_devname local device="$1"
master_devid="`ls -lL $device | awk '{print $5 $6;}'`"
while read this_devid this_devname; do if [ "$this_devid" = "$master_devid" ]; then device="$this_devname" fi done < <( ls -lL --time-style='+xx' /dev/[hs]d[a-z]* | awk '{print $5 $6 " " $8;}'; )
echo "$device" }
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 the bios know about the above drive? tmp_part="" for bios_drive in `grep -v '^#' /boot/grub/device.map|awk '{print $2}'`; do test -e $bios_drive || continue bios_drive_maj=`ls -Ll $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 the drive! root_drive=`grep $bios_drive /boot/grub/device.map | awk '{print $1}'` tmp_part=`ls -Ll $device | awk '{print $6}'` break fi done
# give up if [ -z "$tmp_part" ]; then echo "(unknown)" return fi
# 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
title ROCKate 1024 kernel $bootdrive$bootpath/vmlinuz root=/dev/ram init=/linuxrc video=vesa:ywrap,mtrr vga=0x317 rw initrd $bootdrive$bootpath/initrd.img
title ROCKate 1280 kernel $bootdrive$bootpath/vmlinuz root=/dev/ram init=/linuxrc video=vesa:ywrap,mtrr vga=0x31A rw initrd $bootdrive$bootpath/initrd.img
title ROCKate 800 kernel $bootdrive$bootpath/vmlinuz root=/dev/ram init=/linuxrc video=vesa:ywrap,mtrr vga=0x314 rw initrd $bootdrive$bootpath/initrd.img
title ROCKate 640 kernel $bootdrive$bootpath/vmlinuz root=/dev/ram init=/linuxrc video=vesa:ywrap,mtrr vga=0x311 rw initrd $bootdrive$bootpath/initrd.img
title ROCKate Text only kernel $bootdrive$bootpath/vmlinuz root=/dev/ram init=/linuxrc vga=0 rw 3 initrd $bootdrive$bootpath/initrd.img
EOT
if [ -f /boot/memtest86.bin ] ; then cat << EOT >> /boot/grub/menu.lst
title MemTest86 (SGI memory tester) kernel $bootdrive$bootpath/memtest86.bin EOT fi
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" }
grub_init() { rootdev="`grep ' / ' /proc/mounts | tail -n 1 | \
awk '/\/dev\// { print $1; }'`"
bootdev="`grep ' /boot ' /proc/mounts | tail -n 1 | \
awk '/\/dev\// { print $1; }'`"
if [ "$rootdev" = "/dev/root" -a '!' -e /dev/root ]; then rootdev="`cat /proc/cmdline | tr ' ' '\n' | \
grep '^root=' | cut -f2- -d= | head -n1`"
fi
[ -z "$bootdev" ] && bootdev="$rootdev"
rootdev=`normalize_device $rootdev` bootdev=`normalize_device $bootdev`
# 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 [ "$rootdrive" = "$bootdrive" ] then bootpath="/boot" ; else bootpath="" ; fi }
grub_setup() { if gui_yesno "Do you want to install the GRUB bootloader in MBR now?"; then grub_init; create_device_map grub_init; create_boot_menu grub_init; grub_install fi }
main() { while grub_init
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 default boot menu' '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 }
|