Linux 系统中有一个传统概念叫“运行级别(runlevel)”,它定义了系统启动后进入的某种工作状态,比如单用户维护模式、多用户文本模式或图形界面模式。现代 Linux 发行版几乎都已从传统的 SysV init 迁移到 systemd 作为初始化系统,但运行级别的思想被保留并转化为 systemd 的 target 机制。它们在行为上相似,但底层设计和运作方式有本质区别。
1. SysV init 的运行级别
SysV init 是最早的 Unix 标准初始化系统,它使用编号 0 到 6 表示不同的运行级别:
- 0:关机
- 1:单用户模式(无需登录,root 权限,用于紧急修复)
- 2:多用户模式(无网络)
- 3:完整多用户模式(文本界面)
- 4:用户自定义
- 5:完整多用户模式(图形界面)
- 6:重启
切换运行级别用 init N 命令,例如 init 3 会切换到文本模式。运行时,SysV init 会按 /etc/inittab 配置和 /etc/rc.d/rc?.d/ 目录下的符号链接(以 S 或 K 开头)顺序启动或停止服务。每个服务的启动是串行的,且依赖关系必须通过链接序号(如 S10、S20)手动维护,这常常导致启动缓慢和脚本维护复杂。
2. systemd 的 Target
systemd 将运行级别的思想重新设计为 target 单元。一个 target 代表一组需要启动的服务单元,并且支持丰富的依赖关系。常见的 target 与 SysV 运行级别的对应关系如下:
poweroff.target→ 运行级别 0rescue.target→ 运行级别 1multi-user.target→ 运行级别 3(文本多用户)graphical.target→ 运行级别 5(图形多用户)reboot.target→ 运行级别 6
切换目标用 systemctl isolate 命令,比如切换到多用户模式:
systemctl isolate multi-user.target
查看当前默认目标(系统启动进入的目标):
systemctl get-default
设为图形界面启动:
systemctl set-default graphical.target
3. 核心区别
- 并行启动 vs 串行启动:SysV init 按脚本序号逐个执行,systemd 能自动解析 unit 之间的依赖关系,让无依赖的服务并行启动,显著加快系统引导速度。
- 静态顺序 vs 动态依赖:SysV 依赖手动维护的符号链接顺序(容易出错),systemd 在 unit 文件中用
Requires=、Wants=、After=等声明式语句定义关系,更精确且易于管理。 - 状态一致性:systemd 能跟踪每个服务的真实状态(是否成功启动、退出码等)并做出反应,而 SysV 脚本一旦执行完,init 进程就不再了解服务是否真的还在运行。
- 按需启动:systemd target 可以配合 socket、bus 等激活方式,在服务真正需要时才启动(例如连接到一个端口时才起服务),而 SysV 必须提前启动所有服务。
- 兼容性:systemd 仍然保留了对传统运行级别的兼容命令(如
runlevel或init命令的符号链接),但这些命令最终都会被转换为对 systemd target 的操作。
4. 实际使用提示
在日常管理中,你几乎可以直接把 target 当作运行级别来用,但背后运作完全是 systemd 式的高效和灵活。当需要临时进入单用户维护模式时,可以执行:
systemctl rescue
它等价于切换到 rescue.target。如果要彻底关机维护,则使用:
systemctl shutdown
正是这些改进,让系统启动更快、配置更清晰,故障排除也更加直观。