public inbox for isar-users@googlegroups.com
 help / color / mirror / Atom feed
From: Henning Schild <henning.schild@siemens.com>
To: Claudius Heine <claudius.heine.ext@siemens.com>
Cc: <isar-users@googlegroups.com>
Subject: Re: [PATCH v2 11/17] images: New class wic-img for wic intregration
Date: Mon, 16 Apr 2018 12:25:10 +0200	[thread overview]
Message-ID: <20180416122510.5e29062b@mmd1pvb1c.ad001.siemens.net> (raw)
In-Reply-To: <1f89f1a6-9472-ba91-d1f3-fa93722dc2d4@siemens.com>

Am Mon, 16 Apr 2018 12:17:55 +0200
schrieb Claudius Heine <claudius.heine.ext@siemens.com>:

> Hi Henning,
> 
> first of, great work getting wic functional!
> 
> On 2018-04-13 16:44, [ext] Henning Schild wrote:
> > So this is the patch that does the real magic, unfortunately i have
> > to call it that ...
> > 
> > Am Fri, 13 Apr 2018 16:19:00 +0200
> > schrieb Henning Schild <henning.schild@siemens.com>:
> >   
> >> This patch integrates wic into the bitbake workflow, wic will be
> >> used for the imaging step, no need to call it manually.
> >> After all the previous reverts we now use an unmodified version of
> >> wic.
> >>
> >> Issues:
> >>    - wic was never integrated
> >>    - you always had to build an ext4-img to create a wic image
> >> later
> >>    - there was never a way to control the size of wic
> >> disks/partition, only directly in the wks
> >>    - wic used to leak the hosts bootloader into the final image
> >>
> >> Impact:
> >>    The patch solves the Issues, but drops the ability to manually
> >> start wic after bitbake. And it drops support for building wic
> >> images for Distros before stretch.
> >>
> >> Signed-off-by: Henning Schild <henning.schild@siemens.com>
> >> ---
> >>   doc/user_manual.md                                 |   6 -
> >>   .../scripts/lib/wic/canned-wks/sdimage-efi.wks     |   2 +-
> >>   .../lib/wic/plugins/source/bootimg-efi-isar.py     | 297
> >> +++++++++++++++++++++
> >> meta/classes/wic-img.bbclass                       |  78 ++++++
> >> meta/recipes-devtools/buildchroot/buildchroot.bb   |  19 ++
> >> scripts/wic_fakeroot                               |  37 +++ 6
> >> files changed, 432 insertions(+), 7 deletions(-) create mode 100644
> >> meta-isar/scripts/lib/wic/plugins/source/bootimg-efi-isar.py create
> >> mode 100644 meta/classes/wic-img.bbclass create mode 100755
> >> scripts/wic_fakeroot
> >>
> >> diff --git a/doc/user_manual.md b/doc/user_manual.md
> >> index 058f7bd..7bd52f4 100644
> >> --- a/doc/user_manual.md
> >> +++ b/doc/user_manual.md
> >> @@ -52,16 +52,10 @@ The steps below describe how to build the
> >> images provided by default. Install the following packages:
> >>   ```
> >>   dosfstools
> >> -e2fsprogs/jessie-backports  # wic: e2fsprogs -d
> >> -gdisk                       # wic
> >>   git
> >> -grub-efi-amd64-bin          # wic
> >> UEFI: /usr/lib/grub/x86_64-efi/moddep.lst
> >> -grub-efi-ia32-bin           # wic
> >> UEFI: /usr/lib/grub/i386-efi/moddep.lst -mtools
> >> # wic FAT: mcopy debootstrap parted
> >>   python
> >> -python3                     # wic
> >>   qemu
> >>   qemu-user-static
> >>   rxvt-unicode                # build_parallel  
> > 
> > We are now running wic in buildchroot and do not need all that
> > anymore.
> > 
> > wic uses a set of tools for partitioning etc. and it has
> > dependencies on versions of these tools. In OE people know those
> > and build a native sysroot. But we have debian tools that have
> > slighly different versions.
> > 
> > That is why we carry a few workarounds to make wic still like our
> > tools, i will point them out later.
> > 
> > In OE the native sysroot contains tools that are all statically
> > linked so you can execute them without a problem. In Isar we can
> > just do that with the host tools. Things we have in buildchroot or
> > the image rootfs can only be used when chrooting in.
> > 
> > So why not keep all that and use the host tools? Things like mkfs or
> > parted are fine, but bootloader installers leak host information
> > into our images. So we would build a wheezy with a jessie grub, not
> > the best idea.
> > 
> > So i decided to run wic in buildchroot instead of the host. It also
> > shifts the whole sudo on the host discussion.
> > 
> > Running wic in buildchroot solves several problems but introduces
> > another "interesting" aspect. When doing that with wheezy or jessie
> > you are beaming wic so far into the past that the few tool
> > workarounds will not work anymore. The tools are too old and even
> > do not support certain command line switches. One example we
> > already had for jessie: 
> >> -e2fsprogs/jessie-backports  # wic: e2fsprogs -d  
> > 
> > So the pragmatic decision was to simply not support distros that
> > predate wic itself. It is unlikely we will have to deal with such
> > problems looking in the future. Because the new tools in newer
> > distros are not likely to be backward incompatible.
> >   
> >> a/meta-isar/scripts/lib/wic/plugins/source/bootimg-efi-isar.py
> >> b/meta-isar/scripts/lib/wic/plugins/source/bootimg-efi-isar.py
> >> new  
> > ...  
> >> file mode 100644 index 0000000..fccf96c --- /dev/null
> >> +            grubefi_conf += "menuentry 'boot'{\n"
> >> +
> >> +            kernel = "/vmlinuz"  
> > 
> > I did not find a better way than to fork the plugins. But they need
> > to be slightly different to what we get from OE. One example is the
> > name of the kernel that is hardcoded there.
> > 
> > But the diffs are small and should not be hard to maintain.  
> 
> Would it make sense to commit first the unmodified plugins from oe
> here, and then patch them to work with isar? That way maintaining
> those patches could be easier, couldn't it?

For sure, i thought about that as well and then decided a simple diff
would be good enough. But you are right, i will split it up to do that
and review all changes again.

> >   
> >> diff --git a/meta/classes/wic-img.bbclass
> >> b/meta/classes/wic-img.bbclass new file mode 100644
> >> index 0000000..d1deff3
> >> --- /dev/null
> >> +++ b/meta/classes/wic-img.bbclass
> >> @@ -0,0 +1,78 @@
> >> +# This software is a part of ISAR.
> >> +# Copyright (C) 2018 Siemens AG
> >> +#
> >> +# this class is heavily inspired by
> >> OEs ./meta/classes/image_types_wic.bbclass +#
> >> +
> >> +WKS_FILE ?= "sdimage-efi"
> >> +ROOTFS_TYPE ?= "ext4"
> >> +
> >> +STAGING_DATADIR ?= "/usr/lib/"
> >> +STAGING_LIBDIR ?= "/usr/lib/"
> >> +STAGING_DIR ?= "${TMPDIR}"
> >> +IMAGE_BASENAME ?= "multiconfig:${MACHINE}-${DISTRO}:${PN}"  
> 
> I currently don't understand your value for the IMAGE_BASENAME. Why
> does it have multiconfig in its name? Also if those should be valid
> bitbake targets, DISTRO is set to "debian-stretch" resulting in 
> 'multiconfig:qemuamd64-debian-stretch:isar-image-base' and that 
> multiconfig doesn't exist AFAIK.

To be honest i will have to check that again. I think there is an
expectation in wic when it is looking for the .env file.

> >> +FAKEROOTCMD ?= "${ISARROOT}/scripts/wic_fakeroot"
> >> +RECIPE_SYSROOT_NATIVE ?= "/"
> >> +
> >> +do_wic_image[stamp-extra-info] = "${DISTRO}-${MACHINE}"
> >> +
> >> +WIC_CREATE_EXTRA_ARGS ?= ""
> >> +
> >> +WICVARS ?= "\
> >> +           BBLAYERS IMGDEPLOYDIR DEPLOY_DIR_IMAGE FAKEROOTCMD
> >> IMAGE_BASENAME IMAGE_BOOT_FILES \
> >> +           IMAGE_LINK_NAME IMAGE_ROOTFS INITRAMFS_FSTYPES INITRD
> >> INITRD_LIVE ISODIR RECIPE_SYSROOT_NATIVE \
> >> +           ROOTFS_SIZE STAGING_DATADIR STAGING_DIR STAGING_LIBDIR
> >> TARGET_SYS TRANSLATED_TARGET_ARCH" +
> >> +# Isar specific vars used in our plugins
> >> +WICVARS += "KERNEL_IMAGE INITRD_IMAGE DISTRO_ARCH"
> >> +
> >> +python do_rootfs_wicenv () {
> >> +    wicvars = d.getVar('WICVARS', True)
> >> +    if not wicvars:
> >> +        return
> >> +
> >> +    stdir = d.getVar('STAGING_DIR', True)
> >> +    outdir = os.path.join(stdir, d.getVar('MACHINE', True),
> >> 'imgdata')
> >> +    bb.utils.mkdirhier(outdir)
> >> +    basename = d.getVar('IMAGE_BASENAME', True)
> >> +    with open(os.path.join(outdir, basename) + '.env', 'w') as
> >> envf:
> >> +        for var in wicvars.split():
> >> +            value = d.getVar(var, True)
> >> +            if value:
> >> +                envf.write('%s="%s"\n' % (var, value.strip()))
> >> +
> >> +    # this part is stolen from
> >> OE ./meta/recipes-core/meta/wic-tools.bb
> >> +    with open(os.path.join(outdir, "wic-tools.env"), 'w') as envf:
> >> +        for var in ('RECIPE_SYSROOT_NATIVE', 'STAGING_DATADIR',
> >> 'STAGING_LIBDIR'):
> >> +            envf.write('%s="%s"\n' % (var, d.getVar(var,
> >> True).strip())) +
> >> +}
> >> +
> >> +addtask do_rootfs_wicenv after do_copy_boot_files before
> >> do_wic_image +do_rootfs_wicenv[vardeps] += "${WICVARS}"
> >> +do_rootfs_wicenv[prefuncs] = 'set_image_size'
> >> +
> >> +WIC_IMAGE_FILE
> >> ="${DEPLOY_DIR_IMAGE}/${PN}-${DISTRO}-${MACHINE}.wic.img" +
> >> +do_build[stamp-extra-info] = "${DISTRO}-${DISTRO_ARCH}"
> >> +
> >> +do_wic_image() {
> >> +    if ! grep -q ${BUILDCHROOT_DIR}/dev /proc/mounts; then
> >> +        sudo mount -t devtmpfs -o mode=0755,nosuid devtmpfs
> >> ${BUILDCHROOT_DIR}/dev
> >> +        sudo mount -t proc none ${BUILDCHROOT_DIR}/proc
> >> +    fi
> >> +    for dir in ${BBLAYERS} ${STAGING_DIR} ${ISARROOT}/scripts; do
> >> +	sudo mkdir -p ${BUILDCHROOT_DIR}/$dir
> >> +        sudo mount --bind $dir ${BUILDCHROOT_DIR}/$dir
> >> +    done
> >> +    export FAKEROOTCMD=${FAKEROOTCMD}
> >> +    export BUILDDIR=${BUILDDIR}
> >> +    export MTOOLS_SKIP_CHECK=1  
> > 
> > This is one of the tool workarounds, where i reverted a patch
> > against wic.
> >   
> >> +
> >> +    sudo -E chroot ${BUILDCHROOT_DIR} ${ISARROOT}/scripts/wic
> >> create ${WKS_FILE} --vars "${STAGING_DIR}/${MACHINE}/imgdata/"
> >> -o /tmp/ -e ${IMAGE_BASENAME} ${WIC_CREATE_EXTRA_ARGS}
> >> +    cp -f `ls -t -1 ${BUILDCHROOT_DIR}/tmp/${WKS_FILE}*.direct |
> >> head -1` ${WIC_IMAGE_FILE} +}
> >> +
> >> +do_wic_image[depends] = "buildchroot:do_build"
> >> +
> >> +addtask wic_image before do_build after do_copy_boot_files
> >> diff --git a/meta/recipes-devtools/buildchroot/buildchroot.bb
> >> b/meta/recipes-devtools/buildchroot/buildchroot.bb index
> >> b16e63a..bd4d003 100644 ---
> >> a/meta/recipes-devtools/buildchroot/buildchroot.bb +++
> >> b/meta/recipes-devtools/buildchroot/buildchroot.bb @@ -28,6 +28,25
> >> @@ BUILDCHROOT_PREINSTALL ?= "gcc \ devscripts \
> >>                              equivs"
> >>   
> >> +BUILDCHROOT_PREINSTALL_WIC = " \
> >> +                             parted \
> >> +                             gdisk \
> >> +                             util-linux \
> >> +                             syslinux \
> >> +                             syslinux-common \
> >> +                             dosfstools \
> >> +                             mtools \
> >> +                             e2fsprogs \
> >> +                             grub-efi-amd64-bin \
> >> +                             grub-efi-ia32-bin \
> >> +                             python3"
> >> +
> >> +python () {
> >> +    if d.getVar('IMAGE_TYPE', True) == 'wic-img':  
> 
> That limits how many images types one image recipe has. With OE you 
> could create multiple image types from one image recipe. Here you
> only have one. That might be fine. But just as a note. I currently
> don't have a usecase to support multiple image types for one image.

I actually had "'wic-img' in IMAGE_TYPE" there, which broke building
external layers. IMAGE_TYPE currently is a string an not an array. If
we ever switch to an array, that line needs to change. But right now
it is a string.

Henning
 
> OE supports different post-processes to the wic image. For instance 
> 'wic.xz' creates a compressed wic file and 'wic.bmap' creates a 
> bmap-tool file in addition to the wic image.
> 
> I don't know if you currently have plans to implement such
> expansions, but maybe think about how such could be implemented with
> your current design.
> 
> regards,
> Claudius
> 
> >> +        d.appendVar('BUILDCHROOT_PREINSTALL',
> >> +                    d.getVar('BUILDCHROOT_PREINSTALL_WIC', True))
> >> +}  
> > 
> > Now the wic tools become part of buildchroot if you chose that
> > IMAGE_TYPE.
> >   
> >>   WORKDIR = "${TMPDIR}/work/${DISTRO}-${DISTRO_ARCH}/${PN}"
> >>   
> >>   do_build[stamp-extra-info] = "${DISTRO}-${DISTRO_ARCH}"
> >> diff --git a/scripts/wic_fakeroot b/scripts/wic_fakeroot
> >> new file mode 100755
> >> index 0000000..9e01c38
> >> --- /dev/null
> >> +++ b/scripts/wic_fakeroot
> >> @@ -0,0 +1,37 @@
> >> +#!/usr/bin/env python3
> >> +#
> >> +# wic needs a FAKEROOT cmd to run, the default is pseudo. In Isar
> >> we do/can not +# use pseudo. And we call wic as root to begin
> >> with, so this script could be a +# dummy doing nothing. It is
> >> almost a dummy ... +#
> >> +# If the fsck hack ever becomes obsolete, FAKEROOTCMD ?= "true;"
> >> can be used +#
> >> +# This software is a part of Isar.
> >> +# Copyright (C) 2018 Siemens AG
> >> +#
> >> +import os
> >> +import sys
> >> +import shutil
> >> +import subprocess
> >> +
> >> +args = sys.argv
> >> +args.pop(0)
> >> +cmd = args[0]
> >> +
> >> +# expect to be running as root
> >> +# we could loosen that and execv(sudo, args) but even some early
> >> +# "du"s fail, which do not use the fakeroot-wrapper
> >> +#  i.e. in wics partition.py the "du -ks" fails on
> >> +#    var/cache/apt/archives/partial
> >> +#    rootfs/root ...
> >> +assert 'root' == os.environ["USER"]
> >> +
> >> +# e2fsck <= 1.43.5 returns 1 on non-errors (stretch and before
> >> affected) +# treat 1 as safe ... the filesystem was successfully
> >> repaired and is OK +if cmd.startswith('fsck.'):
> >> +    ret = subprocess.call(args)
> >> +    if ret == 0 or ret == 1:
> >> +        sys.exit(0)
> >> +    sys.exit(ret)  
> > 
> > This is another tool workaround, now outside of wic.
> >   
> >> +
> >> +os.execv(shutil.which(cmd), args)  
> >   
> 


  reply	other threads:[~2018-04-16 10:25 UTC|newest]

Thread overview: 47+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-13 14:18 [PATCH v2 00/16] wic integration Henning Schild
2018-04-13 14:18 ` [PATCH v2 01/17] Revert "wic: Make the bootimg-efi plugin generate usable images" Henning Schild
2018-04-13 14:18 ` [PATCH v2 02/17] Revert "wic: Introduce the `WicExecError` exception class" Henning Schild
2018-04-13 14:18 ` [PATCH v2 03/17] Revert "wic: Work around mcopy error" Henning Schild
2018-04-13 14:18 ` [PATCH v2 04/17] Revert "wic: Use sudo instead of pseudo" Henning Schild
2018-04-16 10:44   ` Andreas Reichel
2018-04-16 10:53     ` Andreas Reichel
2018-04-16 10:57     ` Henning Schild
2018-04-13 14:18 ` [PATCH v2 05/17] Revert "wic: Remove sysroot support" Henning Schild
2018-04-13 14:18 ` [PATCH v2 06/17] wic: now truly go for the wic version we claim to have Henning Schild
2018-04-13 14:18 ` [PATCH v2 07/17] Revert "isar-init-build-env: Add /sbin to PATH" Henning Schild
2018-04-13 14:18 ` [PATCH v2 08/17] classes: image: introduce size measuring function, for before do_*_image Henning Schild
2018-04-13 14:18 ` [PATCH v2 09/17] meta/image: Fix broken variables KERNEL_IMAGE and INITRD_IMAGE Henning Schild
2018-04-16 10:45   ` Andreas Reichel
2018-04-13 14:18 ` [PATCH v2 10/17] isar-init-build-env: make ISARROOT available in bitbake Henning Schild
2018-04-13 14:19 ` [PATCH v2 11/17] images: New class wic-img for wic intregration Henning Schild
2018-04-13 14:44   ` Henning Schild
2018-04-16 10:17     ` Claudius Heine
2018-04-16 10:25       ` Henning Schild [this message]
2018-04-16 10:31       ` Andreas Reichel
2018-04-13 14:19 ` [PATCH v2 12/17] wic: Add pcibios boot plugins and wks files Henning Schild
2018-04-16 10:52   ` Andreas Reichel
2018-04-16 11:48     ` Henning Schild
2018-04-13 14:19 ` [PATCH v2 13/17] scripts/start_vm: Enable booting of full disk images Henning Schild
2018-04-16 10:33   ` Andreas Reichel
2018-04-16 11:46     ` Henning Schild
2018-04-16 13:24       ` Andreas Reichel
2018-04-13 14:19 ` [PATCH v2 14/17] multiconfig: Switch qemuamd64-stretch to using wic by default Henning Schild
2018-04-16 10:25   ` Claudius Heine
2018-04-16 10:32     ` Henning Schild
2018-04-13 14:19 ` [PATCH v2 15/17] multiconfig: Switch qemui386-stretch " Henning Schild
2018-04-16 10:35   ` Andreas Reichel
2018-04-16 10:43     ` Henning Schild
2018-04-16 10:51       ` Henning Schild
2018-04-16 10:56         ` Claudius Heine
2018-04-13 14:19 ` [PATCH v2 16/17] docs: Change according to recent patches Henning Schild
2018-04-13 14:19 ` [PATCH v2 17/17] scripts/vm_smoke_test: double the timeout we wait for qemus Henning Schild
2018-04-16 10:47   ` Andreas Reichel
2018-04-16 11:45     ` Henning Schild
2018-04-25 15:53 ` [PATCH v2 00/16] wic integration Alexander Smirnov
2018-04-26 11:26   ` Henning Schild
2018-05-01 19:23 ` Alexander Smirnov
2018-05-03 16:32   ` Henning Schild
2018-05-03 16:39     ` Alexander Smirnov
2018-05-04  8:16       ` Henning Schild
2018-05-04  8:32         ` Alexander Smirnov
2018-05-04  9:30           ` Henning Schild

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=20180416122510.5e29062b@mmd1pvb1c.ad001.siemens.net \
    --to=henning.schild@siemens.com \
    --cc=claudius.heine.ext@siemens.com \
    --cc=isar-users@googlegroups.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox