public inbox for isar-users@googlegroups.com
 help / color / mirror / Atom feed
* Analysis of isar: Current work of efibootguard / swupdate integration
@ 2017-09-21 14:18 Andreas Reichel
  2017-10-18 11:39 ` Alexander Smirnov
  0 siblings, 1 reply; 2+ messages in thread
From: Andreas Reichel @ 2017-09-21 14:18 UTC (permalink / raw)
  To: isar-users

# isar - integration of efibootguard and swupdate #

## My analysis of the current status of isar ##

Consider the following situation:

efibootguard is compiled from sources, swupdate is compiled from sources, both are integrated into an isar image.

problem: there was no final/usable build pipeline for this, i.e. architecture of isar still under construction/discussion,
thus I introduced the following pipeline-steps to be independent of the current work:

* do_clean
* do_install_build_deps
* do_configure
* do_compile
* do_build
* do_deploy_deb
* do_package_deb
* do_temp_deploy
* do_deploy_wic_files

in the following order:

addtask do_install_build_deps before do_configure after do_unpack
addtask do_compile before do_build
addtask do_configure before do_compile after do_unpack
addtask do_fetch before do_unpack
addtask do_temp_deploy before do_build after do_compile
addtask do_deploy_deb after do_temp_deploy before do_package_deb
addtask do_package_deb after do_deploy_deb before do_build
addtask do_deploy_wic_files after do_package_deb after do_build

According to problems I encountered, I will explain workaround-fixes I applied
to integrate efibootguard with swupdate using my special build pipeline steps:

* do_clean: It is advantegous that the tmp folder doesn't need to be cleaned
            everytime to save time during development.  do_clean just removes
            all the stamps in the stamp directory that bitbake creates and the
            content of the working directory. do_clean itself has a [nostamp]
            flag set so that it is always executed.

* do_install_build_deps: Problem was, that swupdate and efibootguard needed
            additional packages in the buildchroot, that was already finished.
            Thus, this task bind-mounts `/proc`, `/sys`, `/dev`, `/dev/pts` and
            takes care of proxy settings so that apt works inside buildchroot
            with chroot. This way, additional debian packages could be
            installed on requirement basis.

            ```
            apt-get update > ${PP}/isar_install_builddeps.log
            echo "Yes, do as I say!" | apt-get install --force-yes ${CUSTOM_BUILD_DEPS} > ${PP}/isar_install_builddeps.log
            ```

            Some deps required the ugly "Yes, do as I say!" override because
            apt refuses to alter the init system (which is not needed in
            buildchroot anyway.)

* do_configure: changes into ${WORKDIR}/git and configures the software
            according to its needs and copies a .config if needed.

* do_compile: changes into ${WORKDIR}/git and compiles by calling make

* do_build: EMPTY - since it was not clear what this step should do, however,
            this is the default bitbake target and I wanted software to build
            when I type 'bitbake efibootguard'. This should also be regarded
            like an 'all' make target. So every build specific task is executed
            before do_build.

* do_deploy_deb: copies files that are going to be in a binary debian package

* do_package_deb: builds the actual .deb package

* do_temp_deploy: This is an important part for cross-package dependencies...
             for example swupdate requires a library of efibootguard. This
             means, efibootguard must have executed this task before swupdate
             starts do_install_build_deps.

             in swupdate.bb:

             ```
             DEPENDS += "efibootguard"
             do_install_build_deps[deptask] = "do_temp_deploy"
             ```

             Now this task will put the needed library files into a temporary
             location, where swupdate can pick them up later.

* do_install and do_package both only return true

The following problem is unsolved:

* When a .deb package is created from swupdate, dependencies are set.
  do_populate_sysroot then fails, because dpkg cannot download aything.


Next problem is about communication between bitbake and wic. For efibootguard,
a special partition layout must be used and a .wks file is created for this.
However, the boot loader configuration is written by a wic source plugin,
because image specific options should be set in the .wks file.

wic:

* commit dd109de433577 in isar - "wic: Remove sysroot support" breaks wic such that:
        * command line option to specify location of native tools is not
          accepted anymore, although it is still mentioned in the help text of
          wic,
        * all native tools become host dependencies
        * wic has no possibility anymore to install native tools, since bitbake
          cannot or should not change host software (usually, if a tool
          is not found, bitbake tries to execute a recipe according to a
          hard coded map, which fails)
        * different wic source plugins may require different native tools and
          thus for different wic images different build environments must exist
          due to host dependencies.

Fact: there is no native-sysroot within isar build system, only a buildchroot
      that has the same architecture as the target platform.

Consider the following situation:

wic is used to create the bootable image.  The .wks file specifies the
parameters for the bootloader.  These parameters are used to write the
environment files for the config partitions (efibootguard).  These environment
files are generated by a wic plugin, that calls `bg_setenv`.

The problem here is, that `bg_setenv` must be a native utility. However, the
build-chroot cannot be used to install native utilities into the outer
environment. A special native root doesn't exist either. Thus, wic can never
call custom tools without emulation like binfmt.

I have patched wic so that it looks for binaries in /sbin and /bin of
the built root file system and the host.

*Note*: I regard my current implementation as a meta-step towards real
integration and will rebase my commits if the pipeline in isar can handle

* clearly defined names for the build pipeline tasks
* Cross dependencies between .deb packages that are compiled from sources, i.e.
  one source needs libs from the other source tools needed by wic source
  plugins (where are they, host / buildchroot)
* wic native_sysroot according to the point above
* build dependencies installable by every recipe according to its needs

Current state of my work is in:

https://github.com/andi8086/isar
branch `andreas/isar-patchset`

Kind regards
Andreas

-- 
Andreas Reichel
Dipl.-Phys. (Univ.)
Software Consultant

Andreas.Reichel@tngtech.com, +49-174-3180074
TNG Technology Consulting GmbH, Betastr. 13a, 85774 Unterfoehring
Geschaeftsfuehrer: Henrik Klagges, Dr. Robert Dahlke, Gerhard Mueller
Sitz: Unterfoehring * Amtsgericht Muenchen * HRB 135082


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: Analysis of isar: Current work of efibootguard / swupdate integration
  2017-09-21 14:18 Analysis of isar: Current work of efibootguard / swupdate integration Andreas Reichel
@ 2017-10-18 11:39 ` Alexander Smirnov
  0 siblings, 0 replies; 2+ messages in thread
From: Alexander Smirnov @ 2017-10-18 11:39 UTC (permalink / raw)
  To: Andreas Reichel; +Cc: isar-users

Hi Andreas,

On 09/21/2017 05:18 PM, Andreas Reichel wrote:
> # isar - integration of efibootguard and swupdate #
> 
> ## My analysis of the current status of isar ##
> 
> Consider the following situation:
> 
> efibootguard is compiled from sources, swupdate is compiled from sources, both are integrated into an isar image.
> 
> problem: there was no final/usable build pipeline for this, i.e. architecture of isar still under construction/discussion,
> thus I introduced the following pipeline-steps to be independent of the current work:
> 

I'd like to split Isar pipeline into the parts:
  - image creation
  - dpkg-buildpackage package creation
  - dpkg-deb package creation
  - filesystem packaging

These sets of tasks are currently used to build Isar pipeline.

Please correct me if I'm wrong, but what I see above:

  - You have several packages, each has its own recipe.
  - You need to compile this packages from source code.
  - The expected outcome is a set of binary *.deb packages.
  - This packages should be installed to target root filesystem.

I'm asking, because there is already hello application, that is built 
from sources, so you only need to create 'debian/*' files in your source 
code. This will be true way to integrate custom package to Isar, that is 
built from sources using auto-tools :-)

> * do_clean
> * do_install_build_deps
> * do_configure
> * do_compile
> * do_build
> * do_deploy_deb
> * do_package_deb
> * do_temp_deploy
> * do_deploy_wic_files
> 
> in the following order:
> 
> addtask do_install_build_deps before do_configure after do_unpack
> addtask do_compile before do_build
> addtask do_configure before do_compile after do_unpack
> addtask do_fetch before do_unpack
> addtask do_temp_deploy before do_build after do_compile
> addtask do_deploy_deb after do_temp_deploy before do_package_deb
> addtask do_package_deb after do_deploy_deb before do_build
> addtask do_deploy_wic_files after do_package_deb after do_build
> 
> According to problems I encountered, I will explain workaround-fixes I applied
> to integrate efibootguard with swupdate using my special build pipeline steps:
> 
> * do_clean: It is advantegous that the tmp folder doesn't need to be cleaned
>              everytime to save time during development.  do_clean just removes
>              all the stamps in the stamp directory that bitbake creates and the
>              content of the working directory. do_clean itself has a [nostamp]
>              flag set so that it is always executed.
> 
> * do_install_build_deps: Problem was, that swupdate and efibootguard needed
>              additional packages in the buildchroot, that was already finished.
>              Thus, this task bind-mounts `/proc`, `/sys`, `/dev`, `/dev/pts` and
>              takes care of proxy settings so that apt works inside buildchroot
>              with chroot. This way, additional debian packages could be
>              installed on requirement basis.
> 
>              ```
>              apt-get update > ${PP}/isar_install_builddeps.log
>              echo "Yes, do as I say!" | apt-get install --force-yes ${CUSTOM_BUILD_DEPS} > ${PP}/isar_install_builddeps.log
>              ```
> 
>              Some deps required the ugly "Yes, do as I say!" override because
>              apt refuses to alter the init system (which is not needed in
>              buildchroot anyway.)
> 
> * do_configure: changes into ${WORKDIR}/git and configures the software
>              according to its needs and copies a .config if needed.
> 
> * do_compile: changes into ${WORKDIR}/git and compiles by calling make
> 
> * do_build: EMPTY - since it was not clear what this step should do, however,
>              this is the default bitbake target and I wanted software to build
>              when I type 'bitbake efibootguard'. This should also be regarded
>              like an 'all' make target. So every build specific task is executed
>              before do_build.
> 
> * do_deploy_deb: copies files that are going to be in a binary debian package
> 
> * do_package_deb: builds the actual .deb package
> 
> * do_temp_deploy: This is an important part for cross-package dependencies...
>               for example swupdate requires a library of efibootguard. This
>               means, efibootguard must have executed this task before swupdate
>               starts do_install_build_deps.
> 
>               in swupdate.bb:
> 
>               ```
>               DEPENDS += "efibootguard"
>               do_install_build_deps[deptask] = "do_temp_deploy"
>               ```
> 
>               Now this task will put the needed library files into a temporary
>               location, where swupdate can pick them up later.
> 
> * do_install and do_package both only return true
> 
> The following problem is unsolved:
> 
> * When a .deb package is created from swupdate, dependencies are set.
>    do_populate_sysroot then fails, because dpkg cannot download aything.
> 
> 
> Next problem is about communication between bitbake and wic. For efibootguard,
> a special partition layout must be used and a .wks file is created for this.
> However, the boot loader configuration is written by a wic source plugin,
> because image specific options should be set in the .wks file.
> 
> wic:
> 
> * commit dd109de433577 in isar - "wic: Remove sysroot support" breaks wic such that:
>          * command line option to specify location of native tools is not
>            accepted anymore, although it is still mentioned in the help text of
>            wic,
>          * all native tools become host dependencies
>          * wic has no possibility anymore to install native tools, since bitbake
>            cannot or should not change host software (usually, if a tool
>            is not found, bitbake tries to execute a recipe according to a
>            hard coded map, which fails)
>          * different wic source plugins may require different native tools and
>            thus for different wic images different build environments must exist
>            due to host dependencies.
> 
> Fact: there is no native-sysroot within isar build system, only a buildchroot
>        that has the same architecture as the target platform.
> 
> Consider the following situation:
> 
> wic is used to create the bootable image.  The .wks file specifies the
> parameters for the bootloader.  These parameters are used to write the
> environment files for the config partitions (efibootguard).  These environment
> files are generated by a wic plugin, that calls `bg_setenv`.
> 

Is it generic tools that could be installed to host via apt-get?

> The problem here is, that `bg_setenv` must be a native utility. However, the
> build-chroot cannot be used to install native utilities into the outer
> environment. A special native root doesn't exist either. Thus, wic can never
> call custom tools without emulation like binfmt.
> 
> I have patched wic so that it looks for binaries in /sbin and /bin of
> the built root file system and the host.
> 
> *Note*: I regard my current implementation as a meta-step towards real
> integration and will rebase my commits if the pipeline in isar can handle
> 
> * clearly defined names for the build pipeline tasks
> * Cross dependencies between .deb packages that are compiled from sources, i.e.
>    one source needs libs from the other source tools needed by wic source
>    plugins (where are they, host / buildchroot)
> * wic native_sysroot according to the point above
> * build dependencies installable by every recipe according to its needs
> 
> Current state of my work is in:
> 
> https://github.com/andi8086/isar
> branch `andreas/isar-patchset`
> 
> Kind regards
> Andreas
> 
With best regards,
Alex

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2017-10-18 11:39 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-09-21 14:18 Analysis of isar: Current work of efibootguard / swupdate integration Andreas Reichel
2017-10-18 11:39 ` Alexander Smirnov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox