人人都会AI编程

Target 运行级别与 SysV init 的区别

更新时间:2026-07-12

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 → 运行级别 0
  • rescue.target → 运行级别 1
  • multi-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 仍然保留了对传统运行级别的兼容命令(如 runlevelinit 命令的符号链接),但这些命令最终都会被转换为对 systemd target 的操作。

4. 实际使用提示
在日常管理中,你几乎可以直接把 target 当作运行级别来用,但背后运作完全是 systemd 式的高效和灵活。当需要临时进入单用户维护模式时,可以执行:

systemctl rescue

它等价于切换到 rescue.target。如果要彻底关机维护,则使用:

systemctl shutdown

正是这些改进,让系统启动更快、配置更清晰,故障排除也更加直观。