Linux is a Unix-like operating system that can be used on a variety of platforms. It has many different runlevels, which are levels of operation that allow different parts of the system to run in different modes. There are three main types of Linux runlevels: normal, debug, and release. Normal runlevels are the most common and are used when you want to use the system as it is. Debug runlevels help with debugging problems and can be used when you want to test code or applications before they are released to the public. Release runlevels help with making changes to the system and may be used when there is a new version available or when there is a security update available. To set up a Linux system for use in one of these three modes, you first need to create a directory where your files will live. Then you need to create two files in that directory: an init file and a rc file. The init file contains information about how the system should be started up and how it should be managed. The rc file contains specific instructions about how the system should be managed, such as how applications should be started up or how passwords should be stored. To set up a Linux system for use in one of these three modes, you first need to create a directory where your files will live. Then you need to create two files in that directory: an init file and a rc file. The init file contains information about how the system should be started up and how it should be managed. The rc file contains specific instructions about how the system should be managed, such as how applications should be started up or how passwords should be stored.

Standard Runlevels

The Linux kernel defines seven standard runlevels. Individual operating system distributions may customise these runlevels or add additional ones. Users are also free to create and modify runlevels.

Runlevel 0 – No activity, equivalent to shutdown. The system is ready for a physical loss of power. Runlevel 1 – Running in single-user (rescue) mode. Runlevel 2 – Running in multi-user mode without networking and graphics. Runlevel 3 – Multi-user mode with the addition of networking support. Runlevel 4 – Left for users/distributions to define. Runlevel 5 – Multiple user mode with a graphical user interface. Runlevel 6 – System reboot mode.

Most Linux systems will boot into Runlevel 5. This is the runlevel you’re probably most familiar with. The broadest range of services are available, including a display server and full networking stack. If you’re on a headless server without a display stack, you might be in Runlevel 3.

Some single-user systems will start in Runlevel 1.. You’ll also encounter this runlevel if you use a recovery mode to rescue your system. This lets you obtain shell access without logging in as a regular user.

Runlevels 2, 3 and 4 can vary across distribution. Some distributions will create a clear distinction between each runlevel; in others, all three may have the same effect. Generally, you can expect any of these three to give you a single-user text shell with networking available.

Your system can only be in one runlevel at a time. A single runlevel will be selected after boot. You won’t transition been runlevels unless you explicitly initiate a change. Usually, the only runlevel transitions that occur are from levels 1-5 into level 0 or 6, when your system shuts down or reboots.

Higher runlevels indicate increasing levels of available functionality. This convention is followed by all distributions. A low runlevel usually means that only a subset of the system’s services are running.

Runlevels and Startup Services

Startup services are coupled to runlevels. Linux traditionally adds startup services to runlevels. When your system enters a runlevel, all the services associated with that level will be started.

The way in which services are actually handled depends on the service manager you’re using. Individual distributions ship with different service managers. The original service manager, init, defines its services within /etc/init.d. Scripts created here get symlinked into /etc/rc where they’re sorted by runlevel:

/etc/rc0. d – Scripts placed in here are executed by runlevel 0… /etc/rc1. d – Scripts for runlevel 1… /etc/rc2. d – …etc.

To add new startup services, create or edit a script in /etc/init.d:

Next, use chkconfig to enable the service:

The 345:respawn in the script line instructs init to run service_executable when the system enters runlevels 3, 4 or 5.

Many newer distributions have replaced init with more modern alternatives. These can provide a higher-level abstraction over runlevels and the init system.

The majority of Linux distributions, including Debian, Ubuntu, CentOS, Arch and Red Hat, now use systemd. This doesn’t reference runlevels directly; instead, they’re converted to “targets” which are identified by name. While Linux can only be in one runlevel at a time, systemd supports multiple concurrently active targets. The mapping between runlevels and targets is only approximate; it’s provided for compatibility purposes.

The special default target defines what the system will boot into. The default target is usually linked to the multi-user target – equivalent to a runlevel of 2 or higher. Each target’s services are stored in a “wants” directory. This will contain .service files. These are also symbolic links that point back to service definitions in /usr/lib/systemd/system.

This allows service definitions to be created once and shared with multiple “targets”. When Linux boots, systemd will select the target indicated by the runlevel. The services wanted by that target will then be loaded up. systemd supports service dependencies, so individual services can be made to wait on other services before they start.

Inspecting Your System’s Runlevel

You can find out your system’s runlevel using the runlevel command. This will print two characters to the terminal. They show your system’s previous and current runlevels.

N 5 is a typical output for a desktop Linux system. The 5 indicates you’re in a multi-user graphical session with networking available. N means the previous runlevel couldn’t be determined, usually because the system was shutdown.

On some systems, you may be able to get the current and previous runlevels using the $RUNLEVEL and $PREVLEVEL environment variables. If these variables are set, the runlevel command simply emits their values.

You can also inspect your current runlevel using the who command. Run who -r to see the runlevel number and the time at which the runlevel was entered.

Switching Between Runlevels

You can switch between runlevels using the telinit command. This lets you manually trigger different modes, such as single-user mode or rescue mode.

Running telinit 0 will shutdown your machine; telinit 6 should initiate a reboot. Using telinit with runlevels 1 – 5 will activate the corresponding operating mode. If you’re currently in text-only mode, telinit 5 will try to enable the display server and enter graphical mode.

When using systemd, the systemctl isolate command lets you activate a different “target”. All running services will be stopped; services associated with the new target then get started up.

Here’s how to activate the multi-user target:

If you want to make a permanent change to the runlevel, use the systemctl set-default command:

Now the multi-user target will be selected whenever your system reboots.

Summary

Linux runlevels describe different states within the operating system. Each runlevel layers additional functionality in the form of extra running services.

Low runlevels are commonly used for recovery modes and text-only operation. A desktop Linux system with a graphical environment will usually be in runlevel 5. You should check your distribution’s documentation for a detailed description of available runlevels, as implementations can vary.