* [PATCH V3 0/1] kernel-grub.bbclass: add a method to install/update for bzImage
@ 2013-10-18 2:45 Hongxu Jia
2013-10-18 2:45 ` [PATCH 1/1] " Hongxu Jia
0 siblings, 1 reply; 2+ messages in thread
From: Hongxu Jia @ 2013-10-18 2:45 UTC (permalink / raw)
To: openembedded-core; +Cc: saul.wold
Change in V3:
- Don't check for '$D' to be empty to support cross-install/cross-upgrade
situation;
- Use $grubcfg instead of hardcoded '/boot/grub/*';
Change in V2: Create a "kernel-grub.bbclass" to do the job which means
it is disabled by default.
Test Case:
1. Add INHERIT_append = " kernel-grub" to local.conf and build a new kernel
image rpm package.
2. Prepare a deployed target, and make sure your boot area has enough disk
space (free space >= 5MB).
3. Download the new kernel image rpm to the target.
4. Before install/update, check boot area and menu
root@qemux86-64:~# ls /boot/
grub vmlinuz
root@qemux86-64:~# cat /boot/grub/grub.cfg
menuentry "Linux" {
set root=(hd0,1)
linux /vmlinuz root=/dev/hdb2 rw console=tty0 quiet
}
4. Install/update bzImage
root@qemux86-64:~# rpm -i kernel-image-3.10.11-yocto-standard-3.10.12+git0+285f93bf94_702040ac7c-r0.qemux86_64.rpm
Caution! Update kernel may affect kernel-module!
update-alternatives: Linking //boot/bzImage to bzImage-3.10.11-yocto-standard
5. After install/update, check boot area and menu
root@qemux86-64:~# ls /boot/ -al
drwxr-xr-x 4 root root 1024 Sep 18 06:58 .
drwxr-xr-x 17 root root 4096 Sep 18 06:41 ..
lrwxrwxrwx 1 root root 30 Sep 18 06:58 bzImage -> bzImage-3.10.11-yocto-standard
-rw-r--r-- 1 root root 5601808 Sep 18 06:45 bzImage-3.10.11-yocto-standard
drwxr-xr-x 4 root root 1024 Sep 18 06:58 grub
-rwxr-x--- 1 root root 5601776 Sep 18 06:38 vmlinuz
root@qemux86-64:~# cat /boot/grub/grub.cfg
menuentry "Update bzImage-3.10.11-yocto-standard-3.10.12+gitAUTOINC+285f93bf94_702040ac7c" {
set root=(hd0,1)
linux /bzImage-3.10.11-yocto-standard root=/dev/hdb2 rw console=tty0 quiet
}
menuentry "Linux" {
set root=(hd0,1)
linux /vmlinuz root=/dev/hdb2 rw console=tty0 quiet
}
6. Reboot target, 'Update bzImage-3.10.11-yocto-standard-3.10.12+gitAUTOINC+285f93bf94_702040ac7c'
will be in the boot menu.
7. It supports GRUB 0.97 in which use menu.lst rather than grub.cfg as config
file.
8. If you install the same rpm more than one time with '--force', there will
be multiple kernel images in boot area and menu.
9. It works for dep and ipk.
//Hongxu
The following changes since commit 529bf977e956175bd8405ebffc88194192e44740:
update-rcd.bbclass: fix host/target test (2013-10-16 14:51:07 +0100)
are available in the git repository at:
git://git.pokylinux.org/poky-contrib hongxu/update-bzimage
http://git.pokylinux.org/cgit.cgi/poky-contrib/log/?h=hongxu/update-bzimage
Hongxu Jia (1):
kernel-grub.bbclass: add a method to install/update for bzImage
meta/classes/kernel-grub.bbclass | 90 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 90 insertions(+)
create mode 100644 meta/classes/kernel-grub.bbclass
--
1.8.1.2
^ permalink raw reply [flat|nested] 2+ messages in thread
* [PATCH 1/1] kernel-grub.bbclass: add a method to install/update for bzImage
2013-10-18 2:45 [PATCH V3 0/1] kernel-grub.bbclass: add a method to install/update for bzImage Hongxu Jia
@ 2013-10-18 2:45 ` Hongxu Jia
0 siblings, 0 replies; 2+ messages in thread
From: Hongxu Jia @ 2013-10-18 2:45 UTC (permalink / raw)
To: openembedded-core; +Cc: saul.wold
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.
[YOCTO #4104]
Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
---
meta/classes/kernel-grub.bbclass | 90 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 90 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..70564f0
--- /dev/null
+++ b/meta/classes/kernel-grub.bbclass
@@ -0,0 +1,90 @@
+#
+# 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.
+#
+
+pkg_preinst_kernel-image_append () {
+ # 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
+}
+
+pkg_postinst_kernel-image_prepend () {
+ get_new_grub_cfg() {
+ grubcfg="$1"
+ title="Update ${KERNEL_IMAGETYPE}-${KERNEL_VERSION}-${PV}"
+ if [ "${grubcfg##*/}" = "grub.cfg" ]; then
+ rootfs=`grep " *linux \+[^ ]\+ \+root=" $grubcfg -m 1 | \
+ sed "s# *linux \+[^ ]\+ \+root=# linux /${KERNEL_IMAGETYPE}-${KERNEL_VERSION} root=#"`
+
+ 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#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() {
+ grubcfg="$1"
+ if [ "${grubcfg##*/}" = "grub.cfg" ]; then
+ cat "$grubcfg"
+ elif [ "${grubcfg##*/}" = "menu.list" ]; then
+ cat "$grubcfg" | sed -e '/^default/d' -e '/^timeout/d'
+ 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" > $grubcfgtmp
+ get_old_grub_cfg "$grubcfg" >> $grubcfgtmp
+ mv $grubcfgtmp $grubcfg
+ echo "Caution! Update kernel may affect kernel-module!"
+ fi
+}
+
--
1.8.1.2
^ permalink raw reply related [flat|nested] 2+ messages in thread
end of thread, other threads:[~2013-10-18 2:45 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-10-18 2:45 [PATCH V3 0/1] kernel-grub.bbclass: add a method to install/update for bzImage Hongxu Jia
2013-10-18 2:45 ` [PATCH 1/1] " Hongxu Jia
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox