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

Bug#533903: initramfs-tools: support different compression tools in mkinitramfs



Package: initramfs-tools
Version: 0.93.4
Severity: normal
Tags: patch

Dear initramfs-tools Maintainers,


since I've recently did some experiments regarding lzma compressed initramfs
images I stumbled upon this quite old bugreport.

As mentioned before the stock kernel has support for lzma/bzip2 compressed
images built in nowadays and it works great. Instead of having to recompress
the initramfs image by hand over and over again i did a patch against
initramfs-tools-0.93.4 which enables mkinitramfs to build gzip/bzip2/lzma
compressed images.


Therefor I've set a new variable in /etc/initramfs-tools/update-initramfs.conf

  #
  # compress_initramfs [ gzip | bzip2 | lzma ]
  #
  compress_initramfs=gzip


added the new function verify_compression() to the update-initramfs script which

  - checks the availability of the compression utility in userspace
  - matches the kernel's config file against the selected compression method
  - falls back to gzip compression if either or both are missing and prints
    verbose messages if that has happened.


The method gets passed to mkinitramfs via a new optional argument "-c <COMP>"
and mkinitramfs itself verifies that "lzma" or "bzip2" has been passed as argument,
or defaults to gzip. (as well if the -c argument has been omitted)
Given the fact that gzip, bzip2 and lzma read input from stdin and pass the
compressed output to stdout theres no need to change a lot of code here.


unified diff attached


best regards
Bert Schulze
diff -rup a/conf/update-initramfs.conf b/conf/update-initramfs.conf
--- a/conf/update-initramfs.conf	2009-03-19 21:16:14.000000000 +0100
+++ b/conf/update-initramfs.conf	2010-02-03 00:41:03.000000000 +0100
@@ -18,3 +18,10 @@ update_initramfs=yes
 # If set to no leaves no .bak backup files.
 
 backup_initramfs=yes
+
+#
+# compress_initramfs [ gzip | bzip2 | lzma ]
+#
+# Default is gzip
+
+compress_initramfs=gzip
diff -rup a/hook-functions b/hook-functions
--- a/hook-functions	2009-06-25 20:28:51.000000000 +0200
+++ b/hook-functions	2010-02-03 01:15:33.000000000 +0100
@@ -465,10 +465,11 @@ usage()
 Usage: ${0} [OPTION]... -o outfile [version]
 
 Options:
-  -d confdir  Specify an alternative configuration directory.
-  -k          Keep temporary directory used to make the image.
-  -o outfile  Write to outfile.
-  -r root     Override ROOT setting in initramfs.conf.
+  -c compress  Utility used to compress the initramfs image.
+  -d confdir   Specify an alternative configuration directory.
+  -k           Keep temporary directory used to make the image.
+  -o outfile   Write to outfile.
+  -r root      Override ROOT setting in initramfs.conf.
 
 See mkinitramfs(8) for further details.
 EOF
diff -rup a/mkinitramfs b/mkinitramfs
--- a/mkinitramfs	2009-05-18 13:58:41.000000000 +0200
+++ b/mkinitramfs	2010-02-03 01:31:40.000000000 +0100
@@ -11,7 +11,7 @@ errors_to="2>/dev/null"
 # BUSYBOXDIR="/usr/lib/initramfs-tools/bin/"
 BUSYBOXDIR="/bin"
 
-OPTIONS=`getopt -o d:ko:r:v -n "$0" -- "$@"`
+OPTIONS=`getopt -o d:ko:r:c:v -n "$0" -- "$@"`
 
 # Check for non-GNU getopt
 if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
@@ -40,6 +40,10 @@ while true; do
 		ROOT="$2"
 		shift 2
 		;;
+  -c)
+    compress="$2"
+    shift 2
+    ;;
 	-v)
 		verbose="y"
 		shift
@@ -86,6 +90,10 @@ if [ -n "${UMASK}" ]; then
 	umask "${UMASK}"
 fi
 
+if [ "bzip2" != "${compress}" ] && [ "lzma" != "${compress}" ]; then
+	compress=gzip
+fi
+
 if [ -z "${outfile}" ]; then
 	usage
 fi
@@ -284,7 +292,7 @@ eval `
         find . 4>&-; echo "ec1=$?;" >&4
     } | {
         cpio --quiet --dereference -o -H newc 4>&-; echo "ec2=$?;" >&4
-    } | gzip >"${outfile}"
+    } | ${compress} >"${outfile}"
     echo "ec3=$?;" >&4
 `
 if [ "$ec1" -ne 0 ]; then exit "$ec1"; fi
diff -rup a/mkinitramfs.8 b/mkinitramfs.8
--- a/mkinitramfs.8	2009-03-19 21:16:14.000000000 +0100
+++ b/mkinitramfs.8	2010-02-03 00:41:03.000000000 +0100
@@ -5,6 +5,8 @@ mkinitramfs \- low-level tool for genera
 
 .SH SYNOPSIS
 .B mkinitramfs
+.RB [ \-c
+.IR compress ]
 .RB [ \-d
 .IR confdir ]
 .RB [ \-k ]
@@ -27,7 +29,7 @@ mkinitramfs \- low-level tool for genera
 The
 .B mkinitramfs
 script generates an initramfs image.
-The initramfs is a gzipped cpio archive. The archive can be used on a
+The initramfs is a compressed cpio archive. The archive can be used on a
 different box of the same arch with the corresponding Linux kernel.
 .B mkinitramfs
 is meant for advanced usage. On your local box
@@ -45,6 +47,10 @@ happens in this early userspace.
 
 .SH OPTIONS
 .TP
+\fB \-c \fI compress
+Use either gzip, bzip2 or lzma to compress the initramfs image
+(defaults to gzip).
+.TP
 \fB \-d \fI confdir
 Set an alternate configuration directory.
 
diff -rup a/update-initramfs b/update-initramfs
--- a/update-initramfs	2009-06-10 15:58:58.000000000 +0200
+++ b/update-initramfs	2010-02-03 01:33:34.000000000 +0100
@@ -88,6 +88,23 @@ version_exists()
 	return $?
 }
 
+# fallback to gzip if userspace/kernelsupport is missing
+verify_compression()
+{
+	COMP=${compress_initramfs}
+	[ -z "${COMP}" ] && COMP=gzip
+
+	if [ ! `which ${COMP}` ] ;then
+		verbose "Missing ${compress_initramfs}, userspace using gzip instead"
+		COMP=gzip
+
+  elif ! grep -q -i config_rd_`echo ${compress_initramfs}`=y \
+		${BOOTDIR}/config-${version} ;then
+		verbose "Kernel doesn't support ${compress_initramfs} using gzip instead"
+		COMP=gzip
+	fi
+}
+
 set_initramfs()
 {
 	initramfs="${BOOTDIR}/initrd.img-${version}"
@@ -152,7 +169,7 @@ remove_initramfs()
 generate_initramfs()
 {
 	echo "update-initramfs: Generating ${initramfs}"
-	OPTS="-o"
+	OPTS="-c ${COMP} -o"
 	if [ "${verbose}" = 1 ]; then
 		OPTS="-v ${OPTS}"
 	fi
@@ -367,6 +384,8 @@ create()
 		usage "Create mode requires a version argument"
 	fi
 
+	verify_compression
+
 	set_initramfs
 
 	if [ "${takeover}" = 0 ]; then
@@ -405,6 +424,8 @@ update()
 		verbose "Nothing to do, exiting."
 		exit 0
 	fi
+  
+	verify_compression
 
 	set_initramfs
 
diff -rup a/update-initramfs.conf.5 b/update-initramfs.conf.5
--- a/update-initramfs.conf.5	2009-03-19 21:16:14.000000000 +0100
+++ b/update-initramfs.conf.5	2010-02-03 00:41:03.000000000 +0100
@@ -19,6 +19,9 @@ the \fBupdate_initramfs \-u\fP call.
 .TP
 \fB backup_initramfs
 By default \fBupdate_initramfs\fP keeps an .bak file of the previous initramfs. If set to \fIno\fP the backup initramfs will not be kept.
+.TP
+\fB compress_initramfs
+Specify the method used to compress the initramfs image. If set to lzma or bzip2 the corresponding userspace utility needs to be installed and the kernel must be built with support for it. Otherwise \fBupdate-initramfs\fP will fallback to gzip.
 
 .SH AUTHOR
 The initramfs-tools are written by Maximilian Attems <maks@debian.org>,

Reply to: