正确答案为使用systemctl list-units --type=target --state=active可查看当前实际运行模式,如multi-user.target或graphical.target;systemctl get-default仅显示默认启动目标,不反映实时状态。

Linux 已经没有传统意义上的“运行级别”了,systemd 用 target 替代它;直接看 systemctl get-default 和 systemctl list-units --type=target 就能知道当前系统实际在跑什么模式。
怎么查当前运行模式(不是 runlevel)
在 systemd 系统里,runlevel 命令只是个兼容性包装,输出的数字(比如 N 3)不反映真实状态,只表示历史映射关系。真正起作用的是 target。
-
systemctl get-default:查默认启动目标,比如graphical.target或multi-user.target -
systemctl list-units --type=target --state=active:列出当前**激活中**的 target,重点关注带active状态的那个(如multi-user.target),它才是当前运行模式的权威标识 -
ls -l /lib/systemd/system/runlevel*.target:能看到数字 runlevel 到 target 的软链映射,比如runlevel3.target → multi-user.target,这说明“3”只是别名,不是独立机制
为什么 runlevel 显示 N 3 却没进命令行?
常见于桌面环境误配或服务冲突。现象是:终端里执行 runlevel 返回 N 3,但 GUI 正常运行,systemctl status graphical.target 却显示 active。
- 根本原因:
runlevel只读取 /var/run/utmp 中的“上一次 init 调用参数”,而 systemd 不依赖这个字段做决策 - 典型诱因:
graphical.target依赖multi-user.target,所以后者必然 active,但前者才是主导模式;runlevel抓到的是依赖链里的中间态 - 验证方法:运行
systemctl list-dependencies --reverse multi-user.target,常能看到graphical.target在其中 —— 这说明它被更高层 target 拉起来了
切换运行模式必须用 systemctl isolate
init 3 或 telinit 5 在 systemd 系统里已失效(除非启用了 sysvinit 兼容层,但不推荐)。强行调用可能卡住或触发不可预期的服务启停。
- 安全切换命令:
systemctl isolate multi-user.target(进纯命令行)或systemctl isolate graphical.target(进桌面) - 注意:
isolate会停止所有不属于目标依赖树的服务,比start更彻底;不要在远程 SSH 会话里对graphical.target执行 isolate,否则图形会话可能断连 - 临时生效:加
--no-block避免命令阻塞,但不改变服务实际状态顺序
修改默认启动模式要改 target,不是编辑 /etc/inittab
/etc/inittab 在 CentOS/RHEL 7+、Ubuntu 16.04+ 等主流发行版中已被忽略。改它完全无效。
- 设默认命令行:
systemctl set-default multi-user.target - 设默认桌面:
systemctl set-default graphical.target - 执行后会自动创建 /etc/systemd/system/default.target 软链接,指向对应 target 文件
- 若 GRUB 启动时想临时覆盖,默认 target 仍有效;需在内核参数加
systemd.unit=multi-user.target(不是数字 3)
真正容易被忽略的是:target 之间不是互斥开关,而是依赖图谱。一个服务可能同时属于多个 target 的依赖链,isolate 的行为取决于整个依赖拓扑,而不是简单“切换数字”。盯着 runlevel 输出判断系统状态,等于看汽车仪表盘上的转速表判断油量。


















