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

systemd 里没有 runlevel,但 runlevel 命令还能用?
能用,只是它现在是个兼容层包装:实际查的是 /proc/sys/kernel/bootloader 和 /etc/init.d/rc 的遗留逻辑,不是真实状态。systemd 真正管理启动目标的是 target 单元,比如 multi-user.target 或 graphical.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.target 和 graphical.target 的关键区别在哪
核心差异在是否自动拉起显示管理器(如 gdm3、sddm)和图形会话服务。两者都包含网络、ssh、日志等基础服务,但 graphical.target 是 multi-user.target 的扩展,多了图形栈依赖链。
参数差异体现在单元文件中:graphical.target 的 Wants= 包含 display-manager.service,而 multi-user.target 没有;同时,multi-user.target 的 Conflicts= 通常列出图形相关服务,确保隔离干净。
- 性能影响:启用
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.target 的 Conflicts= 列表是否包含 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默认仍启用网络,若需彻底断网,得额外 masksystemd-networkd.service或禁用对应 .wants 链接
target 的依赖关系不是扁平列表,而是 DAG 图;一个 target 是否真“生效”,取决于它的所有 Wants、Requires、Conflicts 是否被满足或解除——这点比 runlevel 复杂得多,也容易被忽略。