[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#447611: update-initramfs triggerisation



Source: initramfs-tools
Version: 0.91b
Severity: wishlist
Tags: patch

The attached patch triggerises the invocation of mkinitramfs by
package maintainer scripts via update-initramfs.

By `triggerises' I mean that the patch arranges for the formulaic
update-initramfs invocations by maintainer scripts (eg of udev, kernel
packages, etc.) to call dpkg-trigger instead of actually doing the
work of update-initramfs and mkinitramfs.  update-initramfs and hence
mkinitramfs will be actually run out of initramfs-tools's postinst
script during trigger processing.  The consequence is that all of the
initramfs updates during a dpkg run are deferred, and instead the
update is done once at the end.

This is achieved by new code in update-initramfs.  This detects the
formulaic invocation by a maintscript, and exec's dpkg-trigger instead
(if the conditions are favourable).  An alternative approach would be
to change all of the packages not to call update-initramfs but instead
to call a new script but this would involve a much more complicated
and lengthy transition for no significant benefit.

The patch is safe to use with a non-triggers-supporting dpkg and in
all transitional states: where the trigger system is not properly set
up yet, update-initramfs does its work as normal.  Note that sid's
dpkg does not yet have the triggers patch merged but there has been
extensive discussion of the design and interfaces for triggers and the
API should IMO be considered stable.

These changes have been tested and released as part of Ubuntu 7.10 aka
`gutsy gibbon'.  The patch below is the consilidation of the results
of our testing.

So we believe that this patch can and should be safely applied to
sid's initramfs-tools straight away.

Ian.

diff -ruN ../orig/initramfs-tools-0.85eubuntu16/debian/changelog initramfs-tools-0.85eubuntu18/debian/changelog
--- ../orig/initramfs-tools-0.85eubuntu16/debian/changelog	2007-07-31 06:31:15.000000000 +0100
+++ initramfs-tools-0.85eubuntu18/debian/changelog	2007-08-24 15:45:43.000000000 +0100
@@ -1,3 +1,19 @@
+initramfs-tools (0.85eubuntu18) gutsy; urgency=low
+
+  * Use dpkg-trigger even in our own postinst, unless we're doing
+    trigger processing or the running dpkg version doesn't support
+    reflexive triggers.  This reduces update-initramfs runs from two per
+    upgrade batch to one per batch.
+
+ -- Ian Jackson <iwj@ubuntu.com>  Fri, 24 Aug 2007 15:45:38 +0100
+
+initramfs-tools (0.85eubuntu17) gutsy; urgency=low
+
+  * Use dpkg-trigger (if available and operational) to save on
+    calls to update-initramfs.
+
+ -- Ian Jackson <iwj@ubuntu.com>  Thu, 16 Aug 2007 16:03:52 +0100
+
 initramfs-tools (0.85eubuntu16) gutsy; urgency=low
 
   * Load thermal modules on lpia as well.  This may need to change in
diff -ruN ../orig/initramfs-tools-0.85eubuntu16/debian/initramfs-tools.postinst initramfs-tools-0.85eubuntu18/debian/initramfs-tools.postinst
--- ../orig/initramfs-tools-0.85eubuntu16/debian/initramfs-tools.postinst	2006-12-21 23:32:07.000000000 +0000
+++ initramfs-tools-0.85eubuntu18/debian/initramfs-tools.postinst	2007-08-24 15:45:02.000000000 +0100
@@ -25,9 +25,16 @@
 		
 		
 
-# Regenerate initramfs on upgrade
-if [ "$1" = "configure" ] && [ -n "$2" ]; then
+# Regenerate initramfs whenever we go to dpkg state `installed'
+
+if [ "x$1" != xtriggered ] && \
+   dpkg --compare-versions "$DPKG_RUNNING_VERSION" ge '1.14.5ubuntu10~~'
+then
 	update-initramfs -u
+	# ... this activates the trigger, if triggers are working
+else
+	DPKG_MAINTSCRIPT_PACKAGE='' update-initramfs -u
+	# ... force it to actually happen
 fi
 
 #DEBHELPER#
diff -ruN ../orig/initramfs-tools-0.85eubuntu16/debian/initramfs-tools.triggers initramfs-tools-0.85eubuntu18/debian/initramfs-tools.triggers
--- ../orig/initramfs-tools-0.85eubuntu16/debian/initramfs-tools.triggers	1970-01-01 01:00:00.000000000 +0100
+++ initramfs-tools-0.85eubuntu18/debian/initramfs-tools.triggers	2007-08-16 16:03:05.000000000 +0100
@@ -0,0 +1 @@
+interest update-initramfs
diff -ruN ../orig/initramfs-tools-0.85eubuntu16/debian/rules initramfs-tools-0.85eubuntu18/debian/rules
--- ../orig/initramfs-tools-0.85eubuntu16/debian/rules	2006-12-21 23:32:07.000000000 +0000
+++ initramfs-tools-0.85eubuntu18/debian/rules	2007-08-16 16:10:49.000000000 +0100
@@ -8,3 +8,7 @@
 	for x in `find scripts/ -maxdepth 1 -type d | tail -n+2`; do \
 	  chmod -R +x $$x; \
 	done
+
+binary-install/initramfs-tools::
+	install -m 644 -o 0 -g 0 debian/initramfs-tools.triggers \
+		debian/initramfs-tools/DEBIAN/triggers
diff -ruN ../orig/initramfs-tools-0.85eubuntu16/update-initramfs initramfs-tools-0.85eubuntu18/update-initramfs
--- ../orig/initramfs-tools-0.85eubuntu16/update-initramfs	2007-04-10 16:07:41.000000000 +0100
+++ initramfs-tools-0.85eubuntu18/update-initramfs	2007-08-16 16:56:23.000000000 +0100
@@ -4,11 +4,24 @@
 BOOTDIR=/boot
 CONF=/etc/initramfs-tools/update-initramfs.conf
 KPKGCONF=/etc/kernel-img.conf
+USETRIGGERS=true
 
 set -e
 
 [ -r ${CONF} ] && . ${CONF}
 
+if	   $USETRIGGERS						\
+	&& test x"$DPKG_MAINTSCRIPT_PACKAGE" != x		\
+	&& test $# = 1						\
+	&& test x"$1" = x-u					\
+	&& dpkg-trigger --check-supported 2>/dev/null
+then
+	if dpkg-trigger --no-await update-initramfs; then
+		echo "update-initramfs: deferring update (trigger activated)"
+		exit 0
+	fi	
+fi
+
 usage()
 {
 	if [ -n "${1}" ]; then

Reply to: