>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