Re: s6-linux-init, alpine linux, and initramfs

From: Laurent Bercot <ska-skaware_at_skarnet.org>
Date: Mon, 30 Jan 2017 14:19:39 +0000

>2) have a very small init script to load the modules, mount the
>filesystems (/dev, /proc, /sys, /), and finally pivot-chroot into
>s6-linux-init phase 1. This would be less elegent but it might be
>easier to set up.

  This. If you need or want an initramfs, you need to comply with the
implicit initramfs contract: when you exec into /sbin/init, it must be
the only process running on your machine, just as if the kernel started
it; and any init system should be able to work, the initramfs should not
tie you to a specific init. So, spawning a supervision tree in the
initramfs is a no-no, because it breaks both aspects.

  You can see an initramfs as a mini-system that you set up to do what
needs to be done *and then tear down* before exec'ing into the real
system.
So, do that: load your modules, find your rootfs, pivot-chroot into it,
and start your real system with your init of choosing.

  Ideally, you'd even unmount /proc and /sys (which you likely need
during
your initramfs execution) before entering /sbin/init. But obviously
that's not practical since your boot sequence will mount then again
very soon, so the separation between "pre-init" and "post-init" can
be a bit less strict. You can document that the state of your system
at init time is "pristine as if the kernel had directly started init,
except that /proc and /sys are already mounted", for instance, and
that's acceptable. (/dev is not even a question - you should have a
devtmpfs mounted at boot anyway, and mount --move it after your
pivot_root.)

  But "after initramfs, I already have a supervision system and just
need to run the rest of the boot sequence" is not acceptable - if only
because you then need to keep supervision executables in RAM, and a
component of your pivoted initramfs in your PATH.

  Just make initramfs as transparent as possible, it's a lot cleaner.

  Oh, by the way, pivot_root works with initrd, but not initramfs: see
https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt
so you can use busybox/toybox's switch_root instead, or you can do the
switch_root by hand.

  I have a skeleton /init here that only needs in your initramfs:
  - empty /dev, /proc, /rootfs and /sys directories. OK if the kernel
mounts devtmpfs at boot (which it should).
  - a /sbin directory with a "mdev" static binary inside. (busybox with
only mdev selected will still be 100ish kB, that's unfortunately
normal.)
  - a /command directory with static cd, execlineb, export, foreground,
if, redirfd, s6-echo and s6-mount binaries inside. Also "define" for the
skeleton but you'd replace it with something else for your rootfs
detection.
  - whatever else you need to do your job - you could add modutils to
your
busybox build, for instance, if you want to load modules. You may want
a /etc/mdev.conf depending on the devices you're expecting to detect.
  - also execline, s6-portable-utils and s6-linux-utils binaries
accessible
in the /command directory of your real root filesystem.

  You can get it at http://pastebin.com/KZfdETy5
  My gzipped initramfs image made with that is about 104kB, for x86_64.

  HTH,

--
  Laurent
Received on Mon Jan 30 2017 - 14:19:39 UTC

This archive was generated by hypermail 2.3.0 : Sun May 09 2021 - 19:38:49 UTC