linux中运行级别是sysv init的0–6数字状态,target是systemd的unit集合;二者功能相似但实现不同:systemd通过runlevel*.target链接到poweroff.target、rescue.target等实现兼容,并支持并行启动、依赖图解析和热切换。

Linux 的“运行级别”(Runlevel)是传统 SysV init 系统的概念,而 “target” 是 systemd 引入的替代机制;二者功能相似(定义系统启动后的状态),但实现方式、依赖管理和灵活性完全不同。systemd 并不兼容运行级别本身,而是通过 target 单位(unit)模拟其行为,并支持并行启动、按需激活、更细粒度的依赖控制。
运行级别(Runlevel)的本质
在 SysV init 中,运行级别是 0–6 的单个数字,代表系统所处的预设状态:
- 0:关机
- 1(或 s/S):单用户模式(维护用,无网络,无多用户服务)
- 2–5:多用户模式(不同发行版定义略有差异;Ubuntu 默认 2,RHEL/CentOS 默认 3 或 5)
- 6:重启
init 进程读取 /etc/inittab(已废弃)或硬编码逻辑,按运行级别启动对应目录(如 /etc/rc.d/rc3.d/)下的脚本,顺序执行(S 开头启动,K 开头停止),无依赖解析,易阻塞。
Target 是什么?与运行级别的映射关系
target 是 systemd 中的 unit 类型(文件后缀为 .target),本质是“一组被要求同时启动的 unit 集合”,不执行具体任务,只表达状态目标和依赖关系。systemd 通过 target 实现对传统运行级别的兼容性支持:
- runlevel0.target → 关机 → 链接到 poweroff.target
- runlevel1.target → 单用户 → 链接到 rescue.target
- runlevel3.target → 多用户无图形 → 链接到 multi-user.target
- runlevel5.target → 多用户带图形 → 链接到 graphical.target
- runlevel6.target → 重启 → 链接到 reboot.target
这些 runlevel*.target 文件通常只是符号链接,真实逻辑由 multi-user.target 或 graphical.target 等承载。查看当前 target:
systemctl get-default(默认启动目标)
systemctl list-units --type=target(列出所有 active target)
关键区别:启动机制与依赖管理
systemd 启动不是线性执行脚本,而是基于声明式依赖图(dependency graph)并发启动 unit:
- 每个 service、socket、mount、target 都在 unit 文件中明确声明 WantedBy=、Requires=、After= 等字段
- systemd 解析全部 unit 后构建启动顺序,自动并行启动无依赖冲突的服务(例如 network.target 可被多个服务同时依赖,无需排队)
- target 本身可被其它 unit 依赖(如 sshd.service 的 WantedBy=multi-user.target),也可包含 Conflicts=、AllowIsolate=yes 等高级控制
- 运行级别无法动态切换状态(如从 3 切到 5 需重启显示管理器),而 target 支持热切换:sudo systemctl isolate graphical.target
实际使用建议
日常运维应直接操作 target,而非运行级别命令:
- 设默认启动目标:sudo systemctl set-default graphical.target
- 临时切换(不改默认):sudo systemctl isolate multi-user.target
- 查看某 target 拉起哪些服务:systemctl list-dependencies --reverse multi-user.target
- 禁用某个服务在 multi-user.target 下启动:sudo systemctl disable httpd.service(它会移除 /etc/systemd/system/multi-user.target.wants/httpd.service 链接)
遗留的 telinit 3 或 init 5 命令仍可用,是因为 systemd 提供了兼容 wrapper,底层仍转为调用对应 target。










