linux运行级别用于定义系统启动后的工作状态,不同运行级别对应不同的服务集合,比如单用户模式、多用户图形模式等。运行级别的定义文件会随着系统使用的初始化系统不同而产生差异,目前主流的linux发行版大多采用systemd作为初始化系统,部分老旧系统仍使用sysvinit。

sysvinit系统下的运行级别定义文件
使用sysvinit作为初始化系统的linux发行版,运行级别的核心定义文件是/etc/inittab。这个文件是sysvinit初始化进程的主配置文件,里面包含了运行级别的默认设置、不同运行级别对应的操作等内容。
我们可以通过查看/etc/inittab文件的内容来了解运行级别的定义,以下是该文件中常见的运行级别相关配置示例:
# 默认运行级别设置,id后面的数字就是默认启动的运行级别 id:5:initdefault: # 不同运行级别对应的系统初始化脚本路径 si::sysinit:/etc/init.d/rcS l0:0:wait:/etc/init.d/rc 0 l1:1:wait:/etc/init.d/rc 1 l2:2:wait:/etc/init.d/rc 2 l3:3:wait:/etc/init.d/rc 3 l4:4:wait:/etc/init.d/rc 4 l5:5:wait:/etc/init.d/rc 5 l6:6:wait:/etc/init.d/rc 6
上述配置中,initdefault行指定了系统默认的启动运行级别,后面的l0到l6分别对应0到6这7个标准运行级别,每个运行级别会执行对应路径下的初始化脚本。
systemd系统下的运行级别定义文件
目前大多数主流linux发行版(如CentOS 7及以上、Ubuntu 16.04及以上)都使用systemd作为初始化系统,systemd不再使用/etc/inittab文件来定义运行级别,而是用target单元来替代运行级别的概念,运行级别和target的对应关系定义在systemd的相关配置中。
systemd中运行级别对应的target文件存放在/lib/systemd/system/目录下,文件名格式为runlevelX.target,其中X是运行级别的数字。我们可以通过以下命令查看所有运行级别对应的target文件:
ls /lib/systemd/system/runlevel*.target
执行上述命令后可以看到类似如下的输出:
/lib/systemd/system/runlevel0.target /lib/systemd/system/runlevel1.target /lib/systemd/system/runlevel2.target /lib/systemd/system/runlevel3.target /lib/systemd/system/runlevel4.target /lib/systemd/system/runlevel5.target /lib/systemd/system/runlevel6.target
这些target文件是软链接,指向对应的系统状态target,比如runlevel3.target通常软链接到multi-user.target,runlevel5.target通常软链接到graphical.target。
如果要查看当前系统默认的运行级别(即默认启动的target),可以使用以下命令:
systemctl get-default
如果需要修改默认运行级别,可以使用systemctl set-default命令,比如设置默认启动为多用户模式(对应运行级别3):
systemctl set-default multi-user.target
两种初始化系统的运行级别对应关系
无论是sysvinit还是systemd,标准运行级别的含义是一致的,两者的对应关系如下表所示:
| 运行级别 | sysvinit含义 | systemd对应target |
|---|---|---|
| 0 | 系统关机 | poweroff.target |
| 1 | 单用户模式,仅root用户可登录,用于系统维护 | rescue.target |
| 2 | 多用户模式,无网络文件系统 | multi-user.target |
| 3 | 完整的多用户模式,命令行界面 | multi-user.target |
| 4 | 保留的运行级别,用户可自定义 | multi-user.target |
| 5 | 多用户图形界面模式 | graphical.target |
| 6 | 系统重启 | reboot.target |
如何判断当前系统使用的初始化系统
如果不确定自己的linux系统使用的是sysvinit还是systemd,可以通过以下方法判断:
- 查看
/proc/1/comm文件的内容,如果输出是systemd,则使用systemd初始化系统;如果输出是init,则使用sysvinit系统。 - 执行
systemctl --version命令,如果命令存在且能正常输出版本信息,说明使用systemd;如果提示命令不存在,则大概率使用sysvinit。
判断出初始化系统类型后,就可以对应找到运行级别的定义文件,进行相关的配置调整。