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