#!/bin/bash # # DESCRIPTION: configure configuration file of bootloader # # SCRIPT NAME: configure_bootloader_cnf.sh # # Input: # argument: # [-r|--root] partition mount by root # <-b|--boot> partition mount by boot (optional,if the boot is not mount by stand alone) # [-k|--kparameter] kernel parameter # [-o|--osversion] OS version # # Output: # NULL # Return value: # 1 argument error # 2 bootloader type doesn't specify # 3 bootloader no implement # 4 bootloader configuration file doesn't exist # # # AUTHOR: Qin Bo # # EMAIL: bqin@linx-info.com # # DATE: 2010-09-07 # # HISTORY: # REVISOR DATE MODIFICATION # Qin Bo 2010-09-07 create # # # source ./functions usage () { if [ "$1" == "-n" ];then cmd="info" ret=0 else cmd="err" ret=1 fi $cmd " This script will install boot loader for system Usage: $0 options options: [--help] show this message [-t|--type ] boot loader type:grub,etc. [-r|--root] partition mount by root <-b|--boot> partition mount by boot (optional,if the boot is not mount by stand alone) [-k|--kparameter] kernel parameter [-o|--osversion] OS version " return $ret } configure_grub_cnf () { local root_hd local part_num local root local hd_dev local devname local root_dev if [ ! -e "$GRUBCNF" ];then err "$GRUBCNF doesn't exist" return 4 fi # get the boot directory in which hard disk if [ -n "$BOOT_PARTITION" ];then root_hd=$(echo "$BOOT_PARTITION"|sed 's/[0-9]//g') part_num=${BOOT_PARTITION##*[a-z]} let $((part_num-=1)) else root_hd=$(echo "$ROOT_PARTITION"|sed 's/[0-9]//g') part_num=${ROOT_PARTITION##*[a-z]} let $((part_num-=1)) fi if [ ! -e "$DEVICEMAP" ];then warn "$DEVICEMAP doesn't exist, creat it" # generate device.map grub --batch --no-floppy --device-map="$DEVICEMAP" << EOF 1>>"$DEV_LOG" 2>&1 quit EOF fi hd_dev=$(grep "$root_hd" "$DEVICEMAP" | awk '{print $1}' | sed 's/(//' | sed 's/)//') #e.g. hd_dev=hd0 info "hd_dev: $hd_dev part_num: $part_num" root="($hd_dev,$part_num)" info "root: $root" # use UUID in menu.lst except md, # because when I use UUID of raid device in menu.lst, # initrd can't switch root . devname=$(basename $ROOT_PARTITION) if [[ "$devname" =~ ^md[0-9]*$ ]];then root_dev="$ROOT_PARTITION" else by_uuid=$(get_disk_sym $devname "by-uuid") if [ -n "$by_uuid" ];then root_dev="UUID=$(echo $by_uuid|sed 's/.*\///')" else root_dev="$ROOT_PARTITION" fi fi info "root_dev: $root_dev" # modify grub.conf.sample from here # modify root sed "/^splashimage / s/(hd0,0)/$root/ /^kernel / s/(hd0,0)/$root/" "$GRUBCNF" >"$GRUBMENU" # modify boot directory # boot directory mount stand alone if [ -n "$BOOT_PARTITION" ];then sed -i "/^kernel / s@/boot@@ /^initrd / s@/boot@@" "$GRUBMENU" fi # modify OS version sed -i "/^title / s/Secure System/Secure Operating System Version $OSVERSION/" "$GRUBMENU" # modify root partition sed -i "/^kernel / s@root=/dev/hda1@root=$root_dev@" "$GRUBMENU" # append kernel parameter sed -i "s/^kernel .*$/& $KPARAMETER/g" $GRUBMENU } main () { if [ $# -eq 0 ];then usage; erv fi tmp=$(getopt -o t:r:b:k:o: --long type:,root:,boot:,kparameter:,osversion:,help -- "$@" 2>>$DEV_LOG) if [ $? -ne 0 ];then usage; erv fi # set all argument to arg variable eval set -- "$tmp" while true ;do case "$1" in -t|--type) TYPE="$2" info "bootloader type: $TYPE" shift 2 ;; -r|--root) ROOT_PARTITION="$2" info "root partition: $ROOT_PARTITION" shift 2 ;; -b|--boot) BOOT_PARTITION="$2" info "boot partition: $BOOT_PARTITION" shift 2 ;; -k|--kparameter) KPARAMETER="$2" info "kernel parameter: $KPARAMETER" shift 2 ;; -o|--osversion) OSVERSION="$2" info "version of opterating system: $OSVERSION" shift 2 ;; --help) usage -n; exit 0 ;; # shift the last "--", this dash is define by getopt (more information see man getopt) --) shift; break;; *) usage; erv ;; esac done if [ -n "$TYPE" ];then case "$TYPE" in grub) if [ -z "$ROOT_PARTITION" ]; then err "configure grub configuration file root partition can't be empty" exit 1 fi configure_grub_cnf erv ;; *) err "$TYPE bootloader no implement yet !" exit 3 ;; esac else err "bootloader type doesn't specify" exit 2 fi } TYPE="" ROOT_PARTITION="" BOOT_PARTITION="" KPARAMETER="" OSVERSION="" GRUB_DIR="$TARGET/boot/grub" GRUBMENU="$GRUB_DIR/menu.lst" GRUBCNF="$GRUB_DIR/grub.conf.sample" DEVICEMAP="$GRUB_DIR/device.map" # The quotes around '$@' are essential! # in this way we can accept whitespace as parameter. main "$@"