On 09/18/2013 12:26 AM, Hongxu Jia wrote:
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.

Will this work for deb or ipk?

Sau!

- 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 modify grub's config file to
   updates the new kernel as the boot priority.

[YOCTO #4104]

Signed-off-by: Hongxu Jia <hongxu....@windriver.com>
---
  meta/classes/kernel-grub.bbclass | 79 ++++++++++++++++++++++++++++++++++++++++
  1 file changed, 79 insertions(+)
  create mode 100644 meta/classes/kernel-grub.bbclass

diff --git a/meta/classes/kernel-grub.bbclass b/meta/classes/kernel-grub.bbclass
new file mode 100644
index 0000000..21fcabe
--- /dev/null
+++ b/meta/classes/kernel-grub.bbclass
@@ -0,0 +1,79 @@
+#
+# 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 modify grub's config file to
+#   updates the new kernel as the boot priority.
+#
+
+pkg_preinst_kernel-image_append () {
+       if [ -z "$D" ]; then
+               # Parsing confliction
+               [ -f /boot/grub/menu.list ] && grubcfg="/boot/grub/menu.list"
+               [ -f /boot/grub/grub.cfg ] && grubcfg="/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
+                               kimage=`realpath /boot/${KERNEL_IMAGETYPE}`;
+                               sed -i "s#${KERNEL_IMAGETYPE} root=#${kimage##*/} 
root=#" $grubcfg
+                       fi
+
+                       # Rename old kernel if it conflicts with new kernel 
name.
+                       if grep -q "/${KERNEL_IMAGETYPE}-${KERNEL_VERSION} 
root=" $grubcfg; then
+                               timestamp=`date +%s`
+                               
kimage="/boot/${KERNEL_IMAGETYPE}-${KERNEL_VERSION}-$timestamp-back"
+                               sed -i "s#${KERNEL_IMAGETYPE}-${KERNEL_VERSION} 
root=#${kimage##*/} root=#" $grubcfg
+                               mv /boot/${KERNEL_IMAGETYPE}-${KERNEL_VERSION} 
$kimage
+                       fi
+               fi
+       fi
+}
+
+pkg_postinst_kernel-image_prepend () {
+       get_new_grub_cfg() {
+               title="Update ${KERNEL_IMAGETYPE}-${KERNEL_VERSION}-${PV}"
+               if [ -f /boot/grub/grub.cfg ]; then
+                       rootfs=`grep " *linux [^ ].* root=" /boot/grub/grub.cfg 
-m 1 | \
+                                sed "s# *linux [^ ].* root=#    linux 
/${KERNEL_IMAGETYPE}-${KERNEL_VERSION} root=#"`
+
+                       echo "menuentry \"$title\" {"
+                       echo "    set root=(hd0,1)"
+                       echo "$rootfs"
+                       echo "}"
+               elif [ -f /boot/grub/menu.list ] ; then
+                       rootfs=`grep "kernel [^ ].* root=" /boot/grub/menu.list 
-m 1 | \
+                                sed "s#kernel [^ ].* root=#kernel 
/${KERNEL_IMAGETYPE}-${KERNEL_VERSION} root=#"`
+
+                       echo "default 0"
+                       echo "timeout 30"
+                       echo "title $title"
+                       echo "root  (hd0,0)"
+                       echo "$rootfs"
+               fi
+       }
+
+       get_old_grub_cfg() {
+               if [ -f /boot/grub/grub.cfg ]; then
+                       cat /boot/grub/grub.cfg
+               elif [ -f /boot/grub/menu.list ] ; then
+                       cat /boot/grub/menu.list | sed -e '/^default/d' -e 
'/^timeout/d'
+               fi
+       }
+
+       if [ -z "$D" ]; then
+               [ -f /boot/grub/menu.list ] && grubcfg="/boot/grub/menu.list"
+               [ -f /boot/grub/grub.cfg ] && grubcfg="/boot/grub/grub.cfg"
+               if [ -n "$grubcfg" ]; then
+                       grubcfgtmp="$grubcfg.tmp"
+                       get_new_grub_cfg  > $grubcfgtmp
+                       get_old_grub_cfg >> $grubcfgtmp
+                       mv $grubcfgtmp $grubcfg
+                       echo "Caution! Update kernel may affect kernel-module!"
+               fi
+       fi
+}
+

_______________________________________________
Openembedded-core mailing list
Openembedded-core@lists.openembedded.org
http://lists.openembedded.org/mailman/listinfo/openembedded-core

Reply via email to