--- trunk/grubby/new-kernel-pkg 2012/02/18 00:21:34 1702 +++ trunk/grubby/new-kernel-pkg 2013/10/21 13:47:50 2241 @@ -25,6 +25,32 @@ # along with this program. If not, see . # +read_os_release() +{ + local NAME + local ID + local Version + local Version_ID + local PRETTY_NAME + local ANSI_COLOR + local CPE_NAME + + if [[ -f /etc/os-release ]] + then + source /etc/os-release + + case $1 in + name) echo "${NAME}" ;; + id) echo "${ID}" ;; + version) echo "${Version}" ;; + version_id) echo "${Version_ID}" ;; + pretty_name) echo "${PRETTY_NAME}" ;; + ansi_color) echo "${ANSI_COLOR}" ;; + cpe_name) echo "${CPE_NAME}" ;; + esac + fi +} + PATH=/sbin:/bin:$PATH lilo=/sbin/lilo @@ -46,11 +72,13 @@ cfgGrub2Efi="" cfgGrub="" cfgLilo="" +cfgExtlinux="" cfguBoot="" runLilo="" grubConfig="" grub2Config="" grub2EfiConfig="" +extlinuxConfig="" ARCH=$(uname -m) @@ -63,6 +91,7 @@ elif [[ ${ARCH} = ppc64 ]] || [[ ${ARCH} = ppc ]] then liloConfig=/etc/yaboot.conf + grub2Config=/boot/grub/grub.cfg bootPrefix=/boot lilo=/sbin/ybin liloFlag=yaboot @@ -83,16 +112,17 @@ lilo=/sbin/zipl runLilo="yes" isx86="" -elif [[ ${ARCH} = armv7l ]] +elif [[ ${ARCH} =~ armv[5|7].*l ]] then liloConfig="" bootPrefix=/boot - ubootDir=${UBOOT_DIR:-"/boot/uboot"} + ubootDir=${UBOOT_DIR:-"/boot"} ubootScript=$ubootDir/${UBOOT_SCR:-"boot.scr"} ubootKList=${UBOOT_KLIST:-"klist.txt"} ubootDevice=/dev/${UBOOT_DEVICE:-"mmcblk0p1"} ubootDefaultImage=${UBOOT_UIMAGE:-"uImage"} ubootDefaultInitrd=${UBOOT_UINITRD:-"uInitrd"} + ubootAddress=${UBOOT_IMGADDR:-"0x00008000"} mounted="" liloFlag="" isx86="" @@ -102,6 +132,7 @@ grubConfig=/boot/grub/grub.conf grub2Config=/boot/grub/grub.cfg grub2EfiConfig=/boot/grub/grub-efi.cfg + extlinuxConfig=/boot/extlinux/extlinux.conf bootPrefix=/boot liloFlag=lilo isx86="yes" @@ -117,8 +148,8 @@ verbose="" makedefault="" package="" -mbkernel="" -mbargs="" +mbkernel="${HYPERVISOR}" +mbargs="${HYPERVISOR_ARGS}" adddracutargs="" addplymouthinitrd="" @@ -139,7 +170,7 @@ install() { # XXX kernel should be able to be specified also (or work right on ia64) - if [ ! -f ${bootPrefix}/${kernelName}-${version} ] + if [ ! -f ${kernelImage} ] then [[ -n ${verbose} ]] && echo "kernel for ${version} does not exist, not running grubby" return @@ -164,9 +195,9 @@ 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} + /sbin/addSystemMap ${bootPrefix}/System.map-${version} ${kernelImage} ${bootPrefix}/vmlinitrd-${version} else - /sbin/addSystemMap ${bootPrefix}/System.map-${version} ${bootPrefix}/${kernelName}-${version} ${bootPrefix}/vmlinux.sm-${version} + /sbin/addSystemMap ${bootPrefix}/System.map-${version} ${kernelImage} ${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 @@ -174,7 +205,11 @@ fi # get the root filesystem to use - rootdevice=$(awk '{ if ($1 !~ /^[ \t]*#/ && $2 == "/") { print $1; }}' /etc/fstab) + rootdevice=$(awk '{ if ($1 !~ /^[ \t]*#/ && $2 == "/") { print $1; }}' /etc/fstab 2>/dev/null) + if [[ -z $rootdevice ]] + then + rootdevice=$(grep -o -P "(?<=root=)\S+" /proc/cmdline) + fi if [[ -n ${mbkernel} ]] && [[ -n ${cfgLilo} ]] && [[ ${liloFlag} != elilo ]] then @@ -182,20 +217,25 @@ cfgLilo="" fi + if [[ -n ${banner} ]] + then + title="${banner} [ ${version} ]" + elif [[ $(read_os_release id) = magellan ]] + then + title="$(read_os_release name) $(read_os_release version_id) [ ${version} ]" + elif [ -f /etc/mageversion ] + then + title="Magellan Linux $(< /etc/mageversion) [ ${version} ]" + else + title="Magellan Linux [ ${version} ]" + 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} \ + ${grubby} --grub -c ${grubConfig} \ + --add-kernel=${kernelImage} \ ${INITRD} --copy-default ${makedefault} --title "${title}" \ ${mbkernel:+--add-multiboot="${mbkernel}"} ${mbargs:+--mbargs="${mbargs}"} \ --args="root=${rootdevice} ${kernargs}" --remove-kernel="TITLE=${title}" @@ -206,17 +246,8 @@ 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} \ + --add-kernel=${kernelImage} \ ${INITRD} --copy-default ${makedefault} --title "${title}" \ ${mbkernel:+--add-multiboot="${mbkernel}"} \ ${mbargs:+--mbargs="${mbargs}"} \ @@ -228,17 +259,8 @@ 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} \ + ${grubby} --grub2 -c ${grub2EfiConfig} --efi \ + --add-kernel=${kernelImage} \ ${INITRD} --copy-default ${makedefault} --title "${title}" \ ${mbkernel:+--add-multiboot="${mbkernel}"} \ ${mbargs:+--mbargs="${mbargs}"} \ @@ -251,7 +273,7 @@ then [[ -n ${verbose} ]] && echo "adding ${version} to ${liloConfig}" - ${grubby} --add-kernel=${bootPrefix}/${kernelName}-${version} ${INITRD} \ + ${grubby} --add-kernel=${kernelImage} ${INITRD} \ --copy-default ${makedefault} --title ${version} \ ${mbkernel:+--add-multiboot="${mbkernel}"} ${mbargs:+--mbargs="${mbargs}"} \ --args="root=${rootdevice} ${kernargs}" --remove-kernel="TITLE=${version}" \ @@ -270,6 +292,19 @@ else [[ -n ${verbose} ]] && echo "${liloConfig} does not exist, not running grubby" fi + + if [[ -n ${cfgExtlinux} ]] + then + [[ -n ${verbose} ]] && echo "adding ${version} to ${extlinuxConfig}" + + ${grubby} --extlinux -c ${extlinuxConfig} \ + --add-kernel=${kernelImage} \ + ${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 "${extlinuxConfig} does not exist, not running grubby for extlinux" + fi } remove() @@ -278,14 +313,15 @@ if [ -d /proc/iSeries ] then [[ -n ${verbose} ]] && echo "On an iSeries, remove img file" - rm -f ${bootPrefix}/${kernelName}-${version}.img 2>/dev/null + rm -f ${kernelImage}.img 2>/dev/null return fi if [[ -n ${cfgGrub} ]] then [[ -n ${verbose} ]] && echo "removing ${version} from ${grubConfig}" - ${grubby} --grub --remove-kernel=${bootPrefix}/${kernelName}-${version} + ${grubby} --grub -c ${grubConfig} \ + --remove-kernel=${kernelImage} else [[ -n ${verbose} ]] && echo "${grubConfig} does not exist, not running grubby for grub 0.97" fi @@ -293,15 +329,15 @@ then [[ -n ${verbose} ]] && echo "removing ${version} from ${grub2Config}" ${grubby} --grub2 -c ${grub2Config} \ - --remove-kernel=${bootPrefix}/${kernelName}-${version} + --remove-kernel=${kernelImage} 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} + ${grubby} --grub2 -c ${grub2EfiConfig} --efi \ + --remove-kernel=${kernelImage} else [[ -n ${verbose} ]] && echo "${grub2EfiConfig} does not exist, not running grubby grub 2 with UEFI" fi @@ -309,7 +345,7 @@ if [[ -n ${cfgLilo} ]] then [[ -n ${verbose} ]] && echo "removing ${version} from ${liloConfig}" - ${grubby} --remove-kernel=${bootPrefix}/${kernelName}-${version} --${liloFlag} + ${grubby} --remove-kernel=${kernelImage} --${liloFlag} if [[ -n ${runLilo} ]] then @@ -333,7 +369,7 @@ then tmpKList=$(mktemp ${ubootDir}/${ubootKList}.XXXX) curversion=$(tail -n1 ${ubootDir}/${ubootKList}) - sed "/${version}/d" ${ubootDir}/${ubootKList} > ${tmpKList} + sed "/$version$/d" ${ubootDir}/${ubootKList} > ${tmpKList} newversion=$(tail -n1 ${tmpKList}) if [ -f ${ubootDir}/uImage-${newversion} ] && [ -f ${ubootDir}/uInitrd-${newversion} ] then @@ -373,16 +409,25 @@ [ -f ${tmpKList} ] && rm -f ${tmpKList} fi else - [[ -n ${verbose} ]] && echo "No previous kernel version. uBoot images not removed!" + [[ -n ${verbose} ]] && echo "No previous kernel version. U-Boot images not removed!" fi else [[ -n ${verbose} ]] && echo "${ubootScript} does not exist, not modifying ${ubootDir}" fi + + if [[ -n ${cfgExtlinux} ]] + then + [[ -n ${verbose} ]] && echo "removing ${version} from ${extlinuxConfig}" + ${grubby} --extlinux -c ${extlinuxConfig} \ + --remove-kernel=${kernelImage} + else + [[ -n ${verbose} ]] && echo "${extlinuxConfig} does not exist, not running grubby for extlinux" + fi } update() { - if [ ! -f ${bootPrefix}/${kernelName}-${version} ] + if [ ! -f ${kernelImage} ] then [[ -n ${verbose} ]] && echo "kernel for ${version} does not exist, not running grubby" return @@ -403,7 +448,8 @@ if [[ -n ${cfgGrub} ]] then [[ -n ${verbose} ]] && echo "updating ${version} from ${grubConfig}" - ${grubby} --update-kernel=${bootPrefix}/${kernelName}-${version} \ + ${grubby} --grub -c ${grubConfig} \ + --update-kernel=${kernelImage} \ ${INITRD} \ ${kernargs:+--args="${kernargs}"} \ ${removeargs:+--remove-args="${removeargs}"} @@ -415,7 +461,7 @@ then [[ -n ${verbose} ]] && echo "updating ${version} from ${grub2Config}" ${grubby} --grub2 -c ${grub2Config} \ - --update-kernel=${bootPrefix}/${kernelName}-${version} \ + --update-kernel=${kernelImage} \ ${INITRD} \ ${kernargs:+--args="${kernargs}"} \ ${removeargs:+--remove-args="${removeargs}"} @@ -426,8 +472,8 @@ if [[ -n ${cfgGrub2Efi} ]] then [[ -n ${verbose} ]] && echo "updating ${version} from ${grub2EfiConfig}" - ${grubby} --grub2 -c ${grub2EfiConfig} \ - --update-kernel=${bootPrefix}/${kernelName}-${version} \ + ${grubby} --grub2 -c ${grub2EfiConfig} --efi \ + --update-kernel=${kernelImage} \ ${INITRD} \ ${kernargs:+--args="${kernargs}"} \ ${removeargs:+--remove-args="${removeargs}"} @@ -438,7 +484,7 @@ if [[ -n ${cfgLilo} ]] then [[ -n ${verbose} ]] && echo "updating ${version} from ${liloConfig}" - ${grubby} --update-kernel=${bootPrefix}/${kernelName}-${version} \ + ${grubby} --update-kernel=${kernelImage} \ ${INITRD} \ ${kernargs:+--args="${kernargs}"} \ ${removeargs:+--remove-args="${removeargs}"} \ @@ -463,8 +509,9 @@ [[ -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} + mkimage -A arm -O linux -T kernel -C none -a ${ubootAddress} \ + -e ${ubootAddress} -n ${version} \ + -d ${kernelImage} ${ubootDir}/uImage-${version} [[ -n ${verbose} ]] && echo "creating uInitrd-${version}" mkimage -A arm -O linux -T ramdisk -C none -a 0 -e 0 \ @@ -489,15 +536,27 @@ else [[ -n ${verbose} ]] && echo "${ubootScript} does not exist, not setting up ${ubootDir}" fi + + if [[ -n ${cfgExtlinux} ]] + then + [[ -n ${verbose} ]] && echo "updating ${version} from ${extlinuxConfig}" + ${grubby} --extlinux -c ${extlinuxConfig} \ + --update-kernel=${kernelImage} \ + ${INITRD} \ + ${kernargs:+--args="${kernargs}"} \ + ${removeargs:+--remove-args="${removeargs}"} + else + [[ -n ${verbose} ]] && echo "${extlinuxConfig} does not exist, not running grubby" + fi } -mkinitrd() +makeinitrd() { if [[ -n ${dracut} ]] then - tool="/sbin/dracut ${dracuthostonly} -f ${initrdfile} ${version}" + tool="dracut ${dracuthostonly} -f ${initrdfile} ${version}" else - tool="/sbin/mkinitrd --allow-missing -f ${initrdfile} ${version}" + tool="mkinitrd --allow-missing -f ${initrdfile} ${version}" fi [[ -n ${verbose} ]] && echo "creating initrd ${initrdfile} using ${version}" ${tool} @@ -548,9 +607,9 @@ ;; --initrdfile*) - if echo $1 | grep '=' >/dev/null + if [[ $1 == --initrdfile\=* ]] then - initrdfile=$(echo $1 | sed 's/^--initrdfile=//') + initrdfile=${1#--initrdfile=} else initrdfile=$2 shift @@ -558,9 +617,9 @@ ;; --kernel-args*) - if echo $1 | grep '=' >/dev/null + if [[ $1 == --kernel-args\=* ]] then - kernargs=$(echo $1 | sed 's/^--kernel-args=//') + kernargs=${1#--kernel-args=} else kernargs=$2 shift @@ -568,9 +627,9 @@ ;; --remove-args*) - if echo $1 | grep '=' >/dev/null + if [[ $1 == --remove-args\=* ]] then - removeargs=$(echo $1 | sed 's/^--remove-args=//') + removeargs=${1#--remove-args=} else removeargs=$2 shift @@ -578,9 +637,9 @@ ;; --banner*) - if echo $1 | grep '=' >/dev/null + if [[ $1 == --banner\=* ]] then - banner=$(echo $1 | sed 's/^--banner=//') + banner=${1#--banner=} else banner=$2 shift @@ -588,9 +647,9 @@ ;; --multiboot*) - if echo $1 |grep '=' >/dev/null + if [[ $1 == --multiboot\=* ]] then - mbkernel=$(echo $1 | sed 's/^--multiboot=//') + mbkernel=${1#--multiboot=} else # can't really support having an optional second arg here # sorry! @@ -599,9 +658,9 @@ ;; --mbargs*) - if echo $1 |grep '=' >/dev/null + if [[ $1 == --mbargs\=* ]] then - mbargs=$(echo $1 | sed 's/^--mbargs=//') + mbargs=${1#--mbargs=} else mbargs="$2" shift @@ -620,10 +679,10 @@ makedefault="--make-default" ;; - --package) - if echo $1 | grep '=' >/dev/null + --package*) + if [[ $1 == --package\=* ]] then - package=$(echo $1 | sed 's/^--package=//') + package=${1#--package=} else package=$2 shift @@ -638,6 +697,22 @@ addplymouthinitrd=--add-plymouth-initrd ;; + --kernel-image*) + if [[ $1 == --kernel-image\=* ]] + then + kernelImage=${1#--kernel-image=} + else + kernelImage="$2" + shift + fi + if ! [[ -f ${kernelImage} ]] + then + echo "Can't find kernel image '${kernelImage}'" >&2 + usage + exit 1 + fi + ;; + -v) verbose=-v ;; @@ -685,6 +760,8 @@ fi fi +[[ ${kernelImage} ]] || kernelImage="${bootPrefix}/${kernelName}-${version}" + # set the initrd file based on arch; ia64 is the only currently known oddball if [[ -z ${initrdfile} ]] then @@ -706,17 +783,45 @@ # 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} ]] + if [ -r /etc/vconsole.conf ] then - kernargs="${kernargs} KEYTABLE=${KEYMAP}" + . /etc/vconsole.conf + + for i in SYSFONT SYSFONTACM UNIMAP KEYTABLE + do + val=$(eval echo \$$i) + [[ -n ${val} ]] && kernargs="${kernargs} ${i}=${val}" + done + else + if [ -r /etc/conf.d/consolefont ] + then + . /etc/conf.d/consolefont + + if [[ -n ${CONSOLEFONT} ]] + then + kernargs="${kernargs} SYSFONT=${CONSOLEFONT}" + fi + fi + + if [ -r /etc/conf.d/keymap ] + then + . /etc/conf.d/keymap + + if [[ -n ${KEYMAP} ]] + then + kernargs="${kernargs} KEYTABLE=${KEYMAP}" + fi + fi fi - if [[ -n ${CONSOLEFONT} ]] + if [ -r /etc/locale.conf ] then - kernargs="${kernargs} SYSFONT=${CONSOLEFONT}" + . /etc/locale.conf + + if [[ -n ${LANG} ]] + then + kernargs="${kernargs} LANG=${LANG}" + fi fi fi @@ -738,7 +843,7 @@ if [[ ${initrd} = make ]] then - mkinitrd + makeinitrd elif [[ ${initrd} = remove ]] then rminitrd @@ -754,18 +859,39 @@ [[ -n ${grub2Config} ]] && [ -f ${grub2Config} ] && cfgGrub2=1 [[ -n ${grub2EfiConfig} ]] && [ -f ${grub2EfiConfig} ] && cfgGrub2Efi=1 [[ -n ${liloConfig} ]] && [ -f ${liloConfig} ] && cfgLilo=1 +[[ -n ${extlinuxConfig} ]] && [ -f ${extlinuxConfig} ] && cfgExtlinux=1 -# if we have a uBoot directory, check if it is mounted. -# if not, mount it. Then check if a boot script exists. +# if we have a U-Boot directory, but no boot script, check if the directory +# is mounted. If not, mount it, and then check if a boot script exists. if [[ -n ${ubootDir} ]] then - mountEntry=$(mount | grep ${ubootDir}) - if [[ -z ${mountEntry} ]] + if [ -f ${ubootScript} ] then - mount ${ubootDevice} ${ubootDir} - mounted=1 + cfguBoot=1 + else + mountEntry=$(mount | grep ${ubootDir}) + if [[ -z ${mountEntry} ]] + then + mount ${ubootDevice} ${ubootDir} + mounted=1 + fi + [ -f ${ubootScript} ] && cfguBoot=1 + fi +fi + +# if we're using U-Boot, check if the default load address should change +if [[ -n ${cfguBoot} ]] && [[ -z ${UBOOT_IMGADDR} ]] +then + [[ ${version} =~ .([^.]*)$ ]] + platform=${BASH_REMATCH[1]} + # A few platforms use an alternate kernel load address + if [[ ${platform} = omap ]] + then + ubootAddress=0x80008000 + elif [[ ${platform} = imx ]] + then + ubootAddress=0x90008000 fi - [ -f ${ubootScript} ] && cfguBoot=1 fi # if we have a lilo config on an x86 box, see if the default boot loader @@ -786,4 +912,7 @@ update fi +# if we mounted the U-Boot directory, unmount it. +[[ -n ${mounted} ]] && umount ${ubootDir} + exit 0