Files
poky/meta/classes/kernel-grub.bbclass
Richard Purdie ff525695f2 classes: Add SPDX license identifiers
As stated in our top level license files, the license is MIT unless
otherwise stated. Add SPDX identifers accordingly. Replace older
license statementa with the standardised syntax. Also drop "All
Rights Reserved" expression as it isn't used now, doesn't mean anything
and is confusing.

(From OE-Core rev: 081a391fe09a21265881e39a2a496e4e10b4f80b)

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
2022-08-12 11:58:01 +01:00

112 lines
3.6 KiB
Plaintext

#
# Copyright OpenEmbedded Contributors
#
# SPDX-License-Identifier: MIT
#
#
# While installing a rpm to update kernel on a deployed target, it will update
# the boot area and the boot menu with the kernel as the priority but allow
# you to fall back to the original kernel as well.
#
# - In kernel-image's preinstall scriptlet, it backs up original kernel to avoid
# probable confliction with the new one.
#
# - In kernel-image's postinstall scriptlet, it modifies grub's config file to
# updates the new kernel as the boot priority.
#
python __anonymous () {
import re
preinst = '''
# Parsing confliction
[ -f "$D/boot/grub/menu.list" ] && grubcfg="$D/boot/grub/menu.list"
[ -f "$D/boot/grub/grub.cfg" ] && grubcfg="$D/boot/grub/grub.cfg"
if [ -n "$grubcfg" ]; then
# Dereference symlink to avoid confliction with new kernel name.
if grep -q "/KERNEL_IMAGETYPE \+root=" $grubcfg; then
if [ -L "$D/boot/KERNEL_IMAGETYPE" ]; then
kimage=`realpath $D/boot/KERNEL_IMAGETYPE 2>/dev/null`
if [ -f "$D$kimage" ]; then
sed -i "s:KERNEL_IMAGETYPE \+root=:${kimage##*/} root=:" $grubcfg
fi
fi
fi
# Rename old kernel if it conflicts with new kernel name.
if grep -q "/KERNEL_IMAGETYPE-${KERNEL_VERSION} \+root=" $grubcfg; then
if [ -f "$D/boot/KERNEL_IMAGETYPE-${KERNEL_VERSION}" ]; then
timestamp=`date +%s`
kimage="$D/boot/KERNEL_IMAGETYPE-${KERNEL_VERSION}-$timestamp-back"
sed -i "s:KERNEL_IMAGETYPE-${KERNEL_VERSION} \+root=:${kimage##*/} root=:" $grubcfg
mv "$D/boot/KERNEL_IMAGETYPE-${KERNEL_VERSION}" "$kimage"
fi
fi
fi
'''
postinst = '''
get_new_grub_cfg() {
grubcfg="$1"
old_image="$2"
title="Update KERNEL_IMAGETYPE-${KERNEL_VERSION}-${PV}"
if [ "${grubcfg##*/}" = "grub.cfg" ]; then
rootfs=`grep " *linux \+[^ ]\+ \+root=" $grubcfg -m 1 | \
sed "s#${old_image}#${old_image%/*}/KERNEL_IMAGETYPE-${KERNEL_VERSION}#"`
echo "menuentry \"$title\" {"
echo " set root=(hd0,1)"
echo "$rootfs"
echo "}"
elif [ "${grubcfg##*/}" = "menu.list" ]; then
rootfs=`grep "kernel \+[^ ]\+ \+root=" $grubcfg -m 1 | \
sed "s#${old_image}#${old_image%/*}/KERNEL_IMAGETYPE-${KERNEL_VERSION}#"`
echo "default 0"
echo "timeout 30"
echo "title $title"
echo "root (hd0,0)"
echo "$rootfs"
fi
}
get_old_grub_cfg() {
grubcfg="$1"
if [ "${grubcfg##*/}" = "grub.cfg" ]; then
cat "$grubcfg"
elif [ "${grubcfg##*/}" = "menu.list" ]; then
sed -e '/^default/d' -e '/^timeout/d' "$grubcfg"
fi
}
if [ -f "$D/boot/grub/grub.cfg" ]; then
grubcfg="$D/boot/grub/grub.cfg"
old_image=`grep ' *linux \+[^ ]\+ \+root=' -m 1 "$grubcfg" | awk '{print $2}'`
elif [ -f "$D/boot/grub/menu.list" ]; then
grubcfg="$D/boot/grub/menu.list"
old_image=`grep '^kernel \+[^ ]\+ \+root=' -m 1 "$grubcfg" | awk '{print $2}'`
fi
# Don't update grubcfg at first install while old bzImage doesn't exist.
if [ -f "$D/boot/${old_image##*/}" ]; then
grubcfgtmp="$grubcfg.tmp"
get_new_grub_cfg "$grubcfg" "$old_image" > $grubcfgtmp
get_old_grub_cfg "$grubcfg" >> $grubcfgtmp
mv $grubcfgtmp $grubcfg
echo "Caution! Update kernel may affect kernel-module!"
fi
'''
imagetypes = d.getVar('KERNEL_IMAGETYPES')
imagetypes = re.sub(r'\.gz$', '', imagetypes)
for type in imagetypes.split():
typelower = type.lower()
preinst_append = preinst.replace('KERNEL_IMAGETYPE', type)
postinst_prepend = postinst.replace('KERNEL_IMAGETYPE', type)
d.setVar('pkg_preinst:kernel-image-' + typelower + ':append', preinst_append)
d.setVar('pkg_postinst:kernel-image-' + typelower + ':prepend', postinst_prepend)
}