All of lore.kernel.org
 help / color / mirror / Atom feed
From: Khem Raj <raj.khem@gmail.com>
To: Jason Wessel <jason.wessel@windriver.com>
Cc: Patches and discussions about the oe-core layer
	<Openembedded-core@lists.openembedded.org>
Subject: Re: [v2 PATCH] kernel.bbclass, image.bbclass: Implement kernel INITRAMFS dependency and bundling
Date: Thu, 22 Aug 2013 23:16:12 -0700	[thread overview]
Message-ID: <CAMKF1sp9sfkrRCaU6JwzN0YESyP=pd5n1oUcGz_fNj3OTTv6-g@mail.gmail.com> (raw)
In-Reply-To: <1377212667-5915-1-git-send-email-jason.wessel@windriver.com>

On Thu, Aug 22, 2013 at 4:04 PM, Jason Wessel
<jason.wessel@windriver.com> wrote:
> This patch aims to fix the following two cases for the INITRAMFS generation.
>   1) Allow an image recipe to specify a paired INITRAMFS recipe such
>      as core-image-minimal-initramfs.  This allows building a base
>      image which always generates the needed initramfs image in one step
>   2) Allow building a single binary which contains a kernel and
>      the initramfs.

I think this could be a bit simpler. Have a full kernel image recipe (
kernel + initramfs)
separate. It fits into the equation nicely. The final image can bundle
initramfs which has modules from practically same kernel build is
staged step 1 of kernel build which
automatically happens today for any image build.

The new recipe for kernel+initramfs requires the existing kernel
recipes and tweaks the .config to enable INITRAMFS_IMAGE

You can share the sources for both stages where kernel is built like
gcc is putting the sources under work-shared and building all gcc
recipes out of this location.


>
> A key requirement of the initramfs is to be able to add kernel
> modules.  The current implementation of the INITRAMFS_IMAGE variable
> has a circular dependency when using kernel modules in the initramfs
> image.bb file that is caused by kernel.bbclass trying to build the
> initramfs before the kernel's do_install rule.
>
> The solution for this problem is to have the kernel's
> do_bundle_initramfs_image task depend on the do_rootfs from the
> INITRAMFS_IMAGE and not some intermediate point.  The image.bbclass
> will also sets up dependencies to make the initramfs creation task run
> last.
>
> The code to bundle the kernel and initramfs together has been added.
> At a high level, all it is doing is invoking a second compilation of
> the kernel but changing the value of CONFIG_INITRAMFS_SOURCE to point
> to the generated initramfs from the image recipe.
>
> [YOCTO #4072]
>
> Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
> Acked-by: Bruce Ashfield <bruce.ashfield@windriver.com>
>
> ---
>  meta/classes/image.bbclass  |   12 ++++++
>  meta/classes/kernel.bbclass |   96 +++++++++++++++++++++++++++++++++++++------
>  meta/conf/local.conf.sample |   20 +++++++++
>  3 files changed, 116 insertions(+), 12 deletions(-)
>
> diff --git a/meta/classes/image.bbclass b/meta/classes/image.bbclass
> index 909702a..23967ec 100644
> --- a/meta/classes/image.bbclass
> +++ b/meta/classes/image.bbclass
> @@ -130,6 +130,10 @@ python () {
>      d.setVar('MULTILIB_VENDORS', ml_vendor_list)
>
>      check_image_features(d)
> +    initramfs_image = d.getVar('INITRAMFS_IMAGE', True) or ""
> +    if initramfs_image != "":
> +        d.appendVarFlag('do_build', 'depends', " %s:do_bundle_initramfs" %  d.getVar('PN', True))
> +        d.appendVarFlag('do_bundle_initramfs', 'depends', " %s:do_rootfs" % initramfs_image)
>  }
>
>  #
> @@ -629,3 +633,11 @@ do_package_write_deb[noexec] = "1"
>  do_package_write_rpm[noexec] = "1"
>
>  addtask rootfs before do_build
> +# Allow the kernel to be repacked with the initramfs and boot image file as a single file
> +do_bundle_initramfs[depends] += "virtual/kernel:do_bundle_initramfs"
> +do_bundle_initramfs[nostamp] = "1"
> +do_bundle_initramfs[noexec] = "1"
> +do_bundle_initramfs () {
> +       :
> +}
> +addtask bundle_initramfs after do_rootfs
> diff --git a/meta/classes/kernel.bbclass b/meta/classes/kernel.bbclass
> index e039dfc..8cf66ce 100644
> --- a/meta/classes/kernel.bbclass
> +++ b/meta/classes/kernel.bbclass
> @@ -9,6 +9,7 @@ INHIBIT_DEFAULT_DEPS = "1"
>  KERNEL_IMAGETYPE ?= "zImage"
>  INITRAMFS_IMAGE ?= ""
>  INITRAMFS_TASK ?= ""
> +INITRAMFS_IMAGE_BUNDLE ?= ""
>
>  python __anonymous () {
>      kerneltype = d.getVar('KERNEL_IMAGETYPE', True) or ''
> @@ -19,7 +20,15 @@ python __anonymous () {
>
>      image = d.getVar('INITRAMFS_IMAGE', True)
>      if image:
> -        d.setVar('INITRAMFS_TASK', '${INITRAMFS_IMAGE}:do_rootfs')
> +        d.appendVarFlag('do_bundle_initramfs', 'depends', ' ${INITRAMFS_IMAGE}:do_rootfs')
> +
> +    # 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', True)
> +    if image_task:
> +        d.appendVarFlag('do_configure', 'depends', ' ${INITRAMFS_TASK}')
>  }
>
>  inherit kernel-arch deploy
> @@ -72,9 +81,82 @@ KERNEL_SRC_PATH = "/usr/src/kernel"
>
>  KERNEL_IMAGETYPE_FOR_MAKE = "${@(lambda s: s[:-3] if s[-3:] == ".gz" else s)(d.getVar('KERNEL_IMAGETYPE', True))}"
>
> +copy_initramfs() {
> +       echo "Copying initramfs into ./usr ..."
> +       # Find and use the first initramfs image archive type we find
> +       rm -f ${B}/usr/${INITRAMFS_IMAGE}-${MACHINE}.cpio
> +       for img in cpio.gz cpio.lzo cpio.lzma cpio.xz; do
> +               if [ -e "${DEPLOY_DIR_IMAGE}/${INITRAMFS_IMAGE}-${MACHINE}.$img" ]; then
> +                       cp ${DEPLOY_DIR_IMAGE}/${INITRAMFS_IMAGE}-${MACHINE}.$img ${B}/usr/.
> +                       case $img in
> +                       *gz)
> +                               echo "gzip decompressing image"
> +                               gunzip -f ${B}/usr/${INITRAMFS_IMAGE}-${MACHINE}.$img
> +                               break
> +                               ;;
> +                       *lzo)
> +                               echo "lzo decompressing image"
> +                               lzop -df ${B}/usr/${INITRAMFS_IMAGE}-${MACHINE}.$img
> +                               break
> +                               ;;
> +                       *lzma)
> +                               echo "lzma decompressing image"
> +                               lzmash -df ${B}/usr/${INITRAMFS_IMAGE}-${MACHINE}.$img
> +                               break
> +                               ;;
> +                       *xz)
> +                               echo "xz decompressing image"
> +                               xz -df ${B}/usr/${INITRAMFS_IMAGE}-${MACHINE}.$img
> +                               break
> +                               ;;
> +                       esac
> +               fi
> +       done
> +       echo "Finished copy of initramfs into ./usr"
> +}
> +
> +INITRAMFS_BASE_NAME = "${KERNEL_IMAGETYPE}-initramfs-${PV}-${PR}-${MACHINE}-${DATETIME}"
> +INITRAMFS_BASE_NAME[vardepsexclude] = "DATETIME"
> +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
> +               if [ -e ${KERNEL_OUTPUT} ] ; then
> +                       mv -f ${KERNEL_OUTPUT} ${KERNEL_OUTPUT}.bak
> +               fi
> +               use_alternate_initrd=CONFIG_INITRAMFS_SOURCE=${B}/usr/${INITRAMFS_IMAGE}-${MACHINE}.cpio
> +               kernel_do_compile
> +               mv -f ${KERNEL_OUTPUT} ${KERNEL_OUTPUT}.initramfs
> +               mv -f ${KERNEL_OUTPUT}.bak ${KERNEL_OUTPUT}
> +               # Update install area
> +               echo "There is kernel image bundled with initramfs: ${B}/${KERNEL_OUTPUT}.initramfs"
> +               install -m 0644 ${B}/${KERNEL_OUTPUT}.initramfs ${D}/boot/${KERNEL_IMAGETYPE}-initramfs-${MACHINE}.bin
> +               echo "${B}/${KERNEL_OUTPUT}.initramfs"
> +               cd ${B}
> +               # Update deploy directory
> +               if [ -e "${KERNEL_OUTPUT}.initramfs" ]; then
> +                       echo "Copying deploy kernel-initramfs image and setting up links..."
> +                       initramfs_base_name=${INITRAMFS_BASE_NAME}
> +                       initramfs_symlink_name=${KERNEL_IMAGETYPE}-initramfs-${MACHINE}
> +                       install -m 0644 ${KERNEL_OUTPUT}.initramfs ${DEPLOY_DIR_IMAGE}/${initramfs_base_name}.bin
> +                       cd ${DEPLOY_DIR_IMAGE}
> +                       ln -sf ${initramfs_base_name}.bin ${initramfs_symlink_name}.bin
> +               fi
> +       fi
> +}
> +do_bundle_initramfs[nostamp] = "1"
> +addtask bundle_initramfs after do_compile
> +
>  kernel_do_compile() {
>         unset CFLAGS CPPFLAGS CXXFLAGS LDFLAGS MACHINE
> -       oe_runmake ${KERNEL_IMAGETYPE_FOR_MAKE} ${KERNEL_ALT_IMAGETYPE} CC="${KERNEL_CC}" LD="${KERNEL_LD}" ${KERNEL_EXTRA_ARGS}
> +       # 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
> +       oe_runmake ${KERNEL_IMAGETYPE_FOR_MAKE} ${KERNEL_ALT_IMAGETYPE} CC="${KERNEL_CC}" LD="${KERNEL_LD}" ${KERNEL_EXTRA_ARGS} $use_alternate_initrd
>         if test "${KERNEL_IMAGETYPE_FOR_MAKE}.gz" = "${KERNEL_IMAGETYPE}"; then
>                 gzip -9c < "${KERNEL_IMAGETYPE_FOR_MAKE}" > "${KERNEL_OUTPUT}"
>         fi
> @@ -219,18 +301,8 @@ kernel_do_configure() {
>                 cp "${WORKDIR}/defconfig" "${B}/.config"
>         fi
>         yes '' | oe_runmake oldconfig
> -
> -       if [ ! -z "${INITRAMFS_IMAGE}" ]; then
> -               for img in cpio.gz cpio.lzo cpio.lzma cpio.xz; do
> -               if [ -e "${DEPLOY_DIR_IMAGE}/${INITRAMFS_IMAGE}-${MACHINE}.$img" ]; then
> -                       cp "${DEPLOY_DIR_IMAGE}/${INITRAMFS_IMAGE}-${MACHINE}.$img" initramfs.$img
> -               fi
> -               done
> -       fi
>  }
>
> -do_configure[depends] += "${INITRAMFS_TASK}"
> -
>  do_savedefconfig() {
>         oe_runmake savedefconfig
>  }
> diff --git a/meta/conf/local.conf.sample b/meta/conf/local.conf.sample
> index 2b078d0..17733ab 100644
> --- a/meta/conf/local.conf.sample
> +++ b/meta/conf/local.conf.sample
> @@ -146,6 +146,26 @@ EXTRA_IMAGE_FEATURES = "debug-tweaks"
>  USER_CLASSES ?= "buildstats image-mklibs image-prelink"
>
>  #
> +# Kernel image features
> +#
> +# The INITRAMFS_IMAGE image variable will cause an additional recipe to
> +# be built as a dependency to the what ever rootfs recipe you might be
> +# using such as core-image-sato.  The initramfs might be needed for
> +# the initial boot of of the target system such as to load kernel
> +# modules prior to mounting the root file system.
> +#
> +# INITRAMFS_IMAGE_BUNDLE variable controls if the image recipe
> +# specified by the INITRAMFS_IMAGE will be run through an extra pass
> +# through the kernel compilation in order to build a single binary
> +# which contains both the kernel image and the initramfs.  The
> +# combined binary will be deposited into the tmp/deploy directory.
> +# NOTE: You can set INITRAMFS_IMAGE in an image recipe, but
> +#       INITRAMFS_IMAGE_BUNDLE can only be set in a conf file.
> +#
> +#INITRAMFS_IMAGE = "core-image-minimal-initramfs"
> +#INITRAMFS_IMAGE_BUNDLE = "1"
> +
> +#
>  # Runtime testing of images
>  #
>  # The build system can test booting virtual machine images under qemu (an emulator)
> --
> 1.7.9.5
>
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core@lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/openembedded-core


  reply	other threads:[~2013-08-23  6:16 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-08-22 23:04 [v2 PATCH] kernel.bbclass, image.bbclass: Implement kernel INITRAMFS dependency and bundling Jason Wessel
2013-08-23  6:16 ` Khem Raj [this message]
2013-08-23 12:56   ` Jason Wessel
2013-08-26  8:33     ` Andrea Adami
2013-08-24 17:15 ` Richard Purdie
2013-09-27  8:07   ` Andrea Adami
2013-09-27  9:05     ` Richard Purdie
2013-09-27 11:59       ` Andrea Adami
2013-09-27 12:33         ` Bruce Ashfield
2013-09-27 16:33       ` Jason Wessel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAMKF1sp9sfkrRCaU6JwzN0YESyP=pd5n1oUcGz_fNj3OTTv6-g@mail.gmail.com' \
    --to=raj.khem@gmail.com \
    --cc=Openembedded-core@lists.openembedded.org \
    --cc=jason.wessel@windriver.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.