G. Pape
runit

# runit - runlevels

Prepare runit for using runlevels
Switching runlevels
Creating runlevels

### Prepare runit

If not yet done, configure your system to use runit as process no 1 by following the instructions.

Create the following directories and symbolic links:

     # mkdir -p /etc/runit/runsvdir/default
     # mkdir -p /etc/runit/runsvdir/single
     # ln -s /etc/sv/getty-5 /etc/runit/runsvdir/single/
     # ln -s default /etc/runit/runsvdir/current

Copy the contents of `/service/` to `/etc/runit/runsvdir/current/` and replace `/service/` with a symbolic link:

     # cp -pR /service/* /etc/runit/runsvdir/current/
     # mv -f /service /service.old && \
         ln -s /etc/runit/runsvdir/current /service

You have now created two runlevels: `default` and `single`. The `current` runlevel is `default`. It is safe to remove `/service.old/` if you don't need it anymore.

Finally edit `/etc/runit/2` to set the `default` runlevel when stage 2 starts:

     $ cat /etc/runit/2
     #!/bin/sh
     PATH=/command:/usr/local/bin:/usr/local/sbin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin

     runsvchdir default >/dev/null

     exec env - PATH=$PATH \
     runsvdir /service 'log: ...........................................................................................................................................................................................................................................................................................................................................................................................................'

### Switching runlevels

Switching runlevels with runit is done by switching the directory the runsvdir program is running in. This is done by the runsvchdir program, e.g. to switch to the `single` user runlevel, do:

     # runsvchdir single

To switch back to the `default` runlevel, do:

     # runsvchdir default

See the runsvdir program for a description of what happens when runsvdir sees the directory changed. Note that there is no guarantee that all services from the `previous` runlevel will stop, the runsv processes have sent the service daemons a SIGTERM and wait for them to terminate. You can check the status of the `previous` runlevel through `/etc/runit/runsvdir/previous/`.

### Creating new runlevels

To create a new runlevel, simply create a new directory in `/etc/runit/runsvdir/`. The name of the directory is the name of the new runlevel. The name must not start with a dot and must not be `current`, `current.new`, or `previous`, e.g.:

     # mkdir /etc/runit/runsvdir/maintenance

Add the services you want to run in the runlevel `maintenance` to the newly created directory, e.g.:

     # ln -s /etc/sv/getty-5 /etc/runit/runsvdir/maintenance/
     # ln -s /etc/sv/ssh /etc/runit/runsvdir/maintenance/
     # ln -s /etc/sv/dnscache /etc/runit/runsvdir/maintenance/

If you want to switch to the runlevel `maintenance`, do:

     # runsvchdir maintenance