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

Gerrit Pape <pape@smarden.org>