Linux命令-runlevel(显示当前与上次系统运行级别) # Linux命令-runlevel显示当前与上次系统运行级别 简介 语法⚙️ 选项 实战示例示例 1基本用法 - 解读输出示例 2切级别后观察输出变化示例 3与 who -r 等价性验证示例 4开机启动级别与 /etc/inittab 的关系示例 5服务器切换到多用户模式无图形示例 6脚本中判断当前运行级别示例 7模拟实现原理深入理解⚠️ 注意事项 总结 相关命令快速参考runlevel命令读取/var/run/utmp文件输出两个字符上次运行级别和当前运行级别。它源自 SysVinit 系统在现代 systemd 系统中已被systemctl get-default/who -r取代但由于历史脚本和/var/run/utmp的兼容性需要依然保留至今。理解运行级别概念对阅读老系统配置、维护旧服务器仍有意义。提示在 CentOS 6 / RHEL 6 之前的系统runlevel是核心命令RHEL 7 / Ubuntu 16.04 已切换到 systemd target但runlevel命令依然可用由 systemd-compat 包提供。 简介项目说明命令类型极简查询命令无参数仅读文件数据源/var/run/utmp二进制的用户登录记录由 init/login 维护退出码0成功1错误输出格式上次 当前两个字符现代替代systemctl get-default、systemctl list-units --typetarget、who -r所属包util-linux所有系统默认安装用户权限普通用户即可旧系统重要性极高是/etc/rc?.d/启动脚本选择的核心依据运行级别Run Level基础级别SysV 含义systemd Target0关机haltpoweroff.target1单用户模式救援rescue.target2多用户无网络Debian 启用网络multi-user.target3多用户文本模式有网络multi-user.target4未定义用户可自定义无5多用户图形模式X11graphical.target6重启reboot.target-启动中-重要差异Debian/Ubuntu 的2 级 3 级都启用网络这是 Debian 系与 RedHat 系的传统分歧。CentOS 的 2 级几乎不用。 语法runlevel[选项]⚙️ 选项选项简写说明--help-h帮助--version-V打印版本util-linux 版本(无参数)输出两个字符上次运行级别、当前运行级别 实战示例示例 1基本用法 - 解读输出# CentOS 7 / Ubuntu 16.04 系统中$ runlevel N5# ↑ ↑# | └─ 当前运行级别 5图形模式# └─── N None上一次启动**未切换**过运行级别开机直接进入的 5输出字符对照表输出第 1 位含义NNone从开机到当前从未切换过运行级别0~6之前所在的运行级别输出第 2 位当前含义值含义0关机系统不会在此级别停留仅过渡1单用户/救援模式2多用户无网络RHEL多用户文本Debian3多用户文本模式命令行服务器常用5多用户图形模式桌面6重启不会停留S/s单用户模式开机早期示例 2切级别后观察输出变化# 场景图形模式5下切到文本模式3# 当前$ runlevel N5# 切到级别 3$sudoinit3# 屏幕会从 X11 切到字符终端# 或 systemctl isolate multi-user.target# 切完再查$ runlevel53# ↑ ↑# | └─ 当前 3# └─── 上次 5# 完美记录了从 5 切到 3的过程# 切回 5$sudoinit5$ runlevel35细节init是 SysV 切换命令systemd 下被systemctl isolate TARGET完全兼容。reboot同样会更新 utmp。示例 3与 who -r 等价性验证# who -r 输出更详细本质同源$who-rrun-level52024-01-15 09:00:15# 字段run-level 当前级别、切换时间戳# 比较$ runlevel N5# systemd 系统使用 systemctl get-default$ systemctl get-default graphical.target# 设置默认启动级别重启生效$sudosystemctl set-default multi-user.target Removed symlink /etc/systemd/system/default.target. Created symlink /etc/systemd/system/default.target → /usr/lib/systemd/system/multi-user.target. $ systemctl get-default multi-user.target# 切回图形重启生效$sudosystemctl set-default graphical.target示例 4开机启动级别与 /etc/inittab 的关系# CentOS 6 及更早版本编辑 /etc/inittab$cat/etc/inittab# inittab is no longer used.## ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.## Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target## systemd uses targets instead of runlevels. By default, there are two main targets:## multi-user.target: analogous to runlevel 3# graphical.target: analogous to runlevel 5## To view current default target, run:# systemctl get-default## To set a default target, run:# systemctl set-default TARGET.target# RHEL 7 把 /etc/inittab 改成了提示文档硬编码的 id:5:initdefault: 不再生效# Ubuntu 16.04 替代$cat/etc/init/rc-sysinit.conf# 启动级别被 systemd 接管# 查看历史 init 配置如果残留$ls/etc/init.d/# SysV 服务脚本$ls/etc/rc3.d/# 级别 3 的服务符号链接S/K 开头的软链$ls/etc/rc5.d/示例 5服务器切换到多用户模式无图形# 场景服务器装好图形界面后想关掉图形节省内存# CentOS 7# 当前默认启动是 graphical.target$ systemctl get-default graphical.target $ runlevel N5# 切到 multi-user 模式即传统运行级别 3$sudosystemctl set-default multi-user.target $sudosystemctl isolate multi-user.target# 系统会从 X11 退出回到字符终端登录界面# 立即生效并设置下次启动也是文本模式$ runlevel53$ systemctl get-default multi-user.target# 内存释放图形界面相关的 gdm/Xorg 进程消失$psaux|grep-Egdm|Xorg|grep-vgrep# 空$free-htotal usedfreeshared buff/cache available Mem:7.7G 680M6.5G 11M 540M6.9G# 节省约 200-500MB 内存视桌面环境示例 6脚本中判断当前运行级别# 场景启动脚本仅在多用户模式3 或 5下运行#!/bin/bash# /opt/scripts/check-runlevel.sh# 读取当前运行级别第 2 个字符LEVEL$(runlevel|awk{print $2})case$LEVELin3)echo多用户文本模式# 启动服务端服务;;5)echo多用户图形模式# 启动桌面应用;;1|S)echo单用户/救援模式exit0# 救援模式不启动业务;;*)echo未知级别:$LEVELexit1;;esac# 另一种 systemd 写法更现代# TARGET$(systemctl get-default)# case $TARGET in# multi-user.target) ... ;;# graphical.target) ... ;;# esac示例 7模拟实现原理深入理解# runlevel 实际读取 /var/run/utmp结构体记录# 可用 dump-utmp / utmpdump 解析$sudoutmpdump /var/run/utmp# 或$sudo/usr/lib/systemd/systemd-tmpfiles--create# 直接看二进制结构$who/var/run/utmp# 模拟上次为 N、当前为 5的输出# 实际不会有 N 的情况之外更多变化$cat/etc/rc.d/rc5.d/S99mysqld# S Start$cat/etc/rc.d/rc3.d/S99mysqld# 直接看启动过程记录$ last-x|head-5root tty1 Mon Jan1509:00 still loggedinrun-level(to lvl5)3.10.0-1160.el7 Mon Jan1509:00 - 09:00(00:00)rebootsystem boot3.10.0-1160.el7 Mon Jan1509:00 still running⚠️ 注意事项1. 仅 CentOS 6/Ubuntu 14.04 之前的系统是真正的运行级别RHEL 7 的 systemd模拟了运行级别概念仅 5/3 有对应 target运行级别 2/4 在 systemd 中没有对应 targetrunlevel输出仍为 5 或 3。2. 输出字符N的含义NNone表示自系统启动以来运行级别未发生过切换。如果是5 3表示从 5 切换到 3。这在判断系统是否被重启过很有用。3./var/run/utmp文件权限-rw-rw-r-- 1 root utmp ... /var/run/utmp普通用户可读但不要修改——这是系统级二进制日志损坏后who、last、runlevel全部失效。4. systemd 系统下运行级别已过时推荐统一用systemctl get-default/systemctl set-default/systemctl isolate避免误导。runlevel仍存在仅是兼容性。5. 与 init 命令的差别init 3、init 5在 systemd 系统下被软链到systemctl isolate走对应 target但不修改/var/run/utmp的所有字段部分场景下who -r输出和runlevel不一致。生产脚本用systemctl更稳定。6. 容器内的特殊值Docker 容器内/var/run/utmp通常为空命令会输出unknown并返回非 0$ runlevel unknown这是预期行为不要因此报错。 总结runlevel是 SysV 时代系统处于何种模式的窗口现代 Linux 强烈推荐使用 systemd target。本节要点输出格式N 5、5 3、3 5第 1 位是上次第 2 位是当前核心级别3多用户文本、5图形其他级别已基本不实用现代替代systemctl get-default/systemctl set-default/systemctl isolate multi-user.target典型场景服务器去图形化释放内存、救援模式诊断、shell 脚本判断模式维护价值在老系统CentOS 6/Ubuntu 14.04维护时仍需掌握最终建议新系统直接使用systemctl get-default老系统或维护脚本仍可放心使用runlevel但配合init切换时优先用systemctl isolate。 相关命令命令用途systemctl get-default查看当前默认 targetsystemd 推荐systemctl set-default TARGET设置默认 targetsystemctl isolate TARGET立即切换 targetinit 3/init 5旧式切换运行级别systemd 兼容who -r显示当前运行级别及切换时间last -x查看系统启动/运行级别切换历史systemctl list-units --typetarget列出所有 targetshutdown关机/重启reboot重启系统halt/poweroff停机/断电