#!/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 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 lilo=/sbin/lilo # some defaults that are sane for most arches kernelName=kernel if [ -x ./grubby ] then grubby=./grubby else grubby=/sbin/grubby fi [ -f /etc/conf.d/grubby ] && . /etc/conf.d/grubby cfgGrub="" cfgLilo="" runLilo="" grubConfig="" 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 ]] || [[ ${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="" else # this leaves i?86 and x86_64 liloConfig=/etc/lilo.conf grubConfig=/boot/grub/grub.conf bootPrefix=/boot liloFlag=lilo isx86="yes" fi mode="" version="" initrd="" initrdfile="" moddep="" verbose="" makedefault="" package="" mbkernel="" mbargs="" usage() { echo "Usage: $(basename $0) [-v] [--mkinitrd] [--rminitrd]" >&2 echo " [--initrdfile=] [--depmod] [--rmmoddep]" >&2 echo " [--kernel-args=] [--remove-args=]" >&2 echo " [--banner=] [--multiboot=multiboot]" >&2 echo " [--mbargs=mbargs] [--make-default]" >&2 echo " <--install | --remove | --update> " >&2 echo " (ex: $(basename $0) --mkinitrd --depmod --install 2.4.7-2)" >&2 exit 1 } run_grub2() { if [ -d /boot/grub2 -a -x /sbin/grub2-mkconfig ] then cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg.old /sbin/grub2-mkconfig -o /boot/grub2/grub.cfg 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}" 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 # Run grub2's configuration update in parallel, if it is installed run_grub2 # 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} --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" 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 # Run grub2's configuration update in parallel, if it is installed run_grub2 if [[ -n ${cfgGrub} ]] then [[ -n ${verbose} ]] && echo "removing ${version} from ${grubConfig}" ${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}" ${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 } 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}" fi # Run grub2's configuration update in parallel, if it is installed run_grub2 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 ${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 } 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 } rminitrd() { [[ -n ${verbose} ]] && echo "removing initrd ${initrdfile}" [ -f ${initrdfile} ] && rm -f ${initrdfile} } 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 ;; --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 ;; -v) verbose=-v ;; *) if [[ -z ${mode} ]] then mode=$1 elif [[ -z ${version} ]] then version=$1 else usage fi ;; esac shift done # make sure the mode is valid if [[ ${mode} != --install ]] && [[ ${mode} != --remove ]] && [[ ${mode} != --update ]] then usage fi if [[ -z ${version} ]] then usage fi if [ "${mode}" != "--install" -a "${makedefault}" ] then usage fi kernelmajor=$(echo ${kernel} | cut -d . -f 1,2) # 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 INITRD_NAME_PREFIX="initrd" 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}" # 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 ${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} ]] && [[ -n ${isx86} ]] then runLilo=$(${grubby} --bootloader-probe | grep lilo) fi if [[ ${mode} = --install ]] then install elif [[ ${mode} = --remove ]] then remove elif [[ ${mode} = --update ]] then update fi exit 0