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: