From 94dc288487f2cb5c993ed471ed490a0031a65acc Mon Sep 17 00:00:00 2001 From: "Robin H. Johnson" Date: Mon, 6 Feb 2012 08:33:10 +0000 Subject: [PATCH] Customizable initramfs compression based on Pentoo genkernel fork This implements customizable initramfs compression, based on the Pentoo genkernel fork (SVN revs r2142, r2145, by Jens Pranaitis ). New configuration option COMPRESS_INITRD_TYPE to allow manual selection, whereas the Pentoo fork provided auto-selection based on what was available in the kernel configuration. Auto-selection is used by default, and is available with the argument of 'best' to the new option. Signed-off-by: Robin H. Johnson --- ChangeLog | 4 +++ defaults/config.sh | 3 ++- gen_cmdline.sh | 6 ++++- gen_determineargs.sh | 1 + gen_initramfs.sh | 62 ++++++++++++++++++++++++++++++++++---------- genkernel.conf | 3 +++ 6 files changed, 63 insertions(+), 16 deletions(-) diff --git a/ChangeLog b/ChangeLog index d6e4dcf..e2cc9ab 100644 --- a/ChangeLog +++ b/ChangeLog @@ -5,6 +5,10 @@ # Distributed under the GPL v2 # $Id$ + 06 Feb 2012; Robin H. Johnson defaults/config.sh, + gen_cmdline.sh, gen_determineargs.sh, gen_initramfs.sh, genkernel.conf: + Import customizable compression for initramfs, based on Pentoo development. + 06 Feb 2012: Richard Yao arch/alpha/modules_load, arch/arm/modules_load, arch/ia64/modules_load, arch/mips/modules_load, arch/parisc/modules_load, arch/parisc64/modules_load, arch/ppc/modules_load, diff --git a/defaults/config.sh b/defaults/config.sh index d135e0e..7ee9ef2 100755 --- a/defaults/config.sh +++ b/defaults/config.sh @@ -12,7 +12,8 @@ KERNEL_MAKE_DIRECTIVE_2="" KERNEL_BINARY="arch/i386/boot/bzImage" KERNEL_BINARY_OVERRIDE="" -COMPRESS_INITRD=yes +DEFAULT_COMPRESS_INITRD=yes +DEFAULT_COMPRESS_INITRD_TYPE=best # # Arch-specific defaults that can be overridden in the config file or on the diff --git a/gen_cmdline.sh b/gen_cmdline.sh index de56a25..aabaa7e 100755 --- a/gen_cmdline.sh +++ b/gen_cmdline.sh @@ -537,10 +537,14 @@ parse_cmdline() { CMD_INTEGRATED_INITRAMFS=`parse_optbool "$*"` print_info 2 "CMD_INTEGRATED_INITRAMFS=${CMD_INTEGRATED_INITRAMFS}" ;; - --compress-initramfs|--no-compress-initramfs) + --compress-initramfs|--no-compress-initramfs|--compress-initrd|--no-compress-initrd) CMD_COMPRESS_INITRD=`parse_optbool "$*"` print_info 2 "CMD_COMPRESS_INITRD=${CMD_COMPRESS_INITRD}" ;; + --compress-initramfs-type=*|--compress-initrd-type=*) + COMPRESS_INITRD_TYPE=`parse_opt "$*"` + print_info 2 "CMD_COMPRESS_INITRD_TYPE: ${CMD_LINUXRC}" + ;; --config=*) print_info 2 "CMD_GK_CONFIG: `parse_opt "$*"`" ;; diff --git a/gen_determineargs.sh b/gen_determineargs.sh index e6ed0a3..4a21530 100755 --- a/gen_determineargs.sh +++ b/gen_determineargs.sh @@ -76,6 +76,7 @@ determine_real_args() { set_config_with_override STRING KNAME CMD_KERNNAME "genkernel" set_config_with_override STRING COMPRESS_INITRD CMD_COMPRESS_INITRD "$DEFAULT_COMPRESS_INITRD" + set_config_with_override STRING COMPRESS_INITRD_TYPE CMD_COMPRESS_INITRD_TYPE "$DEFAULT_COMPRESS_INITRD_TYPE" set_config_with_override STRING MAKEOPTS CMD_MAKEOPTS "$DEFAULT_MAKEOPTS" set_config_with_override STRING KERNEL_MAKE CMD_KERNEL_MAKE "$DEFAULT_KERNEL_MAKE" set_config_with_override STRING UTILS_MAKE CMD_UTILS_MAKE "$DEFAULT_UTILS_MAKE" diff --git a/gen_initramfs.sh b/gen_initramfs.sh index 170361b..3aab15d 100755 --- a/gen_initramfs.sh +++ b/gen_initramfs.sh @@ -686,23 +686,57 @@ create_initramfs() { append_data 'overlay' fi - # Implement support for disabling compression - if isTrue "${COMPRESS_INITRD}" - then - compress_ext=".gz" - print_info 1 " >> Compressing cpio data..." - gzip -9 "${CPIO}" || gen_die "Compression failed" - mv -f "${CPIO}.gz" "${CPIO}" || gen_die "Rename failed" - fi - - if isTrue "${INTEGRATED_INITRAMFS}" then -# cp ${TMPDIR}/initramfs-${KV} ${KERNEL_DIR}/usr/initramfs_data.cpio.gz - mv ${TMPDIR}/initramfs-${KV} ${TMPDIR}/initramfs-${KV}.cpio${compress_ext} -# sed -i "s|^.*CONFIG_INITRAMFS_SOURCE=.*$|CONFIG_INITRAMFS_SOURCE=\"${TMPDIR}/initramfs-${KV}.cpio.gz\"|" ${KERNEL_DIR}/.config + # Explicitly do not compress if we are integrating into the kernel. + # The kernel will do a better job of it than us. + mv ${TMPDIR}/initramfs-${KV} ${TMPDIR}/initramfs-${KV}.cpio sed -i '/^.*CONFIG_INITRAMFS_SOURCE=.*$/d' ${KERNEL_DIR}/.config - echo -e "CONFIG_INITRAMFS_SOURCE=\"${TMPDIR}/initramfs-${KV}.cpio${compress_ext}\"\nCONFIG_INITRAMFS_ROOT_UID=0\nCONFIG_INITRAMFS_ROOT_GID=0" >> ${KERNEL_DIR}/.config + cat >>${KERNEL_DIR}/.config <<-EOF + CONFIG_INITRAMFS_SOURCE="${TMPDIR}/initramfs-${KV}.cpio${compress_ext}" + CONFIG_INITRAMFS_ROOT_UID=0 + CONFIG_INITRAMFS_ROOT_GID=0 + EOF + else + if isTrue "${COMPRESS_INITRD}" + then + cmd_xz=$(type -p xz) + cmd_lzma=$(type -p lzma) + cmd_bzip2=$(type -p bzip2) + cmd_gzip=$(type -p gzip) + cmd_lzop=$(type -p lzop) + local compression + case ${COMPRESS_INITRD_TYPE} in + xz|lzma|bzip2|gzip2|lzo) compression=${COMPRESS_INITRD_TYPE} ;; + best) + if grep -sq '^CONFIG_RD_XZ=y' ${KERNEL_DIR}/.config && test -n "${cmd_xz}" ; + compression=xz + elif grep -sq '^CONFIG_RD_LZMA=y' ${KERNEL_DIR}/.config && test -n "${cmd_lzma}" ; + compression=lzma + elif grep -sq '^CONFIG_RD_BZIP2=y' ${KERNEL_DIR}/.config && test -n "${cmd_bzip2}" ; + compression=bzip2 + elif grep -sq '^CONFIG_RD_GZIP=y' ${KERNEL_DIR}/.config && test -n "${cmd_gzip}" ; + compression=gzip + elif grep -sq '^CONFIG_RD_LZO=y' ${KERNEL_DIR}/.config && test -n "${cmd_lzop}" ; + compression=lzo + fi ;; + esac + case $compression in + xz) compress_ext='.xz' compress_cmd="${cmd_xz} -e --check=none -z -f -9" ;; + lzma) compress_ext='.lzma' compress_cmd="${cmd_lzma} -z -f -9" ;; + bzip2) compress_ext='.bz2' compress_cmd="${cmd_bzip2} -z -f -9" + gzip) compress_ext='.gz' compress_cmd="${cmd_gzip} -f -9" ;; + lzo) compress_ext='.lzo' compress_cmd="${cmd_lzop} -f -9" ;; + esac + + if [ -n "${compression}" ]; then + print_info 1 " >> Compressing cpio data (${compress_ext})..." + ${compress_cmd} "${CPIO}" || gen_die "Compression (${compress_cmd}) failed" + mv -f "${CPIO}${compress_ext}" "${CPIO}" || gen_die "Rename failed" + else + print_info 1 " >> Not compressing cpio data ..." + fi + fi fi if isTrue "${CMD_INSTALL}" diff --git a/genkernel.conf b/genkernel.conf index 7032ac7..22b18d7 100644 --- a/genkernel.conf +++ b/genkernel.conf @@ -319,6 +319,9 @@ GPG_BINCACHE="%%CACHE%%/gnupg-${GPG_VER}-%%ARCH%%.bz2" # Compress generated initramfs #COMPRESS_INITRD="yes" +# Types of compression: best, xz, lzma, bzip2, gzip, lzop +# "best" selects the best available compression method +#COMPRESS_INITRD_TYPE="best" # Create a self-contained env in the initramfs -- 2.26.2