May 25, 2006

Runit makes a speedy replacement for init

runit, a Unix init scheme with service supervision written by Gerrit Pape, is a complete replacement for SysVinit. Its key benefits include improved boot speed and ease of use. In the time that it takes you to read this article, you could move from init to runit.

In a recent article covering the use of cinit to implement a parallel boot process, I managed to turn a booting time of 2 minutes 54 seconds into 2 minutes 3 seconds -- a massive saving of 51 seconds. By converting the same Linux machine to runit, I was able to reduce booting time to 55 seconds. And as for ease of use, it took me two days of work to convert to using cinit, and only one hour to do the same with runit.

Moving from init to runit

Of course, runit's precise ease of use depends on the distro you're using. You'll find it either easy or very easy. If you use Debian then you just need to install the runit, runit-services, and runit-run packages. Even easier, just add the following line to /etc/apt/sources.list:

deb http://ftp.us.debian.org/debian unstable main non-free contrib

Then run:

sudo apt-get update
sudo apt-get install runit runit-services runit-run

Debian will handle all of the conversion from using init to using runit for you. However -- don't reboot yet! Before you do that you're going to have to tell the kernel to use runit instead of init. Edit /boot/grub/menu.lst, find the line that loads your Linux kernel, and make an addition to its end. For instance, on my system, I changed

kernel /boot/vmlinuz-2.4.27-2-386 root=/dev/hda1 ro

to

kernel /boot/vmlinuz-2.4.27-2-386 root=/dev/hda1 ro init=/sbin/runit-init

Now you can reboot and use runit for the first time by typing:

sudo runit-init 6

Not using Debian?

If you're not using Debian then you'll have to do a bit more work, but not much. Follow the instructions in the runit installation Web page, then move on to runit - replacing init. Once you have replaced init, make sure that you don't reboot until you've told LILO or GRUB that you're using runit now. If do reboot without having done that then you'll end up with a dead Linux box, and it'll be time to find your old installation disks.

When you reboot you'll be pleasantly surprised at how quickly the system comes back up, because you've only got a minimal system at the moment -- just the bare basics so that you can access your Linux box. You will want to start adding services to get your machine running exactly as you want. This is where it starts to get difficult. No, only joking -- this is where it remains really easy. If you're using the Debian installation then you've already got some key services waiting for you to start. Have a look in the /etc/sv directory:

$ ls -l /etc/sv
total 68
drwxr-xr-x  3 root root 4096 2006-04-24 16:15 apache
drwxr-xr-x  2 root root 4096 2006-04-24 16:15 cron
drwxr-xr-x  3 root root 4096 2006-04-24 16:15 dhclient
drwxr-xr-x  3 root root 4096 2006-04-24 16:15 dhcp
drwxr-xr-x  3 root root 4096 2006-04-24 16:15 exim
drwxr-xr-x  2 root root 4096 2006-04-24 16:15 gdm
drwxr-xr-x  2 root root 4096 2006-04-24 16:18 getty-1
drwxr-xr-x  2 root root 4096 2006-04-24 16:18 getty-2
drwxr-xr-x  2 root root 4096 2006-04-24 16:18 getty-3
drwxr-xr-x  2 root root 4096 2006-04-24 16:18 getty-4
drwxr-xr-x  2 root root 4096 2006-04-24 16:15 getty-5
drwxr-xr-x  3 root root 4096 2006-04-24 16:15 nfs-kernel-server
drwxr-xr-x  3 root root 4096 2006-04-24 16:15 portmap
drwxr-xr-x  2 root root 4096 2006-04-24 16:15 postfix
lrwxrwxrwx  1 root root   36 2006-04-24 16:15 README -> /usr/share/doc/runit-services/README
drwxr-xr-x  2 root root 4096 2006-04-24 16:15 squid
drwxr-xr-x  3 root root 4096 1999-10-20 01:12 ssh
drwxr-xr-x  2 root root 4096 2006-04-24 16:15 xdm

This directory contains one sub-directory for every service that is available, though not necessarily being used. To see the services that are actually being used, look in the directory /var/service:

$ ls -l /var/service/
total 0
lrwxrwxrwx  1 root root 15 2006-04-24 16:18 getty-1 -> /etc/sv/getty-1
lrwxrwxrwx  1 root root 15 2006-04-24 16:18 getty-2 -> /etc/sv/getty-2
lrwxrwxrwx  1 root root 15 2006-04-24 16:18 getty-3 -> /etc/sv/getty-3
lrwxrwxrwx  1 root root 15 2006-04-24 16:18 getty-4 -> /etc/sv/getty-4
lrwxrwxrwx  1 root root 15 2006-04-24 16:18 getty-5 -> /etc/sv/getty-5

If you want (for example) to start using SSH, you just need to add a link from /etc/sv/ssh to /var/service, as in:

sudo ln -s /etc/sv/ssh /var/service

Here's where you're can see that runit gives you full service supervision. There's no rebooting or manual starting of the service needed -- as soon as you add the link, runit starts the new service.

Adding a brand new service

Adding a new service is almost as easy. First of all you'll need a directory for it in /etc/sv. In that new directory you'll need an executable called run which should contain the instructions for starting the service. Finally, you will have to create a link from /var/service to your new service directory. And that's all there is to it. As a matter of interest, the runit Web site contains a whole host of example run scripts.

You may be surprised to learn that the addition of extra services has no real effect on the booting time. This is because the services are started in parallel.

We've seen that rebooting is a thing of the past with runit, but you may want to shut your Linux box down at some point. For this you'll need the command sudo /etc/runit/3.
Try not to blink or you'll miss the box shutting down -- it really is that fast.

Category:

  • Linux
Click Here!