Hi,

Following patch allow grub-mkrescue to compress modules. It also uses xorisso 
option to reduce image size as proposed in 
http://lists.gnu.org/archive/html/grub-devel/2010-05/msg00100.html

It supports both xz and gzip compression. Yet, xz is disabled in this version 
as it generates some issues: wrong symbols in fshelp module (I'm not sure if 
this is a bug in xzio or not).

Generated image size:
no diet         1966080 B
diet with gzip  1048576 B
diet with xz    983040 B

Should be usefull for floppies.

Comments are welcome (I'm not very good at shell scripting :)

-- 
Szymon K. Janc
szy...@janc.net.pl // GG: 1383435
=== modified file 'ChangeLog'
--- ChangeLog	2011-01-13 21:25:56 +0000
+++ ChangeLog	2011-01-13 23:10:14 +0000
@@ -1,3 +1,10 @@
+2011-01-14  Szymon Janc  <szy...@janc.net.pl>
+
+	Put grub-mkrescue generated image on diet (modules compression and
+	xorriso options).
+
+	* util/grub-mkrescue.in: New option --diet.
+
 2011-01-13  Vladimir Serbinenko  <phco...@gmail.com>
 
 	* grub-core/fs/zfs/zfsinfo.c (grub_cmd_zfs_bootfs): Quote bootpath and

=== modified file 'util/grub-mkrescue.in'
--- util/grub-mkrescue.in	2010-10-18 20:50:01 +0000
+++ util/grub-mkrescue.in	2011-01-13 23:23:36 +0000
@@ -44,6 +44,7 @@ override_dir=
 grub_mkimage=${bindir}/`echo grub-mkimage | sed ${transform}`
 
 xorriso=xorriso
+diet=no
 
 # Usage: usage
 # Print the usage.
@@ -59,6 +60,7 @@ Make GRUB rescue image.
   --rom-directory=DIR     save rom images in DIR [optional]
   --xorriso=FILE          use FILE as xorriso [optional]
   --grub-mkimage=FILE     use FILE as grub-mkimage
+  --diet                  apply size reducing measures [optional]
 
 $self generates a bootable rescue image with specified source files, source
 directories, or mkisofs options listed by: xorriso -as mkisofs -help
@@ -133,6 +135,9 @@ do
     --xorriso=*)
         xorriso=`echo "${option}/" | sed 's/--xorriso=//'` ;;
 
+     --diet)
+        diet=yes ;;
+
     *)
 	source="${source} ${option} $@"; break ;;
     esac
@@ -155,6 +160,41 @@ fi
 iso9660_dir=`mktemp -d "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` || exit 1
 mkdir -p ${iso9660_dir}/boot/grub
 
+decmod=""
+decmod_dep=""
+compressor=""
+if [ "${diet}" = yes ]; then
+  # Disabled for now.
+  #compressor=`which xz || true`
+  if [ "$compressor" = "" ] ; then
+    compressor=`which gzip || true`
+    if [ "$compressor" != "" ] ; then
+      decmod="gzio"
+      compressor="$compressor --best --stdout"
+    fi
+  else
+    decmod="xzio"
+    compressor="$compressor --lzma2=dict=128KiB --check=none --stdout"
+  fi
+fi
+
+find_decmod_dep()
+{
+  deps=`grep ^$1: /boot/grub/moddep.lst|sed s/"$1:"//`
+  if [ "$deps" = "" ] ; then
+        return ;
+  fi
+
+  decmod_dep="$decmod_dep $deps"
+
+  for i in $deps ;do find_decmod_dep $i ; done
+}
+
+if [ "$decmod" != "" ]; then
+  find_decmod_dep $decmod
+  decmod_dep=`echo $decmod_dep|tr " " "\n"|sort|uniq|tr "\n" " "`
+fi
+
 process_input_dir ()
 {
     input_dir="$1"
@@ -162,7 +202,14 @@ process_input_dir ()
     mkdir -p ${iso9660_dir}/boot/grub/${platform}
     for file in ${input_dir}/*.mod; do
         if test -f "$file"; then
+          modname=`basename $file .mod`
+          m=`echo $decmod $decmod_dep | tr " " "\n" | grep "^$modname$" || true`;
+
+          if [ "$compressor" != "" ] && [ "$m" = "" ]; then
+            `$compressor $file > ${iso9660_dir}/boot/grub/${platform}/$modname".mod"`
+          else
             cp -f "$file" ${iso9660_dir}/boot/grub/${platform}/
+          fi
         fi
     done
     for file in ${pkglib_DATA}; do
@@ -207,7 +254,7 @@ EOF
     (cd "${memdisk_dir}"; tar -cf - boot) > "${memdisk_img}"
     rm -rf ${memdisk_dir}
     $grub_mkimage -O ${platform} -d "${source_directory}" -m "${memdisk_img}" -o "$3" --prefix='(memdisk)/boot/grub' \
-        search iso9660 configfile normal memdisk tar $4
+        $decmod search iso9660 configfile normal memdisk tar $4
     rm -rf ${memdisk_img}
 }
 
@@ -257,7 +304,7 @@ if test -e "${pc_dir}" ; then
     echo "Enabling BIOS support ..."
     core_img=`mktemp "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` || exit 1
     $grub_mkimage -O i386-pc -d ${pc_dir}/ -o ${core_img} --prefix=/boot/grub/i386-pc \
-        iso9660 biosdisk
+       $decmod iso9660 biosdisk
     cat ${pc_dir}/cdboot.img ${core_img} > ${iso9660_dir}/boot/grub/i386-pc/eltorito.img
 
     embed_img=`mktemp "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` || exit 1
@@ -276,7 +323,7 @@ if test -e "${pc_dir}" ; then
 fi
 
 # build multiboot core.img
-make_image "${multiboot_dir}" i386-multiboot "${iso9660_dir}/boot/multiboot.img" "ata at_keyboard"
+make_image "${multiboot_dir}" i386-multiboot "${iso9660_dir}/boot/multiboot.img" "$decmod ata at_keyboard"
 
 if test -e "${efi64_dir}" || test -e "${efi32_dir}"; then
     efi_dir=`mktemp -d "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` || exit 1
@@ -293,17 +340,25 @@ if test -e "${efi64_dir}" || test -e "${
     grub_mkisofs_arguments="${grub_mkisofs_arguments} --efi-boot efi.img"
 fi
 
-make_image "${qemu_dir}" i386-qemu "${iso9660_dir}/boot/qemu.img" "ata at_keyboard"
+make_image "${qemu_dir}" i386-qemu "${iso9660_dir}/boot/qemu.img" "$decmod ata at_keyboard"
 if [ -e "${iso9660_dir}/boot/qemu.img" ] && [ -d "${rom_directory}" ]; then
     cp "${iso9660_dir}/boot/qemu.img" "${rom_directory}/qemu.img"
 fi
-make_image "${coreboot_dir}" i386-coreboot "${iso9660_dir}/boot/coreboot.elf" "ata at_keyboard"
+make_image "${coreboot_dir}" i386-coreboot "${iso9660_dir}/boot/coreboot.elf" "$decmod ata at_keyboard"
 if [ -e "${iso9660_dir}/boot/coreboot.elf" ] && [ -d "${rom_directory}" ]; then
     cp "${iso9660_dir}/boot/coreboot.elf" "${rom_directory}/coreboot.elf"
 fi
 
 # build iso image
-"${xorriso}" -as mkisofs -graft-points ${grub_mkisofs_arguments} --protective-msdos-label -o ${output_image} -r ${iso9660_dir} --sort-weight 0 / --sort-weight 1 /boot ${source}
+if [ "${diet}" = yes ]; then
+  if [ -e "${output_image}" ]; then
+      rm "${output_image}" || exit 1
+  fi
+  "${xorriso}" -as mkisofs -graft-points -no-pad ${grub_mkisofs_arguments} --protective-msdos-label -o ${output_image} -r ${iso9660_dir} --sort-weight 0 / --sort-weight 1 /boot ${source}
+else
+  "${xorriso}" -as mkisofs -graft-points ${grub_mkisofs_arguments} --protective-msdos-label -o ${output_image} -r ${iso9660_dir} --sort-weight 0 / --sort-weight 1 /boot ${source}
+fi
+
 rm -rf ${iso9660_dir}
 
 rm -f ${embed_img}

_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to