When a Linux system boots, it enters its default runlevel and runs
the startup scripts associated with that runlevel. You can also switch
between runlevels – for example, there’s a runlevel designed for
recovery and maintenance operations.
Traditionally, Linux used System V-style init scripts – while new
init systems will eventually obsolete traditional runlevels, they
haven’t yet. For example, Ubuntu’s Upstart system still uses traditional
System V-style scripts.
What’s a Runlevel?
When a Linux system boots, it launches the
init processes.
init is responsible for launching the other processes on the system.
For example, when you start your Linux computer, the kernel starts init,
and init executes the startup scripts to initialize your hardware,
bring up networking, start your graphical desktop.
However, there isn’t just one single set of startup scripts init
executes. There are multiple run levels with their own startup scripts –
for example, one runlevel may bring up networking and launch the
graphical desktop, while another runlevel may leave networking disabled
and skip the graphical desktop. This means you can drop from “graphical
desktop mode” to “text console mode without networking” with a single
command, without manually starting and stopping different services.
More specifically, init runs the scripts located in a specific
directory that corresponds to the runlevel. For example, when you enter
runlevel 3 on Ubuntu, init runs the scripts located in the /etc/rc3.d
directory.
At least, this is how it works with a traditional System V init
system – Linux distributions are beginning to replace the old System V
init system. While Ubuntu’s Upstart currently maintains compatibility
with SysV init scripts, this is likely to change in the future.
The Runlevels
Some runlevels are standard between Linux distributions, while some runlevels vary from distribution to distribution.
The following runlevels are standard:
- 0 – Halt (Shuts down the system.)
- 1 – Single User Mode (The system boots into
superuser mode without starting daemons or networking. Ideal for booting
into a recovery or diagnostics environment.)
- 6 – Reboot
Runlevels 2-5 vary depending on distribution. For example, on Ubuntu
and Debian, runlevels 2-5 are the same and provide a full multi-user
mode with networking and graphical login. On Fedora and Red Hat,
runlevel 2 provides multi-user mode without networking (console login
only), runlevel 3 provides multi-user mode with networking (console
login only), runlevel 4 is unused, and runlevel 5 provides multi-user
mode with networking and graphical login.
Switching to a Different Runlevel
To switch to a different runlevel while the system is already running, use the following command:
sudo telinit #
Replace # with the number of the runlevel you want to switch to. Omit
sudo and run the command as root if you’re running a distribution that
doesn’t use sudo.
Booting Directly to a Specific Runlevel
You can select a runlevel to boot into from the boot loader – Grub,
for example. At the start of the boot process, press a key to access
Grub, select your boot entry, and press e to edit it.
You can add
single to the end of the
linux
line to enter the single-user runlevel (runlevel 1). (Press Ctrl+x to
boot after.) This is the same as the recovery mode option in Grub.
Traditionally, you could specify a number as a kernel parameter and you’d boot to that runlevel – for example, using
3 instead of
single
to boot to runlevel 3. However, this doesn’t appear to work on the
latest versions of Ubuntu – Upstart doesn’t seem to allow it. Similarly,
how you change the default runlevel will depend on your distribution.
While Ubuntu’s Upstart daemon still emulates the SystemV init system,
much of this information will change in the future. For example,
Upstart is event-based – it can stop and start services when events
occur (for example, a service could start when a hardware device is
connected to the system and stop when the device is removed.) Fedora
also has its own successor to init, systemd.