Quickstart and FAQ for s6-linux-init


  1. Install all the s6-linux-init dependencies:
  2. Install s6-linux-init itself
  3. Save your old /sbin/init binary
  4. Save and remove your old /etc/s6-linux-init directory, if you have one
  5. Make sure you have a /run directory
  6. Write a machine initialization script in /etc/rc.init and a machine shutdown script in /etc/rc.shutdown. Make them executable.
  7. If, at shutdown time, you need to run a script before the supervision tree is torn down (for instance if you're using s6-rc and want to cleanly stop all your services), write that script in /etc/rc.tini.
  8. Check that your devtmpfs is automounted by your kernel at boot time. If it is not, add the -d 1 option to the s6-linux-init-maker command line below.
  9. As root, run:
         rm -rf /tmp/s6-linux-init /tmp/init
         s6-linux-init-maker /tmp/s6-linux-init
         mv /tmp/s6-linux-init /etc/
         ln -sf /etc/s6-linux-init/init /sbin/init 
  10. Reboot.
  11. Congratulations! your machine is now running a s6-based init system.
  12. To shut the machine down, use the s6-halt, s6-poweroff or s6-reboot command as appropriate.
  13. FAQ

    Why is it so complicated to use s6 as an init process? It's much simpler with runit.

    Yes, runit is simpler, because it provides a simple runit binary suitable as a /sbin/init program and calls scripts to handle the three stages of init. However, the runit design has a few perfectible points:

    Running a s6-based init addresses those issues:

    To sum up, a s6-based init is cleaner than a runit-based init; it's a bit more complex to set up, but it organizes the system in a better way, without using more resources. And the goal of s6-linux-init is to make the setup more accessible.

    My /etc/rc.init script is not printing anything!

    You probably gave the -r option to s6-linux-init-maker, and your /etc/rc.init's output is being logged into the /run/uncaught-logs directory instead of printed to /dev/console.

    I want to run s6 in a container, and I just want to log to stdout/stderr, without this tmpfs and /dev/console stuff and without having a catch-all logger inside the container. Is it possible ?

    Yes, it is possible, but then s6-linux-init may not be what you are looking for. For your case, it will be simpler to run s6-svscan directly!

    If you are using Docker, there is a s6-overlay project specifically made for integrating s6 into Docker images.