--- trunk/mkinitrd-magellan/grubby/new-kernel-pkg 2009/10/28 13:29:18 925 +++ trunk/grubby/new-kernel-pkg 2012/02/18 00:21:34 1702 @@ -40,11 +40,17 @@ fi [ -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) @@ -77,10 +83,25 @@ 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 + grub2Config=/boot/grub/grub.cfg + grub2EfiConfig=/boot/grub/grub-efi.cfg bootPrefix=/boot liloFlag=lilo isx86="yes" @@ -89,6 +110,8 @@ mode="" version="" initrd="" +dracut="" +dracuthostonly="" initrdfile="" moddep="" verbose="" @@ -96,14 +119,18 @@ package="" mbkernel="" mbargs="" +adddracutargs="" +addplymouthinitrd="" usage() { - echo "Usage: $(basename $0) [-v] [--mkinitrd] [--rminitrd]" >&2 + echo "Usage: $(basename $0) [-v] [--mkinitrd] [--rminitrd] [--dracut]" >&2 echo " [--initrdfile=] [--depmod] [--rmmoddep]" >&2 - echo " [--kernel-args=] [--remove-args=]" >&2 + echo " [--kernel-args=] [--remove-args=]" >&2 echo " [--banner=] [--multiboot=multiboot]" >&2 - echo " [--mbargs=mbargs] [--make-default]" >&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 @@ -123,6 +150,11 @@ 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? @@ -163,12 +195,56 @@ else title="Magellan Linux (${version})" fi - ${grubby} --add-kernel=${bootPrefix}/${kernelName}-${version} \ + ${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" + [[ -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} ]] @@ -184,7 +260,7 @@ if [[ -n ${runLilo} ]] then [[ -n ${verbose} ]] && echo "running ${lilo}" - if [ ! -x $lilo ] + if [ ! -x ${lilo} ] then [[ -n ${verbose} ]] && echo "${lilo} does not exist" else @@ -209,16 +285,31 @@ if [[ -n ${cfgGrub} ]] then [[ -n ${verbose} ]] && echo "removing ${version} from ${grubConfig}" - ${grubby} --remove-kernel=${bootPrefix}/${kernelName}-${version} + ${grubby} --grub --remove-kernel=${bootPrefix}/${kernelName}-${version} else - [[ -n ${verbose} ]] && echo "${grubConfig} does not exist, not running grubby" + [[ -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} + ${grubby} --remove-kernel=${bootPrefix}/${kernelName}-${version} --${liloFlag} if [[ -n ${runLilo} ]] then @@ -233,24 +324,122 @@ 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 } 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} @@ -268,12 +457,50 @@ 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 } 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}" - /sbin/mkinitrd --allow-missing -f ${initrdfile} ${version} + ${tool} rc=$? if [ ${rc} != 0 ] then @@ -312,6 +539,14 @@ initrd="remove" ;; + --dracut) + dracut=--dracut + ;; + + --host-only) + dracuthostonly=-H + ;; + --initrdfile*) if echo $1 | grep '=' >/dev/null then @@ -335,7 +570,7 @@ --remove-args*) if echo $1 | grep '=' >/dev/null then - removeargs=$(echo $1 | sed 's/^--remove-args=//') + removeargs=$(echo $1 | sed 's/^--remove-args=//') else removeargs=$2 shift @@ -395,6 +630,14 @@ fi ;; + --add-dracut-args) + adddracutargs=--add-dracut-args + ;; + + --add-plymouth-initrd) + addplymouthinitrd=--add-plymouth-initrd + ;; + -v) verbose=-v ;; @@ -433,7 +676,7 @@ kernelmajor=$(echo ${kernel} | cut -d . -f 1,2) -# kernel image for 2.4 is vmlinux +# kernel image for 2.4 is kernel if [[ ${ARCH} = ppc64 ]] || [[ ${ARCH} = ppc ]] then if [[ ${kernelmajor} = 2.4 ]] @@ -446,6 +689,10 @@ if [[ -z ${initrdfile} ]] then INITRD_NAME_PREFIX="initrd" + if [[ -n ${dracut} ]] + then + INITRD_NAME_PREFIX="initramfs" + fi if [[ $(uname -m) = ia64 ]] then @@ -456,6 +703,23 @@ fi [[ -n ${verbose} ]] && echo "initrdfile is ${initrdfile}" +# 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 [[ -n ${CONSOLEFONT} ]] + then + kernargs="${kernargs} SYSFONT=${CONSOLEFONT}" + fi +fi + # set this as the default if we have the package and it matches if [[ ${mode} = --install ]] && [[ ${UPDATEDEFAULT} = yes ]] && [[ -n ${package} ]] && [[ -n ${DEFAULTKERNEL} ]] && [[ ${package} = ${DEFAULTKERNEL} ]] @@ -487,8 +751,23 @@ 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 + # 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} ]]