[OE-core] [PATCH 1/2] kernel-initramfs.bbclass: Separate initramfs setup

Andrea Adami andrea.adami at gmail.com
Wed Nov 7 13:21:38 UTC 2018


On Wed, Nov 7, 2018 at 1:16 PM Nathan Rossi <nathan at nathanrossi.com> wrote:
>
> This change moves the initramfs bundling functions and tasks into a
> separate class called 'kernel-initramfs'. The change also converts the
> copy_initramfs into a task that itself depends on the do_image_complete
> of the initramfs image. Making this change allows for the do_initramfs_*
> tasks to be conditionally added instead of relying on the task checking
> the variables, with the exception of do_deploy(_append).
>
> The 'use_alternate_initrd' of kernel_do_compile is replaced with a
> general use 'extra_make' variable. And the INITRAMFS_TASK functionality
> of kernel_do_compile is removed.
>
> The 'KERNEL_CLASSES' inherit is moved to after the EXPORT_FUNCTIONS
> do_deploy in order to allow these classes to append to the do_deploy
> task without breaking the do_deploy task itself.
>
> The functionality for INITRAMFS_TASK remained for backwards
> compatibility when the bundle changes were introduced. The bundle
> functionality has been available for a number of releases since, as such
> this change does not carry forward the functionality of INITRAMFS_TASK.
> The information regarding INITRAMFS_TASK issues for is kept along with
> the generation of a bb.fatal when a user attempts to use it.
>
> Signed-off-by: Nathan Rossi <nathan at nathanrossi.com>

Hi Nathan,

thanks for your efforts, clearly cleaning is needed wrt the bunling.

As for the results of this work, I fear it will break the existent (10
yrs) infrastructure.
A brief recap: we want to build a non-yocto kernel bundled with our
initramfs image, this in a single kernel recipe.

http://cgit.openembedded.org/meta-handheld/tree/recipes-kernel/linux/linux-kexecboot_4.4.bb

In the years I have adjusted the recipe which is today needing both

INITRAMFS_IMAGE = "initramfs-kexecboot-klibc-image"
INITRAMFS_TASK = "${INITRAMFS_IMAGE}:do_image_complete"

I will test your patch and include the new kernel-initramfs.bbclass.
The point is that I don't want/need the NITRAMFS_IMAGE_BUNDLE for th
emain kernel, just for thi ssecond kernel provided by the a.m. recipe.
I have to check again but this var has to be set upper in local.conf,
not in the recipe afaik.

Let me pls check this before (n)acking it...

Cheers
Andrea

> ---
>  meta/classes/kernel-initramfs.bbclass | 114 +++++++++++++++++++++++++
>  meta/classes/kernel.bbclass           | 155 +++++-----------------------------
>  2 files changed, 133 insertions(+), 136 deletions(-)
>  create mode 100644 meta/classes/kernel-initramfs.bbclass
>
> diff --git a/meta/classes/kernel-initramfs.bbclass b/meta/classes/kernel-initramfs.bbclass
> new file mode 100644
> index 0000000000..b23fb51495
> --- /dev/null
> +++ b/meta/classes/kernel-initramfs.bbclass
> @@ -0,0 +1,114 @@
> +
> +INITRAMFS_IMAGE ?= ""
> +INITRAMFS_IMAGE_NAME ?= "${@'${INITRAMFS_IMAGE}-${MACHINE}' if d.getVar('INITRAMFS_IMAGE') else ''}"
> +INITRAMFS_IMAGE_BUNDLE ?= ""
> +
> +python __anonymous () {
> +    # NOTE: setting INITRAMFS_TASK was for backward compatibility
> +    #       The preferred method is to set INITRAMFS_IMAGE, because
> +    #       this INITRAMFS_TASK has circular dependency problems
> +    #       if the initramfs requires kernel modules
> +    if d.getVar('INITRAMFS_TASK'):
> +        bb.fatal("The INITRAMFS_TASK variable is no longer supported. Use INITRAMFS_IMAGE and INITRAMFS_IMAGE_BUNDLE.")
> +
> +    image = d.getVar("INITRAMFS_IMAGE")
> +    bundle = oe.types.boolean(d.getVar("INITRAMFS_IMAGE_BUNDLE") or "0")
> +    if image and bundle:
> +        # add all the tasks
> +        bb.build.addtask('do_initramfs_copy', 'do_initramfs_bundle', 'do_install', d)
> +        bb.build.addtask('do_initramfs_bundle', 'do_deploy', 'do_initramfs_copy', d)
> +
> +        # make the do_initramfs_copy task depend on the image do_image_complete task
> +        d.appendVarFlag('do_initramfs_copy', 'depends', ' ${INITRAMFS_IMAGE}:do_image_complete')
> +}
> +
> +do_initramfs_copy[dirs] = "${B}"
> +do_initramfs_copy () {
> +    echo "Copying initramfs into ./usr ..."
> +    # In case the directory is not created yet from the first pass compile:
> +    mkdir -p ${B}/usr
> +    # Find and use the first initramfs image archive type we find
> +    rm -f ${B}/usr/${INITRAMFS_IMAGE_NAME}.cpio
> +    for img in cpio cpio.gz cpio.lz4 cpio.lzo cpio.lzma cpio.xz; do
> +        if [ -e "${DEPLOY_DIR_IMAGE}/${INITRAMFS_IMAGE_NAME}.$img" ]; then
> +            cp ${DEPLOY_DIR_IMAGE}/${INITRAMFS_IMAGE_NAME}.$img ${B}/usr/.
> +            case $img in
> +            *gz)
> +                echo "gzip decompressing image"
> +                gunzip -f ${B}/usr/${INITRAMFS_IMAGE_NAME}.$img
> +                break
> +                ;;
> +            *lz4)
> +                echo "lz4 decompressing image"
> +                lz4 -df ${B}/usr/${INITRAMFS_IMAGE_NAME}.$img
> +                break
> +                ;;
> +            *lzo)
> +                echo "lzo decompressing image"
> +                lzop -df ${B}/usr/${INITRAMFS_IMAGE_NAME}.$img
> +                break
> +                ;;
> +            *lzma)
> +                echo "lzma decompressing image"
> +                lzma -df ${B}/usr/${INITRAMFS_IMAGE_NAME}.$img
> +                break
> +                ;;
> +            *xz)
> +                echo "xz decompressing image"
> +                xz -df ${B}/usr/${INITRAMFS_IMAGE_NAME}.$img
> +                break
> +                ;;
> +            esac
> +        fi
> +    done
> +    if [ ! -e ${B}/usr/${INITRAMFS_IMAGE_NAME}.cpio ]; then
> +        bbfatal "Failed to copy initramfs cpio for image ${INITRAMFS_IMAGE_NAME}"
> +    fi
> +    echo "Finished copy of initramfs into ./usr"
> +}
> +
> +do_initramfs_bundle[dirs] = "${B}"
> +do_initramfs_bundle () {
> +    echo "Creating a kernel image with a bundled initramfs..."
> +    # Backing up kernel image relies on its type(regular file or symbolic link)
> +    tmp_path=""
> +    for imageType in ${KERNEL_IMAGETYPE_FOR_MAKE} ; do
> +        if [ -h ${KERNEL_OUTPUT_DIR}/$imageType ] ; then
> +            linkpath=`readlink -n ${KERNEL_OUTPUT_DIR}/$imageType`
> +            realpath=`readlink -fn ${KERNEL_OUTPUT_DIR}/$imageType`
> +            mv -f $realpath $realpath.bak
> +            tmp_path=$tmp_path" "$imageType"#"$linkpath"#"$realpath
> +        elif [ -f ${KERNEL_OUTPUT_DIR}/$imageType ]; then
> +            mv -f ${KERNEL_OUTPUT_DIR}/$imageType ${KERNEL_OUTPUT_DIR}/$imageType.bak
> +            tmp_path=$tmp_path" "$imageType"##"
> +        fi
> +    done
> +    extra_make=CONFIG_INITRAMFS_SOURCE=${B}/usr/${INITRAMFS_IMAGE_NAME}.cpio
> +    kernel_do_compile
> +    # Restoring kernel image
> +    for tp in $tmp_path ; do
> +        imageType=`echo $tp|cut -d "#" -f 1`
> +        linkpath=`echo $tp|cut -d "#" -f 2`
> +        realpath=`echo $tp|cut -d "#" -f 3`
> +        if [ -n "$realpath" ]; then
> +            mv -f $realpath $realpath.initramfs
> +            mv -f $realpath.bak $realpath
> +            ln -sf $linkpath.initramfs ${B}/${KERNEL_OUTPUT_DIR}/$imageType.initramfs
> +        else
> +            mv -f ${KERNEL_OUTPUT_DIR}/$imageType ${KERNEL_OUTPUT_DIR}/$imageType.initramfs
> +            mv -f ${KERNEL_OUTPUT_DIR}/$imageType.bak ${KERNEL_OUTPUT_DIR}/$imageType
> +        fi
> +    done
> +}
> +
> +do_deploy_append () {
> +    if [ ! -z "${INITRAMFS_IMAGE}" -a x"${INITRAMFS_IMAGE_BUNDLE}" = x1 ]; then
> +        for imageType in ${KERNEL_IMAGETYPES} ; do
> +            initramfs_base_name=${imageType}-${INITRAMFS_NAME}
> +            initramfs_symlink_name=${imageType}-${INITRAMFS_LINK_NAME}
> +            install -m 0644 ${KERNEL_OUTPUT_DIR}/${imageType}.initramfs $deployDir/${initramfs_base_name}.bin
> +            ln -sf ${initramfs_base_name}.bin $deployDir/${initramfs_symlink_name}.bin
> +        done
> +    fi
> +}
> +
> diff --git a/meta/classes/kernel.bbclass b/meta/classes/kernel.bbclass
> index e04d2fe004..c0e9452ca6 100644
> --- a/meta/classes/kernel.bbclass
> +++ b/meta/classes/kernel.bbclass
> @@ -20,10 +20,6 @@ OE_TERMINAL_EXPORTS += "KBUILD_OUTPUT"
>  INHIBIT_DEFAULT_DEPS = "1"
>
>  KERNEL_IMAGETYPE ?= "zImage"
> -INITRAMFS_IMAGE ?= ""
> -INITRAMFS_IMAGE_NAME ?= "${@['${INITRAMFS_IMAGE}-${MACHINE}', ''][d.getVar('INITRAMFS_IMAGE') == '']}"
> -INITRAMFS_TASK ?= ""
> -INITRAMFS_IMAGE_BUNDLE ?= ""
>
>  # KERNEL_VERSION is extracted from source code. It is evaluated as
>  # None for the first parsing, since the code has not been fetched.
> @@ -93,37 +89,8 @@ python __anonymous () {
>          d.appendVar('RDEPENDS_%s-image' % kname, ' %s-image-%s' % (kname, typelower))
>          d.setVar('PKG_%s-image-%s' % (kname,typelower), '%s-image-%s-${KERNEL_VERSION_PKG_NAME}' % (kname, typelower))
>          d.setVar('ALLOW_EMPTY_%s-image-%s' % (kname, typelower), '1')
> -
> -    image = d.getVar('INITRAMFS_IMAGE')
> -    if image:
> -        d.appendVarFlag('do_bundle_initramfs', 'depends', ' ${INITRAMFS_IMAGE}:do_image_complete')
> -
> -    # NOTE: setting INITRAMFS_TASK is for backward compatibility
> -    #       The preferred method is to set INITRAMFS_IMAGE, because
> -    #       this INITRAMFS_TASK has circular dependency problems
> -    #       if the initramfs requires kernel modules
> -    image_task = d.getVar('INITRAMFS_TASK')
> -    if image_task:
> -        d.appendVarFlag('do_configure', 'depends', ' ${INITRAMFS_TASK}')
>  }
>
> -# Here we pull in all various kernel image types which we support.
> -#
> -# In case you're wondering why kernel.bbclass inherits the other image
> -# types instead of the other way around, the reason for that is to
> -# maintain compatibility with various currently existing meta-layers.
> -# By pulling in the various kernel image types here, we retain the
> -# original behavior of kernel.bbclass, so no meta-layers should get
> -# broken.
> -#
> -# KERNEL_CLASSES by default pulls in kernel-uimage.bbclass, since this
> -# used to be the default behavior when only uImage was supported. This
> -# variable can be appended by users who implement support for new kernel
> -# image types.
> -
> -KERNEL_CLASSES ?= " kernel-uimage "
> -inherit ${KERNEL_CLASSES}
> -
>  # Old style kernels may set ${S} = ${WORKDIR}/git for example
>  # We need to move these over to STAGING_KERNEL_DIR. We can't just
>  # create the symlink in advance as the git fetcher can't cope with
> @@ -188,90 +155,10 @@ KERNEL_EXTRA_ARGS ?= ""
>  EXTRA_OEMAKE = " HOSTCC="${BUILD_CC} ${BUILD_CFLAGS} ${BUILD_LDFLAGS}" HOSTCPP="${BUILD_CPP}""
>  KERNEL_ALT_IMAGETYPE ??= ""
>
> -copy_initramfs() {
> -       echo "Copying initramfs into ./usr ..."
> -       # In case the directory is not created yet from the first pass compile:
> -       mkdir -p ${B}/usr
> -       # Find and use the first initramfs image archive type we find
> -       rm -f ${B}/usr/${INITRAMFS_IMAGE_NAME}.cpio
> -       for img in cpio cpio.gz cpio.lz4 cpio.lzo cpio.lzma cpio.xz; do
> -               if [ -e "${DEPLOY_DIR_IMAGE}/${INITRAMFS_IMAGE_NAME}.$img" ]; then
> -                       cp ${DEPLOY_DIR_IMAGE}/${INITRAMFS_IMAGE_NAME}.$img ${B}/usr/.
> -                       case $img in
> -                       *gz)
> -                               echo "gzip decompressing image"
> -                               gunzip -f ${B}/usr/${INITRAMFS_IMAGE_NAME}.$img
> -                               break
> -                               ;;
> -                       *lz4)
> -                               echo "lz4 decompressing image"
> -                               lz4 -df ${B}/usr/${INITRAMFS_IMAGE_NAME}.$img
> -                               break
> -                               ;;
> -                       *lzo)
> -                               echo "lzo decompressing image"
> -                               lzop -df ${B}/usr/${INITRAMFS_IMAGE_NAME}.$img
> -                               break
> -                               ;;
> -                       *lzma)
> -                               echo "lzma decompressing image"
> -                               lzma -df ${B}/usr/${INITRAMFS_IMAGE_NAME}.$img
> -                               break
> -                               ;;
> -                       *xz)
> -                               echo "xz decompressing image"
> -                               xz -df ${B}/usr/${INITRAMFS_IMAGE_NAME}.$img
> -                               break
> -                               ;;
> -                       esac
> -               fi
> -       done
> -       echo "Finished copy of initramfs into ./usr"
> -}
> -
> -do_bundle_initramfs () {
> -       if [ ! -z "${INITRAMFS_IMAGE}" -a x"${INITRAMFS_IMAGE_BUNDLE}" = x1 ]; then
> -               echo "Creating a kernel image with a bundled initramfs..."
> -               copy_initramfs
> -               # Backing up kernel image relies on its type(regular file or symbolic link)
> -               tmp_path=""
> -               for imageType in ${KERNEL_IMAGETYPE_FOR_MAKE} ; do
> -                       if [ -h ${KERNEL_OUTPUT_DIR}/$imageType ] ; then
> -                               linkpath=`readlink -n ${KERNEL_OUTPUT_DIR}/$imageType`
> -                               realpath=`readlink -fn ${KERNEL_OUTPUT_DIR}/$imageType`
> -                               mv -f $realpath $realpath.bak
> -                               tmp_path=$tmp_path" "$imageType"#"$linkpath"#"$realpath
> -                       elif [ -f ${KERNEL_OUTPUT_DIR}/$imageType ]; then
> -                               mv -f ${KERNEL_OUTPUT_DIR}/$imageType ${KERNEL_OUTPUT_DIR}/$imageType.bak
> -                               tmp_path=$tmp_path" "$imageType"##"
> -                       fi
> -               done
> -               use_alternate_initrd=CONFIG_INITRAMFS_SOURCE=${B}/usr/${INITRAMFS_IMAGE_NAME}.cpio
> -               kernel_do_compile
> -               # Restoring kernel image
> -               for tp in $tmp_path ; do
> -                       imageType=`echo $tp|cut -d "#" -f 1`
> -                       linkpath=`echo $tp|cut -d "#" -f 2`
> -                       realpath=`echo $tp|cut -d "#" -f 3`
> -                       if [ -n "$realpath" ]; then
> -                               mv -f $realpath $realpath.initramfs
> -                               mv -f $realpath.bak $realpath
> -                               ln -sf $linkpath.initramfs ${B}/${KERNEL_OUTPUT_DIR}/$imageType.initramfs
> -                       else
> -                               mv -f ${KERNEL_OUTPUT_DIR}/$imageType ${KERNEL_OUTPUT_DIR}/$imageType.initramfs
> -                               mv -f ${KERNEL_OUTPUT_DIR}/$imageType.bak ${KERNEL_OUTPUT_DIR}/$imageType
> -                       fi
> -               done
> -       fi
> -}
> -do_bundle_initramfs[dirs] = "${B}"
> -
>  python do_devshell_prepend () {
>      os.environ["LDFLAGS"] = ''
>  }
>
> -addtask bundle_initramfs after do_install before do_deploy
> -
>  get_cc_option () {
>                 # Check if KERNEL_CC supports the option "file-prefix-map".
>                 # This option allows us to build images with __FILE__ values that do not
> @@ -302,22 +189,10 @@ kernel_do_compile() {
>                 export KCONFIG_NOTIMESTAMP=1
>                 bbnote "KBUILD_BUILD_TIMESTAMP: $ts"
>         fi
> -       # The $use_alternate_initrd is only set from
> -       # do_bundle_initramfs() This variable is specifically for the
> -       # case where we are making a second pass at the kernel
> -       # compilation and we want to force the kernel build to use a
> -       # different initramfs image.  The way to do that in the kernel
> -       # is to specify:
> -       # make ...args... CONFIG_INITRAMFS_SOURCE=some_other_initramfs.cpio
> -       if [ "$use_alternate_initrd" = "" ] && [ "${INITRAMFS_TASK}" != "" ] ; then
> -               # The old style way of copying an prebuilt image and building it
> -               # is turned on via INTIRAMFS_TASK != ""
> -               copy_initramfs
> -               use_alternate_initrd=CONFIG_INITRAMFS_SOURCE=${B}/usr/${INITRAMFS_IMAGE_NAME}.cpio
> -       fi
>         cc_extra=$(get_cc_option)
> +       # extra_make is set via users of kernel_do_compile like do_initramfs_bundle
>         for typeformake in ${KERNEL_IMAGETYPE_FOR_MAKE} ; do
> -               oe_runmake ${typeformake} CC="${KERNEL_CC} $cc_extra " LD="${KERNEL_LD}" ${KERNEL_EXTRA_ARGS} $use_alternate_initrd
> +               oe_runmake ${typeformake} CC="${KERNEL_CC} $cc_extra " LD="${KERNEL_LD}" ${KERNEL_EXTRA_ARGS} $extra_make
>         done
>         # vmlinux.gz is not built by kernel
>         if (echo "${KERNEL_IMAGETYPES}" | grep -wq "vmlinux\.gz"); then
> @@ -679,15 +554,6 @@ kernel_do_deploy() {
>                 tar -cvzf $deployDir/modules-${MODULE_TARBALL_NAME}.tgz -C ${D}${root_prefix} lib
>                 ln -sf modules-${MODULE_TARBALL_NAME}.tgz $deployDir/modules-${MODULE_TARBALL_LINK_NAME}.tgz
>         fi
> -
> -       if [ ! -z "${INITRAMFS_IMAGE}" -a x"${INITRAMFS_IMAGE_BUNDLE}" = x1 ]; then
> -               for imageType in ${KERNEL_IMAGETYPES} ; do
> -                       initramfs_base_name=${imageType}-${INITRAMFS_NAME}
> -                       initramfs_symlink_name=${imageType}-${INITRAMFS_LINK_NAME}
> -                       install -m 0644 ${KERNEL_OUTPUT_DIR}/${imageType}.initramfs $deployDir/${initramfs_base_name}.bin
> -                       ln -sf ${initramfs_base_name}.bin $deployDir/${initramfs_symlink_name}.bin
> -               done
> -       fi
>  }
>  do_deploy[cleandirs] = "${DEPLOYDIR}"
>  do_deploy[dirs] = "${DEPLOYDIR} ${B}"
> @@ -697,5 +563,22 @@ addtask deploy after do_populate_sysroot do_packagedata
>
>  EXPORT_FUNCTIONS do_deploy
>
> +# Here we pull in all various kernel image types which we support.
> +#
> +# In case you're wondering why kernel.bbclass inherits the other image
> +# types instead of the other way around, the reason for that is to
> +# maintain compatibility with various currently existing meta-layers.
> +# By pulling in the various kernel image types here, we retain the
> +# original behavior of kernel.bbclass, so no meta-layers should get
> +# broken.
> +#
> +# KERNEL_CLASSES by default pulls in kernel-uimage.bbclass, since this
> +# used to be the default behavior when only uImage was supported. This
> +# variable can be appended by users who implement support for new kernel
> +# image types.
> +
> +KERNEL_CLASSES ?= " kernel-uimage kernel-initramfs "
> +inherit ${KERNEL_CLASSES}
> +
>  # Add using Device Tree support
>  inherit kernel-devicetree
> ---
> 2.19.1
> --
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core at lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/openembedded-core



More information about the Openembedded-core mailing list