s6-linux-init: the s6-linux-init-telinit program
Keywords: s6 linux init administration root utilities telinit

s6-linux-init
Software
skarnet.org

# The `s6-linux-init-telinit` program

`s6-linux-init-telinit` changes runlevels, i.e. changes the system state. It is normally invoked as `/sbin/telinit` or just `init` with an argument.

## Interface

         s6-linux-init-telinit rl

- `s6-linux-init-telinit` may be called with the same options as `s6-linux-init`, but it ignores them all.
- It calls the runleveld local service with the rl argument. This local service executes the user-provided `runlevel` script, which changes the system state to the state described by rl.
- As a special case, if rl is `0` or `6`, `s6-linux-init-telinit` then executes into s6-linux-init-hpr with the `-p` or `-r` option respectively, for compatibility with sysvinit's 0 and 6 runlevels that respectively halt and reboot the machine.

## Exit codes

- 100: wrong usage
- 111: system call failed
- Else, `s6-linux-init-telinit` exits with the same exit code as the runlevel script called with the rl argument.
- If rl is 0 or 6, in case of success `s6-linux-init-telinit` exits 0, but the system shuts down immediately as it returns.

## Notes

- Traditional sysvinit only allows integer runlevels, from 0 to 6. More advanced service managers, like OpenRC or s6-rc, allow the admin to define alphanumerical runlevels, or states. `s6-linux-init-telinit` does not implement policy; it only makes sure the user-provided `runlevel` script is called with the rl argument, under a safe and reproducible environment. The `runlevel` script can then change the machine state as chosen by the user - typically by invoking the service manager.
- The `0` and `6` special case has been added because some legacy programs may assume that calling `init 0` and `init 6` respectively halt and reboot the system.
- The `s6-linux-init-telinit` binary is not meant to be called directly by administrators. Instead, after a s6-linux-init-maker invocation, the `bin/` subdirectory of the target will contain a `telinit` symlink to `s6-linux-init-telinit`. The `bin/` subdirectory should be copied by the administrator into `/sbin` for full interface compatibility with sysvinit.
- When the system is running inside a container (and the `-C` option has been given to s6-linux-init-maker), the runleveld service is not running, so `s6-linux-init-telinit` is not functional and the `runlevel` script is never invoked.