Files
euri-iso/docs/s6.md
T

3.9 KiB

title, layout, parent, nav_order
title layout parent nav_order
S6 default Init Systems 4

S6

S6 is a process supervision suite designed for modularity, security, and performance. It's not just an init system — it's a full ecosystem of tools for service management (s6-rc), logging, and system initialization (s6-linux-init). Written by Laurent Bercot, it's the most technically sophisticated of the non-systemd inits.

S6 is actually three layers:

  1. s6 — core process supervision (svscan, supervise, svc)
  2. s6-rc — dependency-based service manager
  3. s6-linux-init — creates the /sbin/init binary

Philosophy

S6 takes the daemontools/runit model and extends it with:

  • Modularity — every piece is separate and replaceable
  • Security — services run with minimal privileges, no ambient authority
  • Performance — fully parallel startup, designed for speed
  • Reliability — automatic restart, logging, notification

Unlike runit, s6 has a real dependency-based service manager (s6-rc) with declarative service definitions. It's the closest you can get to systemd's feature set without the bloat.

Who uses it?

  • Artix Linux — available as an alternative init
  • Docker images — s6-overlay is popular for container supervision
  • Embedded systems, minimal Linux builds

How it works

  1. Kernel starts /sbin/init (created by s6-linux-init-maker)
  2. s6-linux-init mounts tmpfs, copies early services, execs into s6-svscan
  3. s6-svscan becomes PID 1 and starts the supervision tree
  4. rc.init script launches s6-rc with the default runlevel
  5. s6-rc resolves dependencies and starts services in order

Key concepts

Concept What it means
s6-svscan PID 1 — root of the supervision tree
s6-supervise Monitors one service directory, restarts on crash
s6-svc Control tool — send commands to services
s6-rc Dependency-based service manager (compiled database)
s6-log Built-in logging with auto-rotation
Service directories Like runit — each service is a directory with a run script
Compilation s6-rc compiles service definitions into a binary database

Basic commands

# Start a service
s6-svc -u /run/service/sshd

# Stop a service
s6-svc -d /run/service/sshd

# Restart a service
s6-svc -r /run/service/sshd

# Check status
s6-svc -a /run/service/sshd

# With s6-rc (service manager):
s6-rc -d change sshd    # start
s6-rc -d stop sshd      # stop
s6-rc -d status sshd    # status

Example service

/etc/s6/sv/sshd/run:

#!/bin/sh
exec /usr/bin/sshd -D

With s6-rc, you also need a service definition file:

/etc/s6/rc/sources/sshd/type:

oneshot

/etc/s6/rc/sources/sshd/up:

#!/bin/sh
s6-svc -u /run/service/sshd

Comparison with OpenRC

OpenRC S6
Service format Shell scripts run scripts + s6-rc definitions
Dependencies Manual (need/use) Automatic via s6-rc
Supervision No built-in Yes — full supervision tree
Logging syslog or separate Built-in per-service (s6-log)
Boot speed Fast Very fast
Complexity Low Medium-High
Flexibility Moderate Very high (modular)

When to use S6

S6 is suitable for advanced users who want full process supervision with dependency-based service management and per-service logging. It offers the most features of any non-systemd init but has a steeper learning curve than OpenRC or Runit.

Users who need supervision, logging, and dependency resolution without systemd will find S6 the most capable option. Users who prefer simplicity may prefer OpenRC or Dinit.

Learn more