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

Bug#549681: bug#549681: mkvmlinuz: use xz to compress vmlinuz-boxed initrd



On 07/01/2012 12:31 PM, Ben Hutchings wrote:
> On Sat, 2012-06-30 at 23:01 -0400, Milan Kupcevic wrote:
> [...]
>> --- mkvmlinuz   (revision 19233)
>> +++ mkvmlinuz   (working copy)
> [...]
>> @@ -158,6 +153,12 @@
>>    post_2_6_19=
>>  fi
>>  
>> +if dpkg --compare-versions $release ge 2.6.38 && test "$arch" != "prep" ; then
>> +  post_2_6_38=Yes
>> +else
>> +  post_2_6_38=
>> +fi
>> +
> [...]
> 
> We should actually check for CONFIG_RD_XZ=y in /boot/config-$release, to
> allow for custom kernels that don't enable it.  And of course the
> variable name should be something like is_xz_supported.
> 
> Ben.
> 

Updated patch is attached.

Milan
Index: mkvmlinuz
===================================================================
--- mkvmlinuz	(revision 19233)
+++ mkvmlinuz	(working copy)
@@ -133,13 +133,10 @@
 # if no release was specified, extract it from the kernel image name
 if test -z "$release"; then
     release=$(echo $kernel | sed s/.*vmlinux-//)
-    if echo $release | grep -q '2\.[46]\.[0-9]*'; then
-	:
-    else
-	release=""
-    fi
 fi
 
+test -z "$verbose" || echo === Release version seems to be $release.
+
 if dpkg --compare-versions $release ge 2.6.16 && test "$arch" != "prep" ; then
   post_2_6_16=Yes
 else
@@ -158,7 +155,9 @@
   post_2_6_19=
 fi
 
-test -z "$verbose" || echo === Release version seems to be $release.
+if grep -q CONFIG_RD_XZ=y /boot/config-$release ; then
+  is_xz_supported=Yes
+fi
 
 # if no object file directory was specified, try to find one
 if test -z "$objdir"; then
@@ -206,6 +205,11 @@
 test -z "$verbose" || echo === Doing build in $work.
 
 # utilities
+if test "$is_xz_supported"; then
+  XZ="xz --check=crc32 -8"
+else
+  XZ=false
+fi
 if test "$post_2_6_16"; then
   ADDNOTE=$objdir/addnote # must be present in mkvmlinuz fallback tools
   if test \! -f "$ADDNOTE"; then
@@ -291,22 +295,35 @@
 
 # create the compressed initrd image file
 if test -n "$initrd"; then
-    test -z "$verbose" || echo === Creating compressed initrd image initrd.gz...
+    test -z "$verbose" || echo === Creating compressed initrd image
     if test -z "$compressed"; then
-        # Detect if the file was already compressed by gzip.
-    	if test "`od -A n -c -N 2 $initrd`" = " 037 213"; then 
-	    compressed="Yes"
+	if test "`xxd -p -l2 $initrd`" = "1f8b"; then
+	    test -z "$verbose" || echo === $initrd is already gzip compressed
+	    do_cmd cp -p $initrd $work/initrd.gz
+	    if test -n "$is_xz_supported" && test "$arch" != "prep"; then
+	      test -z "$verbose" || echo === recompressing to xz
+	      zcat $initrd | $XZ - > $work/initrd.xz
+	    fi
+	elif test "`xxd -p -l6 $initrd`" = "fd377a585a00"; then 
+	    test -z "$verbose" || echo === $initrd is already xz compressed
+	    do_cmd cp -p $initrd $work/initrd.xz
 	else
+	    test -z "$verbose" || echo === assuming $initrd was not compressed
 	    compressed="No"
 	fi
     fi
     case "$compressed" in
     	Yes)
 	    do_cmd cp -p $initrd $work/initrd.gz
+	    do_cmd ln -s $work/initrd.gz $work/initrd.xz
 	    ;;
     	No)
 	    do_cmd cp -p $initrd $work/initrd
-	    do_cmd $GZIP $work/initrd
+	    if test -n "$is_xz_supported" && test "$arch" != "prep"; then
+	      do_cmd $XZ $work/initrd
+	    else
+	      do_cmd $GZIP $work/initrd
+	    fi
 	    ;;
     esac
 fi
@@ -317,7 +334,11 @@
   WRAPPER=$objdir/wrapper
   vmlinuz=$work/vmlinuz.$arch
   if test -n "$initrd"; then
-    INITRD="-i $work/initrd.gz"
+    if test "$is_xz_supported"; then
+      INITRD="-i $work/initrd.xz"
+    else
+      INITRD="-i $work/initrd.gz"
+    fi
   fi
   $WRAPPER -c -o $vmlinuz -p $arch $INITRD -D $objdir -W $work $kernel
 else 

Attachment: signature.asc
Description: OpenPGP digital signature


Reply to: