在 CentOS 7 里,修改默认运行级别不用再去动 systemctl set-default,原因很简单:/etc/inittab 这套方式已经被 systemd 弃用了,继续改基本不会生效。现在的“运行级别”实际上是用 target 来对应的,其中 multi-user.target 大致等同于 runlevel 3,graphical.target 则基本对应 runlevel 5。

CentOS 7 修改默认运行级别,只用 systemctl set-default 就够了,其他方式要么多余、要么容易出错。
为什么不能改 /etc/inittab?
原因很直接:在 CentOS 7 里,这个文件已经被 systemd 彻底废弃了。打开后基本只会看到这样一行注释:# inittab is no longer used when using systemd.。也就是说,不管怎么改它,比如把 id:3:initdefault: 这类内容改来改去,实际上都不会生效,系统启动时压根不会去读取这个文件。
/etc/inittab是 sysvinit 时代的遗留物,CentOS 7 起全部由 systemd 管理- 运行级别(runlevel)概念被 target 取代:
multi-user.target≈ runlevel 3,graphical.target≈ runlevel 5 - 强行编辑或软链
/etc/inittab不仅没用,还可能干扰运维排查逻辑
systemctl set-default 怎么用才可靠?
这是唯一推荐的永久生效方式,它会自动更新 /etc/systemd/system/default.target 的软链接指向,并确保下次启动生效。
- 设为命令行模式(类 runlevel 3):
sudo systemctl set-default multi-user.target - 设为图形界面(类 runlevel 5):
sudo systemctl set-default graphical.target - 执行后立刻验证:
systemctl get-default—— 输出应与你设置的目标一致 - 注意:该命令不重启系统,仅修改默认行为;需重启后才真正生效
别手动 ln -sf /etc/systemd/system/default.target
虽然技术上可行,但绕过 systemctl set-default 直接操作软链接,容易踩三个坑:
- 路径写错:目标文件在
/usr/lib/systemd/system/或/lib/systemd/system/(两者通常等价,但硬编码易出错) - 权限遗漏:必须用
sudo,否则ln -sf失败且无提示 - 残留旧链接:如果之前用
set-default设过,再手动覆盖会导致systemctl get-default显示与实际链接不一致(systemd 缓存或解析逻辑冲突)
临时切换和永久修改别混淆
systemctl isolate 和 init 命令只能临时切换当前 session,重启即失效,不是“修改运行级别”的解法。
- 临时进命令行:
sudo systemctl isolate multi-user.target或sudo init 3 - 临时进图形界面:
sudo systemctl isolate graphical.target或sudo init 5 - 这些不影响开机行为,也不改变
systemctl get-default输出 - 服务器场景下常有人误以为
init 3就是“改了默认级别”,结果一重启又回到 GUI
最常被忽略的点:改完必须重启才能验证是否真正生效;systemctl get-default 显示正确 ≠ 下次开机就是这个 target —— 因为内核参数或 GRUB 配置(如 systemd.unit=)仍可能强制覆盖 default.target。