xref: /OK3568_Linux_fs/yocto/poky/meta/classes/kernel-grub.bbclass (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#
2*4882a593Smuzhiyun# While installing a rpm to update kernel on a deployed target, it will update
3*4882a593Smuzhiyun# the boot area and the boot menu with the kernel as the priority but allow
4*4882a593Smuzhiyun# you to fall back to the original kernel as well.
5*4882a593Smuzhiyun#
6*4882a593Smuzhiyun# - In kernel-image's preinstall scriptlet, it backs up original kernel to avoid
7*4882a593Smuzhiyun#   probable confliction with the new one.
8*4882a593Smuzhiyun#
9*4882a593Smuzhiyun# - In kernel-image's postinstall scriptlet, it modifies grub's config file to
10*4882a593Smuzhiyun#   updates the new kernel as the boot priority.
11*4882a593Smuzhiyun#
12*4882a593Smuzhiyun
13*4882a593Smuzhiyunpython __anonymous () {
14*4882a593Smuzhiyun    import re
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun    preinst = '''
17*4882a593Smuzhiyun	# Parsing confliction
18*4882a593Smuzhiyun	[ -f "$D/boot/grub/menu.list" ] && grubcfg="$D/boot/grub/menu.list"
19*4882a593Smuzhiyun	[ -f "$D/boot/grub/grub.cfg" ] && grubcfg="$D/boot/grub/grub.cfg"
20*4882a593Smuzhiyun	if [ -n "$grubcfg" ]; then
21*4882a593Smuzhiyun		# Dereference symlink to avoid confliction with new kernel name.
22*4882a593Smuzhiyun		if grep -q "/KERNEL_IMAGETYPE \+root=" $grubcfg; then
23*4882a593Smuzhiyun			if [ -L "$D/boot/KERNEL_IMAGETYPE" ]; then
24*4882a593Smuzhiyun				kimage=`realpath $D/boot/KERNEL_IMAGETYPE 2>/dev/null`
25*4882a593Smuzhiyun				if [ -f "$D$kimage" ]; then
26*4882a593Smuzhiyun					sed -i "s:KERNEL_IMAGETYPE \+root=:${kimage##*/} root=:" $grubcfg
27*4882a593Smuzhiyun				fi
28*4882a593Smuzhiyun			fi
29*4882a593Smuzhiyun		fi
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun		# Rename old kernel if it conflicts with new kernel name.
32*4882a593Smuzhiyun		if grep -q "/KERNEL_IMAGETYPE-${KERNEL_VERSION} \+root=" $grubcfg; then
33*4882a593Smuzhiyun			if [ -f "$D/boot/KERNEL_IMAGETYPE-${KERNEL_VERSION}" ]; then
34*4882a593Smuzhiyun				timestamp=`date +%s`
35*4882a593Smuzhiyun				kimage="$D/boot/KERNEL_IMAGETYPE-${KERNEL_VERSION}-$timestamp-back"
36*4882a593Smuzhiyun				sed -i "s:KERNEL_IMAGETYPE-${KERNEL_VERSION} \+root=:${kimage##*/} root=:" $grubcfg
37*4882a593Smuzhiyun				mv "$D/boot/KERNEL_IMAGETYPE-${KERNEL_VERSION}" "$kimage"
38*4882a593Smuzhiyun			fi
39*4882a593Smuzhiyun		fi
40*4882a593Smuzhiyun	fi
41*4882a593Smuzhiyun'''
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun    postinst = '''
44*4882a593Smuzhiyun	get_new_grub_cfg() {
45*4882a593Smuzhiyun		grubcfg="$1"
46*4882a593Smuzhiyun		old_image="$2"
47*4882a593Smuzhiyun		title="Update KERNEL_IMAGETYPE-${KERNEL_VERSION}-${PV}"
48*4882a593Smuzhiyun		if [ "${grubcfg##*/}" = "grub.cfg" ]; then
49*4882a593Smuzhiyun			rootfs=`grep " *linux \+[^ ]\+ \+root=" $grubcfg -m 1 | \
50*4882a593Smuzhiyun				 sed "s#${old_image}#${old_image%/*}/KERNEL_IMAGETYPE-${KERNEL_VERSION}#"`
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun			echo "menuentry \"$title\" {"
53*4882a593Smuzhiyun			echo "    set root=(hd0,1)"
54*4882a593Smuzhiyun			echo "$rootfs"
55*4882a593Smuzhiyun			echo "}"
56*4882a593Smuzhiyun		elif [ "${grubcfg##*/}" = "menu.list" ]; then
57*4882a593Smuzhiyun			rootfs=`grep "kernel \+[^ ]\+ \+root=" $grubcfg -m 1 | \
58*4882a593Smuzhiyun				 sed "s#${old_image}#${old_image%/*}/KERNEL_IMAGETYPE-${KERNEL_VERSION}#"`
59*4882a593Smuzhiyun
60*4882a593Smuzhiyun			echo "default 0"
61*4882a593Smuzhiyun			echo "timeout 30"
62*4882a593Smuzhiyun			echo "title $title"
63*4882a593Smuzhiyun			echo "root  (hd0,0)"
64*4882a593Smuzhiyun			echo "$rootfs"
65*4882a593Smuzhiyun		fi
66*4882a593Smuzhiyun	}
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun	get_old_grub_cfg() {
69*4882a593Smuzhiyun		grubcfg="$1"
70*4882a593Smuzhiyun		if [ "${grubcfg##*/}" = "grub.cfg" ]; then
71*4882a593Smuzhiyun			cat "$grubcfg"
72*4882a593Smuzhiyun		elif [ "${grubcfg##*/}" = "menu.list" ]; then
73*4882a593Smuzhiyun			sed -e '/^default/d' -e '/^timeout/d' "$grubcfg"
74*4882a593Smuzhiyun		fi
75*4882a593Smuzhiyun	}
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun	if [ -f "$D/boot/grub/grub.cfg" ]; then
78*4882a593Smuzhiyun		grubcfg="$D/boot/grub/grub.cfg"
79*4882a593Smuzhiyun		old_image=`grep ' *linux \+[^ ]\+ \+root=' -m 1 "$grubcfg" | awk '{print $2}'`
80*4882a593Smuzhiyun	elif [ -f "$D/boot/grub/menu.list" ]; then
81*4882a593Smuzhiyun		grubcfg="$D/boot/grub/menu.list"
82*4882a593Smuzhiyun		old_image=`grep '^kernel \+[^ ]\+ \+root=' -m 1 "$grubcfg" | awk '{print $2}'`
83*4882a593Smuzhiyun	fi
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun	# Don't update grubcfg at first install while old bzImage doesn't exist.
86*4882a593Smuzhiyun	if [ -f "$D/boot/${old_image##*/}" ]; then
87*4882a593Smuzhiyun		grubcfgtmp="$grubcfg.tmp"
88*4882a593Smuzhiyun		get_new_grub_cfg "$grubcfg" "$old_image"  > $grubcfgtmp
89*4882a593Smuzhiyun		get_old_grub_cfg "$grubcfg" >> $grubcfgtmp
90*4882a593Smuzhiyun		mv $grubcfgtmp $grubcfg
91*4882a593Smuzhiyun		echo "Caution! Update kernel may affect kernel-module!"
92*4882a593Smuzhiyun	fi
93*4882a593Smuzhiyun'''
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun    imagetypes = d.getVar('KERNEL_IMAGETYPES')
96*4882a593Smuzhiyun    imagetypes = re.sub(r'\.gz$', '', imagetypes)
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun    for type in imagetypes.split():
99*4882a593Smuzhiyun        typelower = type.lower()
100*4882a593Smuzhiyun        preinst_append = preinst.replace('KERNEL_IMAGETYPE', type)
101*4882a593Smuzhiyun        postinst_prepend = postinst.replace('KERNEL_IMAGETYPE', type)
102*4882a593Smuzhiyun        d.setVar('pkg_preinst:kernel-image-' + typelower + ':append', preinst_append)
103*4882a593Smuzhiyun        d.setVar('pkg_postinst:kernel-image-' + typelower + ':prepend', postinst_prepend)
104*4882a593Smuzhiyun}
105*4882a593Smuzhiyun
106