--- trunk/grubby/new-kernel-pkg 2012/02/18 11:57:40 1757
+++ trunk/grubby/new-kernel-pkg 2014/07/16 10:54:46 2704
@@ -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
@@ -65,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
@@ -85,26 +112,21 @@
lilo=/sbin/zipl
runLilo="yes"
isx86=""
-elif [[ ${ARCH} = armv7l ]] || [[ ${ARCH} = armv7hl ]]
+elif [[ ${ARCH} =~ armv[5|7].*l ]]
then
- machine=$(grep "^Hardware" /proc/cpuinfo | sed 's/Hardware\s*:\s*//')
liloConfig=""
bootPrefix=/boot
- ubootDir=${UBOOT_DIR:-"/boot/uboot"}
+ extlinuxConfig=$(readlink -f /etc/extlinux.conf 2>/dev/null)
+ 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=""
- if [[ ${machine} == "OMAP3 Beagle Board" ]] || [[ ${machine} == "OMAP4 Panda board" ]]
- then
- ubootAddress=0x80008000
- else
- ubootAddress=0x00008000
- fi
else
# this leaves i?86 and x86_64
liloConfig=/etc/lilo.conf
@@ -123,6 +145,7 @@
dracut=""
dracuthostonly=""
initrdfile=""
+devtreefile=""
moddep=""
verbose=""
makedefault=""
@@ -140,7 +163,7 @@
echo " [--banner=] [--multiboot=multiboot]" >&2
echo " [--mbargs=mbargs] [--make-default] [--add-dracut-args]" >&2
echo " [--add-plymouth-initrd]" >&2
- echo " [--host-only]" >&2
+ echo " [--host-only] [--devtree=]" >&2
echo " <--install | --remove | --update> " >&2
echo " (ex: $(basename $0) --mkinitrd --depmod --install 2.4.7-2)" >&2
exit 1
@@ -149,7 +172,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
@@ -167,6 +190,13 @@
fi
fi
+ DEVTREE=""
+ if [[ x${devtreefile} != x ]] && [ -f "${devtreefile}" ]
+ then
+ [[ -n ${verbose} ]] && echo "found ${devtreefile} and using it with grubby"
+ DEVTREE="--devtree ${devtreefile}"
+ fi
+
# FIXME: is this a good heuristic to find out if we're on iSeries?
if [ -d /proc/iSeries ]
then
@@ -174,9 +204,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
@@ -184,7 +214,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
@@ -192,21 +226,33 @@
cfgLilo=""
fi
- if [[ -n ${cfgGrub} ]]
+ if [[ -n ${banner} ]]
then
- [[ -n ${verbose} ]] && echo "adding ${version} to ${grubConfig}"
-
- if [[ -n ${banner} ]]
+ if [[ ${ARCH} = s390 ]] || [[ ${ARCH} = s390x ]]
then
- title="${banner} [ ${version} ]"
- elif [ -f /etc/mageversion ]
- then
- title="Magellan Linux $(< /etc/mageversion) [ ${version} ]"
+ title=$(echo ${banner} | sed 's/ /_/g')
else
- title="Magellan Linux [ ${version} ]"
+ title="${banner} [ ${version} ]"
fi
+ elif [[ ${ARCH} = s390 ]] || [[ ${ARCH} = s390x ]]
+ then
+ title=$(echo ${version} | sed 's/ /_/g')
+ elif [ -f /etc/os-release ]
+ 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}"
+
${grubby} --grub -c ${grubConfig} \
- --add-kernel=${bootPrefix}/${kernelName}-${version} \
+ --add-kernel=${kernelImage} \
${INITRD} --copy-default ${makedefault} --title "${title}" \
${mbkernel:+--add-multiboot="${mbkernel}"} ${mbargs:+--mbargs="${mbargs}"} \
--args="root=${rootdevice} ${kernargs}" --remove-kernel="TITLE=${title}"
@@ -217,17 +263,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}"} \
@@ -239,17 +276,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} ${DEVTREE} \
${INITRD} --copy-default ${makedefault} --title "${title}" \
${mbkernel:+--add-multiboot="${mbkernel}"} \
${mbargs:+--mbargs="${mbargs}"} \
@@ -262,8 +290,8 @@
then
[[ -n ${verbose} ]] && echo "adding ${version} to ${liloConfig}"
- ${grubby} --add-kernel=${bootPrefix}/${kernelName}-${version} ${INITRD} \
- --copy-default ${makedefault} --title ${version} \
+ ${grubby} --add-kernel=${kernelImage} ${INITRD} \
+ --copy-default ${makedefault} --title "${title}" \
${mbkernel:+--add-multiboot="${mbkernel}"} ${mbargs:+--mbargs="${mbargs}"} \
--args="root=${rootdevice} ${kernargs}" --remove-kernel="TITLE=${version}" \
--${liloFlag}
@@ -286,17 +314,8 @@
then
[[ -n ${verbose} ]] && echo "adding ${version} to ${extlinuxConfig}"
- 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} --extlinux -c ${extlinuxConfig} \
- --add-kernel=${bootPrefix}/${kernelName}-${version} \
+ --add-kernel=${kernelImage} \
${INITRD} --copy-default ${makedefault} --title "${title}" \
${mbkernel:+--add-multiboot="${mbkernel}"} ${mbargs:+--mbargs="${mbargs}"} \
--args="root=${rootdevice} ${kernargs}" --remove-kernel="TITLE=${title}"
@@ -311,7 +330,7 @@
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
@@ -319,7 +338,7 @@
then
[[ -n ${verbose} ]] && echo "removing ${version} from ${grubConfig}"
${grubby} --grub -c ${grubConfig} \
- --remove-kernel=${bootPrefix}/${kernelName}-${version}
+ --remove-kernel=${kernelImage}
else
[[ -n ${verbose} ]] && echo "${grubConfig} does not exist, not running grubby for grub 0.97"
fi
@@ -327,15 +346,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
@@ -343,7 +362,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
@@ -367,7 +386,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
@@ -402,6 +421,7 @@
fi
mv ${tmpKList} ${ubootDir}/${ubootKList}
+ [ -x /sbin/a-b-c ] && /sbin/a-b-c
else
[[ -n ${verbose} ]] && echo "uImage ${newversion} does not exist!"
[ -f ${tmpKList} ] && rm -f ${tmpKList}
@@ -417,7 +437,7 @@
then
[[ -n ${verbose} ]] && echo "removing ${version} from ${extlinuxConfig}"
${grubby} --extlinux -c ${extlinuxConfig} \
- --remove-kernel=${bootPrefix}/${kernelName}-${version}
+ --remove-kernel=${kernelImage}
else
[[ -n ${verbose} ]] && echo "${extlinuxConfig} does not exist, not running grubby for extlinux"
fi
@@ -425,7 +445,7 @@
update()
{
- if [ ! -f ${bootPrefix}/${kernelName}-${version} ]
+ if [ ! -f ${kernelImage} ]
then
[[ -n ${verbose} ]] && echo "kernel for ${version} does not exist, not running grubby"
return
@@ -447,10 +467,11 @@
then
[[ -n ${verbose} ]] && echo "updating ${version} from ${grubConfig}"
${grubby} --grub -c ${grubConfig} \
- --update-kernel=${bootPrefix}/${kernelName}-${version} \
+ --update-kernel=${kernelImage} \
${INITRD} \
${kernargs:+--args="${kernargs}"} \
- ${removeargs:+--remove-args="${removeargs}"}
+ ${removeargs:+--remove-args="${removeargs}"} \
+ ${mbkernel:+--add-multiboot="${mbkernel}"}
else
[[ -n ${verbose} ]] && echo "${grubConfig} does not exist, not running grubby"
fi
@@ -459,7 +480,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}"}
@@ -470,8 +491,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}"}
@@ -482,7 +503,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}"} \
@@ -509,7 +530,7 @@
[[ -n ${verbose} ]] && echo "creating uImage-${version}"
mkimage -A arm -O linux -T kernel -C none -a ${ubootAddress} \
-e ${ubootAddress} -n ${version} \
- -d ${bootPrefix}/${kernelName}-${version} ${ubootDir}/uImage-${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 \
@@ -528,6 +549,7 @@
[[ -n ${verbose} ]] && echo "copy uInitrd-${version} error, kernel not installed!" && exit
fi
echo ${version} >> ${ubootDir}/${ubootKList}
+ [ -x /sbin/a-b-c ] && /sbin/a-b-c
else
[[ -n ${verbose} ]] && echo "cannot make ${version} the default"
fi
@@ -539,7 +561,7 @@
then
[[ -n ${verbose} ]] && echo "updating ${version} from ${extlinuxConfig}"
${grubby} --extlinux -c ${extlinuxConfig} \
- --update-kernel=${bootPrefix}/${kernelName}-${version} \
+ --update-kernel=${kernelImage} \
${INITRD} \
${kernargs:+--args="${kernargs}"} \
${removeargs:+--remove-args="${removeargs}"}
@@ -581,7 +603,11 @@
doRmmoddep()
{
[[ -n ${verbose} ]] && echo "removing modules.dep info for ${version}"
- [ -d /lib/modules/${version} ] && rm -f /lib/modules/${version}/modules.*
+ if [ -d /lib/modules/${version} ]
+ then
+ rm -f /lib/modules/${version}/modules.*.bin \
+ /lib/modules/${version}/modules.{alias,dep,devname,symbols,softdep}
+ fi
}
@@ -596,6 +622,16 @@
initrd="remove"
;;
+ --devtree*)
+ if [[ $1 == --devtree\=* ]]
+ then
+ devtreefile="${1#--devtreefile=}"
+ else
+ devtreefile="$2"
+ shift
+ fi
+ ;;
+
--dracut)
dracut=--dracut
;;
@@ -605,9 +641,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
@@ -615,9 +651,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
@@ -625,9 +661,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
@@ -635,9 +671,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
@@ -645,9 +681,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!
@@ -656,9 +692,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
@@ -677,10 +713,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
@@ -695,6 +731,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
;;
@@ -742,6 +794,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
@@ -763,17 +817,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
@@ -831,6 +913,21 @@
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
+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} ]]