--- trunk/mkinitrd-magellan/grubby/new-kernel-pkg 2007/09/01 22:45:15 532 +++ trunk/grubby/new-kernel-pkg 2012/02/18 00:21:34 1702 @@ -1,15 +1,29 @@ #!/bin/bash +# $Id$ # +# new-kernel-pkg # Invoked upon installation or removal of a kernel package, the following # tasks are/can be done here: # creation/removal of initrd # run of depmod/removal of depmod generated files # addition/removal of kernel images from grub/lilo configuration (via grubby) # -# Copyright (C) 2002-2005 Red Hat, Inc. -# +# Copyright 2002-2008 Red Hat, Inc. All rights reserved. # modified for Magellan-Linux by Niels Rogalla # +# 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. +# +# This program 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 this program. If not, see . +# PATH=/sbin:/bin:$PATH @@ -18,58 +32,86 @@ # some defaults that are sane for most arches kernelName=kernel -if [ -x ./grubby ]; then - grubby=./grubby +if [ -x ./grubby ] +then + grubby=./grubby else - grubby=/sbin/grubby + grubby=/sbin/grubby fi -[ -f /etc/sysconfig/kernel ] && . /etc/sysconfig/kernel +[ -f /etc/conf.d/grubby ] && . /etc/conf.d/grubby +[ -f /etc/conf.d/grubby-uboot ] && . /etc/conf.d/grubby-uboot +cfgGrub2="" +cfgGrub2Efi="" cfgGrub="" cfgLilo="" +cfguBoot="" runLilo="" grubConfig="" +grub2Config="" +grub2EfiConfig="" ARCH=$(uname -m) -if [ $ARCH = 'ia64' ]; then - liloConfig=/boot/efi/EFI/redhat/elilo.conf - bootPrefix=/boot/efi/EFI/redhat - liloFlag=elilo - isx86="" -elif [ $ARCH = 'ppc64' -o $ARCH = 'ppc' ]; then - liloConfig=/etc/yaboot.conf - bootPrefix=/boot - lilo=/sbin/ybin - liloFlag=yaboot - runLilo="yes" - isx86="" -elif [ $ARCH = 'sparc' -o $ARCH = 'sparc64' ]; then - liloConfig=/etc/silo.conf - bootPrefix=/boot - liloFlag=silo - lilo=/sbin/silo - isx86="" -elif [ $ARCH = 's390' -o $ARCH = 's390x' ]; then - liloConfig=/etc/zipl.conf - bootPrefix=/boot - liloFlag=zipl - lilo=/sbin/zipl - runLilo="yes" - isx86="" +if [[ ${ARCH} = ia64 ]] +then + liloConfig=/boot/efi/EFI/redhat/elilo.conf + bootPrefix=/boot/efi/EFI/redhat + liloFlag=elilo + isx86="" +elif [[ ${ARCH} = ppc64 ]] || [[ ${ARCH} = ppc ]] +then + liloConfig=/etc/yaboot.conf + bootPrefix=/boot + lilo=/sbin/ybin + liloFlag=yaboot + runLilo="yes" + isx86="" +elif [[ ${ARCH} = sparc ]] || [[ ${ARCH} = sparc64 ]] +then + liloConfig=/etc/silo.conf + bootPrefix=/boot + liloFlag=silo + lilo=/sbin/silo + isx86="" +elif [[ ${ARCH} = s390 ]] || [[ ${ARCH} = s390x ]] +then + liloConfig=/etc/zipl.conf + bootPrefix=/boot + liloFlag=zipl + lilo=/sbin/zipl + runLilo="yes" + isx86="" +elif [[ ${ARCH} = armv7l ]] +then + liloConfig="" + bootPrefix=/boot + ubootDir=${UBOOT_DIR:-"/boot/uboot"} + ubootScript=$ubootDir/${UBOOT_SCR:-"boot.scr"} + ubootKList=${UBOOT_KLIST:-"klist.txt"} + ubootDevice=/dev/${UBOOT_DEVICE:-"mmcblk0p1"} + ubootDefaultImage=${UBOOT_UIMAGE:-"uImage"} + ubootDefaultInitrd=${UBOOT_UINITRD:-"uInitrd"} + mounted="" + liloFlag="" + isx86="" else - # this leaves i?86 and x86_64 - liloConfig=/etc/lilo.conf - grubConfig=/boot/grub/grub.conf - bootPrefix=/boot - liloFlag=lilo - isx86="yes" + # this leaves i?86 and x86_64 + liloConfig=/etc/lilo.conf + grubConfig=/boot/grub/grub.conf + grub2Config=/boot/grub/grub.cfg + grub2EfiConfig=/boot/grub/grub-efi.cfg + bootPrefix=/boot + liloFlag=lilo + isx86="yes" fi mode="" version="" initrd="" +dracut="" +dracuthostonly="" initrdfile="" moddep="" verbose="" @@ -77,335 +119,671 @@ package="" mbkernel="" mbargs="" +adddracutargs="" +addplymouthinitrd="" -usage() { - echo "Usage: `basename $0` [-v] [--mkinitrd] [--rminitrd]" >&2 - echo " [--initrdfile=] [--depmod] [--rmmoddep]" >&2 - echo " [--kernel-args=] [--banner=]" >&2 - echo " [--multiboot=multiboot] [--mbargs=mbargs]" >&2 - echo " [--make-default] <--install | --remove> " >&2 - echo " (ex: `basename $0` --mkinitrd --depmod --install 2.4.7-2)" >&2 - exit 1 +usage() +{ + echo "Usage: $(basename $0) [-v] [--mkinitrd] [--rminitrd] [--dracut]" >&2 + echo " [--initrdfile=] [--depmod] [--rmmoddep]" >&2 + echo " [--kernel-args=] [--remove-args=]" >&2 + echo " [--banner=] [--multiboot=multiboot]" >&2 + echo " [--mbargs=mbargs] [--make-default] [--add-dracut-args]" >&2 + echo " [--add-plymouth-initrd]" >&2 + echo " [--host-only]" >&2 + echo " <--install | --remove | --update> " >&2 + echo " (ex: $(basename $0) --mkinitrd --depmod --install 2.4.7-2)" >&2 + exit 1 } -install() { - # XXX kernel should be able to be specified also (or work right on ia64) - if [ ! -f $bootPrefix/$kernelName-$version ] ; then - [ -n "$verbose" ] && echo "kernel for $version does not exist, not running grubby" - return - fi - - INITRD="" - if [ -f $initrdfile ]; then - [ -n "$verbose" ] && echo "found $initrdfile and using it with grubby" - INITRD="--initrd $initrdfile" - fi - - # FIXME: is this a good heuristic to find out if we're on iSeries? - if [ -d /proc/iSeries ]; then - [ -n "$verbose" ] && echo "On an iSeries, just making img file" - if [ -z $initrdfile ]; then - [ -n "$verbose" ] && echo "No initrd, just adding system map" - /sbin/addSystemMap $bootPrefix/System.map-$version $bootPrefix/$kernelName-$version $bootPrefix/vmlinitrd-$version - else - /sbin/addSystemMap $bootPrefix/System.map-$version $bootPrefix/$kernelName-$version $bootPrefix/vmlinux.sm-$version - /sbin/addRamDisk $initrdfile $bootPrefix/System.map-$version $bootPrefix/vmlinux.sm-$version $bootPrefix/vmlinitrd-$version 2>/dev/null - rm $bootPrefix/vmlinux.sm-$version - fi - return - fi - - # get the root filesystem to use; if it's on a label make sure it's - # been configured. if not, get the root device from mount - rootdevice=$(awk '{ if ($1 !~ /^[ \t]*#/ && $2 == "/") { print $1; }}' /etc/fstab) - short=$(echo $rootdevice | cut -d= -f1) - if [ "$short" == "LABEL" ]; then - label=$(echo $rootdevice | cut -d= -f2 |head -n 1) - device=$(echo "showlabels" | /sbin/nash --force --quiet | - awk '$2 == "'$label'" {print $1}') - if [ -z "$device" ]; then - rootdevice=$(mount | awk '$3 == "/" { print $1 }') - fi - fi - - if [ -n "$mbkernel" ]; then - mb="--add-multiboot=$mbkernel" - if [ -n "$mbargs" ]; then - mb="$mb --mbargs=$mbargs" - fi - [ -n "$verbose" ] && echo "multiboot specified, not updating lilo.conf" - cfgLilo="" - fi - - if [ -n "$cfgGrub" ]; then - [ -n "$verbose" ] && echo "adding $version to $grubConfig" - - if [ -n "$banner" ]; then - title="$banner ($version)" - elif [ -f /etc/mageversion ]; then - title="Magellan Linux $(< /etc/mageversion) ($version)" - else - title="Magellan Linux ($version)" - fi - /sbin/grubby --add-kernel=$bootPrefix/$kernelName-$version $INITRD \ - --copy-default $makedefault $mb --title "$title" \ - --args="root=$rootdevice $kernargs" \ - --remove-kernel="TITLE=$title" - else - [ -n "$verbose" ] && echo "$grubConfig does not exist, not running grubby" - fi - - if [ -n "$cfgLilo" ]; then - [ -n "$verbose" ] && echo "adding $version to $liloConfig" - - /sbin/grubby --add-kernel=$bootPrefix/$kernelName-$version $INITRD \ - --copy-default $makedefault --title $version \ - --args="root=$rootdevice $kernargs" \ - --remove-kernel="TITLE=$version" \ - --$liloFlag - - if [ -n "$runLilo" ]; then - [ -n "$verbose" ] && echo "running $lilo" - if [ ! -x $lilo ] ; then - [ -n "$verbose" ] && echo "$lilo does not exist" - else - $lilo > /dev/null - fi - fi - else - [ -n "$verbose" ] && echo "$liloConfig does not exist, not running grubby" - fi +install() +{ + # XXX kernel should be able to be specified also (or work right on ia64) + if [ ! -f ${bootPrefix}/${kernelName}-${version} ] + then + [[ -n ${verbose} ]] && echo "kernel for ${version} does not exist, not running grubby" + return + fi + + INITRD="" + if [ -f ${initrdfile} ] + then + [[ -n ${verbose} ]] && echo "found ${initrdfile} and using it with grubby" + INITRD="--initrd ${initrdfile}" + + if [[ -n ${addplymouthinitrd} ]] + then + INITRD="${INITRD} --extra-initrd ${bootPrefix}/initrd-plymouth.img" + fi + fi + + # FIXME: is this a good heuristic to find out if we're on iSeries? + if [ -d /proc/iSeries ] + then + [[ -n ${verbose} ]] && echo "On an iSeries, just making img file" + if [[ -z ${initrdfile} ]] + then + [[ -n ${verbose} ]] && echo "No initrd, just adding system map" + /sbin/addSystemMap ${bootPrefix}/System.map-${version} ${bootPrefix}/${kernelName}-${version} ${bootPrefix}/vmlinitrd-${version} + else + /sbin/addSystemMap ${bootPrefix}/System.map-${version} ${bootPrefix}/${kernelName}-${version} ${bootPrefix}/vmlinux.sm-${version} + /sbin/addRamDisk ${initrdfile} ${bootPrefix}/System.map-${version} ${bootPrefix}/vmlinux.sm-${version} ${bootPrefix}/vmlinitrd-${version} 2>/dev/null + rm ${bootPrefix}/vmlinux.sm-${version} + fi + return + fi + + # get the root filesystem to use + rootdevice=$(awk '{ if ($1 !~ /^[ \t]*#/ && $2 == "/") { print $1; }}' /etc/fstab) + + if [[ -n ${mbkernel} ]] && [[ -n ${cfgLilo} ]] && [[ ${liloFlag} != elilo ]] + then + [[ -n ${verbose} ]] && echo "multiboot specified, not updating lilo.conf" + cfgLilo="" + fi + + if [[ -n ${cfgGrub} ]] + then + [[ -n ${verbose} ]] && echo "adding ${version} to ${grubConfig}" + + if [[ -n ${banner} ]] + then + title="${banner} (${version})" + elif [ -f /etc/mageversion ] + then + title="Magellan Linux $(< /etc/mageversion) (${version})" + else + title="Magellan Linux (${version})" + fi + ${grubby} --grub --add-kernel=${bootPrefix}/${kernelName}-${version} \ + ${INITRD} --copy-default ${makedefault} --title "${title}" \ + ${mbkernel:+--add-multiboot="${mbkernel}"} ${mbargs:+--mbargs="${mbargs}"} \ + --args="root=${rootdevice} ${kernargs}" --remove-kernel="TITLE=${title}" + else + [[ -n ${verbose} ]] && echo "${grubConfig} does not exist, not running grubby for grub 0.97" + fi + if [[ -n ${cfgGrub2} ]] + then + [[ -n ${verbose} ]] && echo "adding ${version} to ${grub2Config}" + + if [[ -n ${banner} ]] + then + title="${banner} (${version})" + elif [ -f /etc/mageversion ] + then + title="Magellan Linux $(< /etc/mageversion) (${version})" + else + title="Magellan Linux (${version})" + fi + ${grubby} --grub2 -c ${grub2Config} \ + --add-kernel=${bootPrefix}/${kernelName}-${version} \ + ${INITRD} --copy-default ${makedefault} --title "${title}" \ + ${mbkernel:+--add-multiboot="${mbkernel}"} \ + ${mbargs:+--mbargs="${mbargs}"} \ + --args="root=${rootdevice} ${kernargs}" --remove-kernel="TITLE=${title}" + else + [[ -n ${verbose} ]] && echo "${grub2Config} does not exist, not running grubby for grub 2" + fi + if [[ -n ${cfgGrub2Efi} ]] + then + [[ -n ${verbose} ]] && echo "adding ${version} to ${grub2EfiConfig}" + + if [[ -n ${banner} ]] + then + title="${banner} (${version})" + elif [ -f /etc/mageversion ] + then + title="Magellan Linux $(< /etc/mageversion) (${version})" + else + title="Magellan Linux (${version})" + fi + ${grubby} --grub2 -c ${grub2EfiConfig} \ + --add-kernel=${bootPrefix}/${kernelName}-${version} \ + ${INITRD} --copy-default ${makedefault} --title "${title}" \ + ${mbkernel:+--add-multiboot="${mbkernel}"} \ + ${mbargs:+--mbargs="${mbargs}"} \ + --args="root=${rootdevice} ${kernargs}" --remove-kernel="TITLE=${title}" + else + [[ -n ${verbose} ]] && echo "${grub2EfiConfig} does not exist, not running grubby for grub 2 with UEFI" + fi + if [[ -n ${cfgLilo} ]] + then + [[ -n ${verbose} ]] && echo "adding ${version} to ${liloConfig}" + + ${grubby} --add-kernel=${bootPrefix}/${kernelName}-${version} ${INITRD} \ + --copy-default ${makedefault} --title ${version} \ + ${mbkernel:+--add-multiboot="${mbkernel}"} ${mbargs:+--mbargs="${mbargs}"} \ + --args="root=${rootdevice} ${kernargs}" --remove-kernel="TITLE=${version}" \ + --${liloFlag} + + if [[ -n ${runLilo} ]] + then + [[ -n ${verbose} ]] && echo "running ${lilo}" + if [ ! -x ${lilo} ] + then + [[ -n ${verbose} ]] && echo "${lilo} does not exist" + else + ${lilo} > /dev/null + fi + fi + else + [[ -n ${verbose} ]] && echo "${liloConfig} does not exist, not running grubby" + fi } -remove() { - # FIXME: is this a good heuristic to find out if we're on iSeries? - if [ -d /proc/iSeries ]; then - [ -n "$verbose" ] && echo "On an iSeries, remove img file" - rm -f $bootPrefix/$kernelName-$version.img 2>/dev/null - return - fi - - if [ -n "$cfgGrub" ]; then - [ -n "$verbose" ] && echo "removing $version from $grubConfig" - /sbin/grubby --remove-kernel=$bootPrefix/$kernelName-$version - else - [ -n "$verbose" ] && echo "$grubConfig does not exist, not running grubby" - fi - - if [ -n "$cfgLilo" ]; then - [ -n "$verbose" ] && echo "removing $version from $liloConfig" - /sbin/grubby --remove-kernel=$bootPrefix/$kernelName-$version \ - --$liloFlag - - if [ -n "$runLilo" ]; then - [ -n "$verbose" ] && echo "running $lilo" - if [ ! -x $lilo ] ; then - [ -n "$verbose" ] && echo "$lilo does not exist" - else - $lilo > /dev/null - fi - fi - else - [ -n "$verbose" ] && echo "$liloConfig does not exist, not running grubby" - fi +remove() +{ + # FIXME: is this a good heuristic to find out if we're on iSeries? + if [ -d /proc/iSeries ] + then + [[ -n ${verbose} ]] && echo "On an iSeries, remove img file" + rm -f ${bootPrefix}/${kernelName}-${version}.img 2>/dev/null + return + fi + + if [[ -n ${cfgGrub} ]] + then + [[ -n ${verbose} ]] && echo "removing ${version} from ${grubConfig}" + ${grubby} --grub --remove-kernel=${bootPrefix}/${kernelName}-${version} + else + [[ -n ${verbose} ]] && echo "${grubConfig} does not exist, not running grubby for grub 0.97" + fi + if [[ -n ${cfgGrub2} ]] + then + [[ -n ${verbose} ]] && echo "removing ${version} from ${grub2Config}" + ${grubby} --grub2 -c ${grub2Config} \ + --remove-kernel=${bootPrefix}/${kernelName}-${version} + else + [[ -n ${verbose} ]] && echo "${grub2Config} does not exist, not running grubby for grub 2" + fi + if [[ -n ${cfgGrub2Efi} ]] + then + [[ -n ${verbose} ]] && echo "removing ${version} from ${grub2EfiConfig}" + ${grubby} --grub2 -c ${grub2EfiConfig} \ + --remove-kernel=${bootPrefix}/${kernelName}-${version} + else + [[ -n ${verbose} ]] && echo "${grub2EfiConfig} does not exist, not running grubby grub 2 with UEFI" + fi + + if [[ -n ${cfgLilo} ]] + then + [[ -n ${verbose} ]] && echo "removing ${version} from ${liloConfig}" + ${grubby} --remove-kernel=${bootPrefix}/${kernelName}-${version} --${liloFlag} + + if [[ -n ${runLilo} ]] + then + [[ -n ${verbose} ]] && echo "running ${lilo}" + if [ ! -x ${lilo} ] + then + [[ -n ${verbose} ]] && echo "${lilo} does not exist" + else + ${lilo} > /dev/null + fi + fi + else + [[ -n ${verbose} ]] && echo "${liloConfig} does not exist, not running grubby" + fi + + if [[ -n ${cfguBoot} ]] + then + [[ -n ${verbose} ]] && echo "removing ${version} from ${ubootDir}..." + + if [ -f ${ubootDir}/${ubootKList} ] + then + tmpKList=$(mktemp ${ubootDir}/${ubootKList}.XXXX) + curversion=$(tail -n1 ${ubootDir}/${ubootKList}) + sed "/${version}/d" ${ubootDir}/${ubootKList} > ${tmpKList} + newversion=$(tail -n1 ${tmpKList}) + if [ -f ${ubootDir}/uImage-${newversion} ] && [ -f ${ubootDir}/uInitrd-${newversion} ] + then + if [[ ${curversion} != ${newversion} ]] + then + cp -fp ${ubootDir}/uImage-${newversion} ${ubootDir}/${ubootDefaultImage} + if [ $? -ne 0 ] + then + [[ -n ${verbose} ]] && echo "copy uImage-${newversion} error, default kernel not replaced!" && exit + fi + cp -fp ${ubootDir}/uInitrd-${newversion} ${ubootDir}/${ubootDefaultInitrd} + if [ $? -ne 0 ] + then + [[ -n ${verbose} ]] && echo "copy uInitrd-${newversion} error, default Initrd not replaced!" && exit + fi + fi + + [[ -n ${verbose} ]] && echo "removing uImage-${version}" + if [ -f ${ubootDir}/uImage-${version} ] + then + rm -f ${ubootDir}/uImage-${version} + else + [[ -n ${verbose} ]] && echo "uImage-${version} did not exist!" + fi + + [[ -n ${verbose} ]] && echo "removing uInitrd-${version}" + if [ -f ${ubootDir}/uInitrd-${version} ] + then + rm -f ${ubootDir}/uInitrd-${version} + else + [[ -n ${verbose} ]] && echo "uInitrd-${version} did not exist!" + fi + + mv ${tmpKList} ${ubootDir}/${ubootKList} + else + [[ -n ${verbose} ]] && echo "uImage ${newversion} does not exist!" + [ -f ${tmpKList} ] && rm -f ${tmpKList} + fi + else + [[ -n ${verbose} ]] && echo "No previous kernel version. uBoot images not removed!" + fi + else + [[ -n ${verbose} ]] && echo "${ubootScript} does not exist, not modifying ${ubootDir}" + fi } -mkinitrd() { - [ -n "$verbose" ] && echo "creating initrd $initrdfile using $version" - /sbin/mkinitrd --allow-missing -f $initrdfile $version - rc=$? - if [ $rc != 0 ]; then - echo "mkinitrd failed" >&2 - exit 1 - fi +update() +{ + if [ ! -f ${bootPrefix}/${kernelName}-${version} ] + then + [[ -n ${verbose} ]] && echo "kernel for ${version} does not exist, not running grubby" + return + fi + + INITRD="" + if [ -f ${initrdfile} ] + then + [[ -n ${verbose} ]] && echo "found ${initrdfile} and using it with grubby" + INITRD="--initrd ${initrdfile}" + + if [[ -n ${addplymouthinitrd} ]] + then + INITRD="${INITRD} --extra-initrd ${bootPrefix}/initrd-plymouth.img" + fi + fi + + if [[ -n ${cfgGrub} ]] + then + [[ -n ${verbose} ]] && echo "updating ${version} from ${grubConfig}" + ${grubby} --update-kernel=${bootPrefix}/${kernelName}-${version} \ + ${INITRD} \ + ${kernargs:+--args="${kernargs}"} \ + ${removeargs:+--remove-args="${removeargs}"} + else + [[ -n ${verbose} ]] && echo "${grubConfig} does not exist, not running grubby" + fi + + if [[ -n ${cfgGrub2} ]] + then + [[ -n ${verbose} ]] && echo "updating ${version} from ${grub2Config}" + ${grubby} --grub2 -c ${grub2Config} \ + --update-kernel=${bootPrefix}/${kernelName}-${version} \ + ${INITRD} \ + ${kernargs:+--args="${kernargs}"} \ + ${removeargs:+--remove-args="${removeargs}"} + else + [[ -n ${verbose} ]] && echo "${grub2Config} does not exist, not running grubby" + fi + + if [[ -n ${cfgGrub2Efi} ]] + then + [[ -n ${verbose} ]] && echo "updating ${version} from ${grub2EfiConfig}" + ${grubby} --grub2 -c ${grub2EfiConfig} \ + --update-kernel=${bootPrefix}/${kernelName}-${version} \ + ${INITRD} \ + ${kernargs:+--args="${kernargs}"} \ + ${removeargs:+--remove-args="${removeargs}"} + else + [[ -n ${verbose} ]] && echo "${grub2EfiConfig} does not exist, not running grubby" + fi + + if [[ -n ${cfgLilo} ]] + then + [[ -n ${verbose} ]] && echo "updating ${version} from ${liloConfig}" + ${grubby} --update-kernel=${bootPrefix}/${kernelName}-${version} \ + ${INITRD} \ + ${kernargs:+--args="${kernargs}"} \ + ${removeargs:+--remove-args="${removeargs}"} \ + --${liloFlag} + + if [[ -n ${runLilo} ]] + then + [[ -n ${verbose} ]] && echo "running ${lilo}" + if [ ! -x ${lilo} ] + then + [[ -n ${verbose} ]] && echo "${lilo} does not exist" + else + ${lilo} > /dev/null + fi + fi + else + [[ -n ${verbose} ]] && echo "${liloConfig} does not exist, not running grubby" + fi + + if [[ -n ${cfguBoot} ]] + then + [[ -n ${verbose} ]] && echo "adding $version to ${ubootDir}..." + + [[ -n ${verbose} ]] && echo "creating uImage-${version}" + mkimage -A arm -O linux -T kernel -C none -a 0x80008000 -e 0x80008000 \ + -n ${version} -d ${bootPrefix}/${kernelName}-${version} ${ubootDir}/uImage-${version} + + [[ -n ${verbose} ]] && echo "creating uInitrd-${version}" + mkimage -A arm -O linux -T ramdisk -C none -a 0 -e 0 \ + -n initramfs -d ${initrdfile} ${ubootDir}/uInitrd-${version} + + if [ -f ${ubootDir}/uImage-${version} ] && [ -f ${ubootDir}/uInitrd-${version} ] + then + cp -fp ${ubootDir}/uImage-${version} ${ubootDir}/${ubootDefaultImage} + if [ $? -ne 0 ] + then + [[ -n ${verbose} ]] && echo "copy uImage-${version} error, kernel not installed!" && exit + fi + cp -fp ${ubootDir}/uInitrd-${version} ${ubootDir}/${ubootDefaultInitrd} + if [ $? -ne 0 ] + then + [[ -n ${verbose} ]] && echo "copy uInitrd-${version} error, kernel not installed!" && exit + fi + echo ${version} >> ${ubootDir}/${ubootKList} + else + [[ -n ${verbose} ]] && echo "cannot make ${version} the default" + fi + else + [[ -n ${verbose} ]] && echo "${ubootScript} does not exist, not setting up ${ubootDir}" + fi } -rminitrd() { - [ -n "$verbose" ] && echo "removing initrd $initrdfile" - [ -f $initrdfile ] && rm -f $initrdfile +mkinitrd() +{ + if [[ -n ${dracut} ]] + then + tool="/sbin/dracut ${dracuthostonly} -f ${initrdfile} ${version}" + else + tool="/sbin/mkinitrd --allow-missing -f ${initrdfile} ${version}" + fi + [[ -n ${verbose} ]] && echo "creating initrd ${initrdfile} using ${version}" + ${tool} + rc=$? + if [ ${rc} != 0 ] + then + echo "mkinitrd failed" >&2 + exit 1 + fi } -doDepmod() { - [ -n "$verbose" ] && echo "running depmod for $version" - depmod -ae -F /boot/System.map-$version $version +rminitrd() +{ + [[ -n ${verbose} ]] && echo "removing initrd ${initrdfile}" + [ -f ${initrdfile} ] && rm -f ${initrdfile} } -doRmmoddep() { - [ -n "$verbose" ] && echo "removing modules.dep info for $version" - [ -d /lib/modules/$version ] && rm -f /lib/modules/$version/modules.* +doDepmod() +{ + [[ -n ${verbose} ]] && echo "running depmod for ${version}" + depmod -ae -F /boot/System.map-${version} ${version} +} + +doRmmoddep() +{ + [[ -n ${verbose} ]] && echo "removing modules.dep info for ${version}" + [ -d /lib/modules/${version} ] && rm -f /lib/modules/${version}/modules.* } -while [ $# -gt 0 ]; do - case $1 in - --mkinitrd) - initrd="make" - ;; - - --rminitrd) - initrd="remove" - ;; - - --initrdfile*) - if echo $1 | grep '=' >/dev/null ; then - initrdfile=`echo $1 | sed 's/^--initrdfile=//'` - else - initrdfile=$2 - shift - fi - ;; - - --kernel-args*) - if echo $1 | grep '=' >/dev/null ; then - kernargs=`echo $1 | sed 's/^--kernel-args=//'` - else - kernargs=$2 - shift - fi - ;; - - --banner*) - if echo $1 | grep '=' >/dev/null ; then - banner=`echo $1 | sed 's/^--banner=//'` - else - banner=$2 - shift - fi - ;; - - --multiboot*) - if echo $1 |grep '=' >/dev/null; then - mbkernel=`echo $1 | sed 's/^--multiboot=//'` - else - # can't really support having an optional second arg here - # sorry! - mbkernel="/boot/xen.gz" - fi - ;; - - --mbargs*) - if echo $1 |grep '=' >/dev/null; then - mbargs=`echo $1 | sed 's/^--mbargs=//'` - else - mbargs=$2 - shift - fi - ;; - - --depmod) - moddep="make" - ;; - - --rmmoddep) - moddep="remove" - ;; - - --make-default) - makedefault="--make-default" - ;; - - --package) - if echo $1 | grep '=' >/dev/null ; then - package=`echo $1 | sed 's/^--package=//'` - else - package=$2 - shift - fi - ;; - - -v) - verbose=-v - ;; - - *) - if [ -z "$mode" ]; then - mode=$1 - elif [ -z "$version" ]; then - version=$1 - else - usage - fi - ;; - esac +while [ $# -gt 0 ] +do + case $1 in + --mkinitrd) + initrd="make" + ;; + + --rminitrd) + initrd="remove" + ;; + + --dracut) + dracut=--dracut + ;; + + --host-only) + dracuthostonly=-H + ;; + + --initrdfile*) + if echo $1 | grep '=' >/dev/null + then + initrdfile=$(echo $1 | sed 's/^--initrdfile=//') + else + initrdfile=$2 + shift + fi + ;; + + --kernel-args*) + if echo $1 | grep '=' >/dev/null + then + kernargs=$(echo $1 | sed 's/^--kernel-args=//') + else + kernargs=$2 + shift + fi + ;; + + --remove-args*) + if echo $1 | grep '=' >/dev/null + then + removeargs=$(echo $1 | sed 's/^--remove-args=//') + else + removeargs=$2 + shift + fi + ;; + + --banner*) + if echo $1 | grep '=' >/dev/null + then + banner=$(echo $1 | sed 's/^--banner=//') + else + banner=$2 + shift + fi + ;; + + --multiboot*) + if echo $1 |grep '=' >/dev/null + then + mbkernel=$(echo $1 | sed 's/^--multiboot=//') + else + # can't really support having an optional second arg here + # sorry! + mbkernel="/boot/xen.gz" + fi + ;; + + --mbargs*) + if echo $1 |grep '=' >/dev/null + then + mbargs=$(echo $1 | sed 's/^--mbargs=//') + else + mbargs="$2" + shift + fi + ;; + + --depmod) + moddep="make" + ;; + + --rmmoddep) + moddep="remove" + ;; + + --make-default) + makedefault="--make-default" + ;; + + --package) + if echo $1 | grep '=' >/dev/null + then + package=$(echo $1 | sed 's/^--package=//') + else + package=$2 + shift + fi + ;; + + --add-dracut-args) + adddracutargs=--add-dracut-args + ;; + + --add-plymouth-initrd) + addplymouthinitrd=--add-plymouth-initrd + ;; + + -v) + verbose=-v + ;; + + *) + if [[ -z ${mode} ]] + then + mode=$1 + elif [[ -z ${version} ]] + then + version=$1 + else + usage + fi + ;; + esac - shift + shift done # make sure the mode is valid -if [ "$mode" != "--install" -a "$mode" != "--remove" ] ; then - usage +if [[ ${mode} != --install ]] && [[ ${mode} != --remove ]] && [[ ${mode} != --update ]] +then + usage fi -if [ -z "$version" ]; then - usage +if [[ -z ${version} ]] +then + usage fi -if [ "$mode" != "--install" -a "$makedefault" ]; then - usage +if [ "${mode}" != "--install" -a "${makedefault}" ] +then + usage fi -# make sure that /dev/loop exist -[[ ! -e /dev/loop ]] && modprobe loop - -kernelmajor=`echo $kernel | cut -d . -f 1,2` +kernelmajor=$(echo ${kernel} | cut -d . -f 1,2) -# kernel image for 2.4 is vmlinux -if [ $ARCH = 'ppc64' -o $ARCH = 'ppc' ]; then - if [ "$kernelmajor" == "2.4" ]; then - kernelName=vmlinux - fi +# kernel image for 2.4 is kernel +if [[ ${ARCH} = ppc64 ]] || [[ ${ARCH} = ppc ]] +then + if [[ ${kernelmajor} = 2.4 ]] + then + kernelName=kernel + fi fi - # set the initrd file based on arch; ia64 is the only currently known oddball -if [ -z "$initrdfile" ]; then - if [ `uname -m` = "ia64" ]; then - initrdfile="/boot/efi/EFI/redhat/initrd-$version.img" - else - initrdfile="/boot/initrd-$version.img" - fi - -fi -[ -n "$verbose" ] && echo "initrdfile is $initrdfile" +if [[ -z ${initrdfile} ]] +then + INITRD_NAME_PREFIX="initrd" + if [[ -n ${dracut} ]] + then + INITRD_NAME_PREFIX="initramfs" + fi -# set this as the default if we have the package and it matches -if [ "$mode" == "--install" -a "$UPDATEDEFAULT" == "yes" -a -n "$package" -a -n "$DEFAULTKERNEL" -a "$package" == "$DEFAULTKERNEL" ]; then - makedefault="--make-default" - [ -n "$verbose" ] && echo "making it the default based on config" + if [[ $(uname -m) = ia64 ]] + then + initrdfile="/boot/efi/EFI/redhat/${INITRD_NAME_PREFIX}-${version}.img" + else + initrdfile="/boot/${INITRD_NAME_PREFIX}-${version}.img" + fi fi +[[ -n ${verbose} ]] && echo "initrdfile is ${initrdfile}" -if [ "$moddep" == "make" ]; then - doDepmod -elif [ "$moddep" == "remove" ]; then - doRmmoddep -fi +# add dracut i18n, keyboard and plymouth kernel args if requested +if [[ -n ${dracut} ]] || [[ -n ${adddracutargs} ]] +then + [ -r /etc/conf.d/keymap ] && . /etc/conf.d/keymap + [ -r /etc/conf.d/consolefont ] && . /etc/conf.d/consolefont + + if [[ -n ${KEYMAP} ]] + then + kernargs="${kernargs} KEYTABLE=${KEYMAP}" + fi -if [ "$initrd" == "make" ]; then - mkinitrd -elif [ "$initrd" == "remove" ]; then - rminitrd + if [[ -n ${CONSOLEFONT} ]] + then + kernargs="${kernargs} SYSFONT=${CONSOLEFONT}" + fi fi -if [ ! -x $grubby ] ; then - [ -n "$verbose" ] && echo "$grubby does not exist" - exit 0 +# set this as the default if we have the package and it matches +if [[ ${mode} = --install ]] && [[ ${UPDATEDEFAULT} = yes ]] && [[ -n ${package} ]] && + [[ -n ${DEFAULTKERNEL} ]] && [[ ${package} = ${DEFAULTKERNEL} ]] +then + makedefault="--make-default" + [[ -n ${verbose} ]] && echo "making it the default based on config" +fi + +if [[ ${moddep} = make ]] +then + doDepmod +elif [[ ${moddep} = remove ]] +then + doRmmoddep +fi + +if [[ ${initrd} = make ]] +then + mkinitrd +elif [[ ${initrd} = remove ]] +then + rminitrd +fi + +if [ ! -x ${grubby} ] +then + [[ -n ${verbose} ]] && echo "${grubby} does not exist" + exit 0 +fi + +[[ -n ${grubConfig} ]] && [ -f ${grubConfig} ] && cfgGrub=1 +[[ -n ${grub2Config} ]] && [ -f ${grub2Config} ] && cfgGrub2=1 +[[ -n ${grub2EfiConfig} ]] && [ -f ${grub2EfiConfig} ] && cfgGrub2Efi=1 +[[ -n ${liloConfig} ]] && [ -f ${liloConfig} ] && cfgLilo=1 + +# if we have a uBoot directory, check if it is mounted. +# if not, mount it. Then check if a boot script exists. +if [[ -n ${ubootDir} ]] +then + mountEntry=$(mount | grep ${ubootDir}) + if [[ -z ${mountEntry} ]] + then + mount ${ubootDevice} ${ubootDir} + mounted=1 + fi + [ -f ${ubootScript} ] && cfguBoot=1 fi - -[ -n "$grubConfig" ] && [ -f "$grubConfig" ] && cfgGrub=1; -[ -n "$liloConfig" ] && [ -f "$liloConfig" ] && cfgLilo=1; - # if we have a lilo config on an x86 box, see if the default boot loader # is lilo to determine if it should be run -if [ -n "$cfgLilo" -a -n "$isx86" ]; then - runLilo=$($grubby --bootloader-probe | grep lilo) +if [[ -n ${cfgLilo} ]] && [[ -n ${isx86} ]] +then + runLilo=$(${grubby} --bootloader-probe | grep lilo) fi -if [ "$mode" == "--install" ]; then - install -elif [ "$mode" == "--remove" ]; then - remove +if [[ ${mode} = --install ]] +then + install +elif [[ ${mode} = --remove ]] +then + remove +elif [[ ${mode} = --update ]] +then + update fi exit 0