Linux runlevel 与 target 的使用方法

1次阅读

systemd 中 runlevel 命令仅是兼容层,实际状态由 target 单元(如 multi-user.target、graphical.target)决定;切换用 systemctl isolate,设默认用 set-default,runlevel 输出不反映真实激活目标。

Linux runlevel 与 target 的使用方法

systemd 里没有 runlevel,但 runlevel 命令还能用?

能用,只是它现在是个兼容层包装:实际查的是 /proc/sys/kernel/bootloader/etc/init.d/rc 的遗留逻辑,不是真实状态。systemd 真正管理启动目标的是 target 单元,比如 multi-user.targetgraphical.target

常见错误现象:runlevel 显示 N 3,但 systemctl get-default 返回 graphical.target —— 这说明系统已切到 systemd 模式,runlevel 输出只是历史映射(3→multi-user.target,5→graphical.target),不能反映当前激活的 target。

  • runlevel 命令只读取 /var/run/utmp 中的旧式记录,不参与运行时控制
  • 真正决定系统状态的是当前激活的 target,用 systemctl list-units --type=target --state=active 查最准
  • 修改默认启动目标,必须改 systemctl set-default,改 /etc/inittab/etc/init.d/rc 完全无效

怎么切换当前 target(类似传统 runlevel 切换)

systemctl isolate,不是 systemctl start —— 后者只启动目标本身,不停掉无关服务;isolate 才是“切换”,会终止不属于目标依赖集的所有服务。

使用场景:临时进命令行环境(比如图形界面卡死时)、调试服务依赖、避免 GUI 资源占用。

  • 切到无图形多用户模式:systemctl isolate multi-user.target
  • 切回图形界面:systemctl isolate graphical.target
  • 注意:isolate 不会改变默认启动目标,重启后仍按 get-default 结果加载
  • 如果 isolate 卡住,大概率是某个服务没正确声明 Conflicts=StopWhenUnneeded=,导致依赖清理失败

multi-user.targetgraphical.target 的关键区别在哪

核心差异在是否自动拉起显示管理器(如 gdm3sddm)和图形会话服务。两者都包含网络、ssh、日志等基础服务,但 graphical.targetmulti-user.target 的扩展,多了图形依赖链。

参数差异体现在单元文件中:graphical.targetWants= 包含 display-manager.service,而 multi-user.target 没有;同时,multi-user.targetConflicts= 通常列出图形相关服务,确保隔离干净。

  • 性能影响:启用 graphical.target 会多加载约 20–40 个额外 unit(取决于桌面环境),冷启动慢 3–8 秒
  • 兼容性:老脚本若硬编码 telinit 3,在纯 systemd 系统上会被重定向到 isolate multi-user.target,但行为不完全等价(比如不会触发 rc.local
  • 自定义 target 时,别直接 Wants= 图形服务,应继承 graphical.target 并覆盖所需部分

为什么 systemctl set-default rescue.target 启动后还是进图形界面

因为 rescue.target 被设计为“单用户维护模式”,但它默认不关闭图形服务——systemd 认为显示管理器属于“可选基础设施”,除非明确冲突或被 stop,否则继续运行。

真正生效的救援模式需要两步:设默认 target + 确保图形服务被正确 stop。常见错误是只改了 default,却没检查 rescue.targetConflicts= 列表是否包含 display-manager.service

  • 检查方法:systemctl show rescue.target | grep Conflicts,若没列出图形相关 service,就得手动加 Conflicts=display-manager.service gdm3.service sddm.service
  • 更稳妥做法:用 systemctl emergency 替代,它强制停所有非 essential unit(包括 display-manager),且不依赖 target 配置
  • 注意:rescue.target 默认仍启用网络,若需彻底断网,得额外 mask systemd-networkd.service 或禁用对应 .wants 链接

target 的依赖关系不是扁平列表,而是 DAG 图;一个 target 是否真“生效”,取决于它的所有 WantsRequiresConflicts 是否被满足或解除——这点比 runlevel 复杂得多,也容易被忽略。

text=ZqhQzanResources