[Buildroot] [PATCH 00/20] system: properly handle systemd as init system

Andrey Yurovsky yurovsky at gmail.com
Wed Jul 19 20:14:58 UTC 2017


On Tue, Jul 18, 2017 at 10:25 AM, Yann E. MORIN <yann.morin.1998 at free.fr> wrote:
> Hello All!
>
> This series is a proposal to fix our handling of systemd as an init
> system.
>
> Our default skeleton is not well suited for systemd:
>
>   - we have /var/log a symlink to /tmp/log, but the way systemd starts
>     hides the journals:
>     - start systemd-journald, stores journals in /tmp/log/ (because of
>       the redirection above)
>     - mounts a tmpfs over /tmp, thus hidding the journals.
>
>   - on a read-only rootfs, systemd expects /var to be read-write, which
>     we do not provide.
>
> All of this sounds trivial, but fixing it is definitely not.
>
> The overall idea is that we need different skeletons, one for each type
> of init systems: sysv, systemd, others (aka custom).
>
> The skeleton package becomes a virtual package, that is provided by one
> of four implementations:
>
>   - skeleton-sysv or skeleton-systemd, as their names imply, for either
>     SysV- or systemd-based systems, and which depend on skeleton-common;
>
>   - skeleton-common, that provides base files and directories comon to
>     all skeletons (except custom, below); skeleton-common is also a
>     provider for the skeleton virtual package, for use with no-init (aka
>     custom init) systems;
>
>   - skeleton-custom, for user-provided custom skeleton, and of which we
>     expect it is fully prepared; skeleton-custom does not depend on
>     skeleton-common.
>
> A series of runtime tests have also been added, running on the QEMU
> vexpress:
>
>     init system         rootfs      DHCP?
>     -------------------------------------
>     busybox             ext4        no
>     busybox             ext4        eth0
>     busybox             squashfs    no
>     busybox             squashfs    eth0
>   * systemd-ifupdown    ext4        eth0
>     systemd-ifupdown    squashfs    eth0
>  ** systemd-networkd    ext4        eth0
>     systemd-networkd    squashfs    eth0
> *** systemd-full        ext4        eth0
>     systemd-full        squashfs    eth0
>   + no-init             squashfs    no
>
>     *   systemd-networkd: only what gets selected automatically when
>         systemd is used as init system, with all other options unset;
>
>     **  systemd-ifupdown: like systemd-networkd, but with networkd
>         disabled, thus using ifupdown instead;
>
>     *** systemd-full: all systemd options enabled, implies networkd;
>
>     +   a shell is launched as init
>
> Those new tests are not exhaustive, especially the systemd one; instead,
> they just test basic features: what init is being used, and did we get
> an IP adress for eth0? More tests can be added later on.
>
> Changes v2 -> v3:
>   - too much to note, mostly rewriten from scratch
>
> Changes v1 -> v2:
>   - enhance the commit logs
>
>
> Regards,
> Yann E. MORIN.
>
>
> The following changes since commit bc801efacb298e2297024f83e960eaf8a45dd39f
>
>   python-coherence: bump to the latest upstream commit (2017-07-17 11:28:58 +0200)
>
>
> are available in the git repository at:
>
>   git://git.buildroot.org/~ymorin/git/buildroot.git
>
> for you to fetch changes up to 95f6965c48dbf2f754818e2bec1f2d3891015475
>
>   support/testing: add runtime testing for init systems (2017-07-18 18:59:05 +0200)
>
>
> ----------------------------------------------------------------
> Yann E. MORIN (20):
>       support/tests: allow properly indented config fragment
>       core/pkg-generic: add variable to skip skeleton dependency
>       package/skeleton: add macro to rsync skeleton directory
>       package/skeleton: make SKELETON_LIB_SYMLINK a macro
>       system: provide package-wide system variables and macros
>       system: move setting getty to the corresponding init systems
>       system: move remounting / to the corresponding init systems
>       system: with no init system, only allow custom skeleton
>       package/skeleton: drop dependency on host-mkpasswd
>       package/skeleton: select it rather than default to y
>       package/skeleton: split out into skeleton-custom
>       package/skeleton: split out into skeleton-common
>       package/skeleton: make it a virtual package
>       package/skeleton-common: simplify staging install
>       package/skeleton: introduce sysv- and systemd-specific skeletons
>       system: separate sysv and systemd parts of the skeleton
>       sytem: no-init systems may use our default, common skeleton
>       fs: add pre- and post-command hooks
>       system: make systemd work on a read-only rootfs
>       support/testing: add runtime testing for init systems
>
>  Makefile                                           |   1 +
>  fs/common.mk                                       |   4 +
>  package/Config.in                                  |   4 +
>  package/busybox/busybox.mk                         |  15 +-
>  package/pkg-generic.mk                             |  11 +-
>  package/skeleton-common/Config.in                  |  31 ++++
>  package/skeleton-common/skeleton-common.mk         |  92 +++++++++
>  package/skeleton-custom/Config.in                  |   6 +
>  package/skeleton-custom/skeleton-custom.mk         | 107 +++++++++++
>  package/skeleton-systemd/Config.in                 |   7 +
>  package/skeleton-systemd/skeleton-systemd.mk       |  71 +++++++
>  package/skeleton-sysv/Config.in                    |   7 +
>  package/skeleton-sysv/skeleton-sysv.mk             |  22 +++
>  {system => package/skeleton-sysv}/skeleton/dev/log |   0
>  .../skeleton-sysv}/skeleton/dev/pts/.empty         |   0
>  .../skeleton-sysv}/skeleton/dev/shm/.empty         |   0
>  .../skeleton-sysv}/skeleton/etc/fstab              |   0
>  .../skeleton-sysv}/skeleton/var/cache              |   0
>  .../skeleton-sysv}/skeleton/var/lib/misc           |   0
>  .../skeleton-sysv}/skeleton/var/lock               |   0
>  {system => package/skeleton-sysv}/skeleton/var/log |   0
>  {system => package/skeleton-sysv}/skeleton/var/run |   0
>  .../skeleton-sysv}/skeleton/var/spool              |   0
>  {system => package/skeleton-sysv}/skeleton/var/tmp |   0
>  package/skeleton/Config.in                         |   8 +-
>  package/skeleton/skeleton.mk                       | 206 +--------------------
>  package/sysvinit/sysvinit.mk                       |  11 ++
>  support/testing/infra/builder.py                   |   3 +-
>  .../testing/tests/init/__init__.py                 |   0
>  support/testing/tests/init/base.py                 |  47 +++++
>  support/testing/tests/init/test_busybox.py         |  67 +++++++
>  support/testing/tests/init/test_none.py            |  32 ++++
>  support/testing/tests/init/test_systemd.py         | 145 +++++++++++++++
>  system/Config.in                                   |  13 +-
>  system/skeleton/dev/{pts => }/.empty               |   0
>  system/system.mk                                   |  88 +++++++++
>  36 files changed, 787 insertions(+), 211 deletions(-)
>  create mode 100644 package/skeleton-common/Config.in
>  create mode 100644 package/skeleton-common/skeleton-common.mk
>  create mode 100644 package/skeleton-custom/Config.in
>  create mode 100644 package/skeleton-custom/skeleton-custom.mk
>  create mode 100644 package/skeleton-systemd/Config.in
>  create mode 100644 package/skeleton-systemd/skeleton-systemd.mk
>  create mode 100644 package/skeleton-sysv/Config.in
>  create mode 100644 package/skeleton-sysv/skeleton-sysv.mk
>  rename {system => package/skeleton-sysv}/skeleton/dev/log (100%)
>  copy {system => package/skeleton-sysv}/skeleton/dev/pts/.empty (100%)
>  rename {system => package/skeleton-sysv}/skeleton/dev/shm/.empty (100%)
>  rename {system => package/skeleton-sysv}/skeleton/etc/fstab (100%)
>  rename {system => package/skeleton-sysv}/skeleton/var/cache (100%)
>  rename {system => package/skeleton-sysv}/skeleton/var/lib/misc (100%)
>  rename {system => package/skeleton-sysv}/skeleton/var/lock (100%)
>  rename {system => package/skeleton-sysv}/skeleton/var/log (100%)
>  rename {system => package/skeleton-sysv}/skeleton/var/run (100%)
>  rename {system => package/skeleton-sysv}/skeleton/var/spool (100%)
>  rename {system => package/skeleton-sysv}/skeleton/var/tmp (100%)
>  copy system/skeleton/dev/pts/.empty => support/testing/tests/init/__init__.py (100%)
>  create mode 100644 support/testing/tests/init/base.py
>  create mode 100644 support/testing/tests/init/test_busybox.py
>  create mode 100644 support/testing/tests/init/test_none.py
>  create mode 100644 support/testing/tests/init/test_systemd.py
>  rename system/skeleton/dev/{pts => }/.empty (100%)
>  create mode 100644 system/system.mk
>
> --
> .-----------------.--------------------.------------------.--------------------.
> |  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
> | +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
> | +33 223 225 172 `------------.-------:  X  AGAINST      |  \e/  There is no  |
> | http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
> '------------------------------^-------^------------------^--------------------'
> _______________________________________________
> buildroot mailing list
> buildroot at busybox.net
> http://lists.busybox.net/mailman/listinfo/buildroot

For what it's worth,

Tested-by: Andrey Yurovsky <yurovsky at gmail.com>

using some in-house configs (armv5 and armv7) with and without
systemd-networkd, verified journald functionality and the state of
/var and so on.


More information about the buildroot mailing list