运行级别(run level)

本文详细介绍了Linux系统的运行级别,包括不同级别的含义及应用场景。同时,文章还深入探讨了inittab配置文件的作用及其在不同发行版中的实现差异,如Ubuntu采用的upstart机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

inittab是很多linux版本的启动脚本。
Linux在完成核内引导以后,就开始运行init程序,它的进程号是1,是所有其他进程的起点。
init需要读取/etc/inittab,该文件告诉init在它的每个运行级别上需要做哪些事情。

init共定义了七个运行级(run level),分别是什么?
# Default runlevel. The runlevels used by RHS are:
  # 0 - halt (Do NOT set initdefault to this)
  # - 关闭计算机,安全关闭电源
  # 1 - Single user mode
  # - 进入单用户维护模式,卸下除root以外的所有文件系统并杀死所有用户进程
  # 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
  # - 多用户模式,无网络连接
  # 3 - Full multiuser mode
  # - 多用户模式,并以文本方式作为登陆方式
  # 4 - unused
  # 5 - X11
  # - 多用户模式,并以图形方式作为登陆方式
  # 6 - reboot (Do NOT set initdefault to this)
  # - 停止linux系统,并按照/etc/inittab默认的登记项重新引导系统


通常在/etc/inittab的开头就定义了系统默认启动到的级别,如:
id:3:initdefault:
id - 用来定义缺省的init运行的级别
3 - 默认的级别为此 (Full multiuser mode)
initdefault - 是关键字,表示默认的级别。
系统管理员可以通过修改这条语句方便地修改默认的运行级别。
在机器引导时,init从运行级0开始,一级一级往上运行到在/etc/inittab中所设置的默认运行级别。为了完成在每一对相邻运行级别之间的过渡,init运行在/etc/inittab中为这种过渡而说明的一些操作。当机器关闭时,以相反的顺序执行同样的处理过程。

既然之前指定的默认运行级别是3,那么init就要执行/etc/rc.d/rc3.d目录中的脚本。/etc/rc.d/rcN.d/目录中的这些启动脚本实际上都是一些链接文件,而不是真正的rc启动脚本,真正的rc启动脚本实际上都是放在/etc/rc.d/init.d/目录下。而这些rc启动脚本有着类似的用法,它们一般能接受start、stop、restart、status等参数。

我们可以看到/etc/rc.d/rc5.d/中的 rc启动脚本通常是K或S开头的链接文件,对于以以S开头的启动脚本,将以start参数来运行。而如果发现存在相应的脚本也存在K打头的链接,而且已经处于运行态了(以/var/lock/subsys/下的文件作为标志),则将首先以stop为参数停止这些已经启动了的守护进程,然后再重新运行。这样做是为了保证是当init改变运行级别时,所有相关的守护进程都将重启。


下面讲下几个特殊的linux.
对于arch:
以我机子上的arch linux为例,inittab如下:
[sai@myhost etc]$ cat inittab 
#
# /etc/inittab
#

# Runlevels:
# 0 Halt
# 1(S) Single-user
# 2 Not used
# 3 Multi-user
# 4 Not used
# 5 X11
# 6 Reboot

## Only one of the following two lines can be uncommented!
# Boot to console
#id:3:initdefault:
# Boot to X11
id:5:initdefault:

rc::sysinit:/etc/rc.sysinit //第1个启动脚本
rs:S1:wait:/etc/rc.single //当以S和1运行级启动时,rs为代号,wait为行为描述,下同
rm:2345:wait:/etc/rc.multi //当以2-5运行级启动时
rh:06:wait:/etc/rc.shutdown //6运行级启动时
su:S:wait:/sbin/sulogin -p //S运行级启动时

# -8 options fixes umlauts problem on login
c1:2345:respawn:/sbin/agetty -8 38400 tty1 linux
c2:2345:respawn:/sbin/agetty -8 38400 tty2 linux
c3:2345:respawn:/sbin/agetty -8 38400 tty3 linux
c4:2345:respawn:/sbin/agetty -8 38400 tty4 linux
c5:2345:respawn:/sbin/agetty -8 38400 tty5 linux
c6:2345:respawn:/sbin/agetty -8 38400 tty6 linux

ca::ctrlaltdel:/sbin/shutdown -t3 -r now

# Example lines for starting a login manager
x:5:respawn:/usr/bin/xdm -nodaemon
#x:5:respawn:/usr/sbin/gdm -nodaemon
#x:5:respawn:/usr/bin/kdm -nodaemon
#x:5:respawn:/usr/bin/slim >& /dev/null

# End of file


由id:5:initdefault:看出默认运行级别为5。
arch并没有提供rcN.d之类的目录,但是我们由这一句rm:2345:wait:/etc/rc.multi看到会执行/etc/rc.multi/rc.multi脚本。内容如下:
[sai@myhost etc]$ cat rc.multi 
#!/bin/bash
#
# /etc/rc.multi
#

. /etc/rc.conf
. /etc/rc.d/functions

# Load sysctl variables if sysctl.conf is present
[ -r /etc/sysctl.conf ] && /sbin/sysctl -q -p &>/dev/null

# Start daemons
for daemon in "${DAEMONS[@]}"; do
if [ "$daemon" = "${daemon#!}" ]; then
if [ "$daemon" = "${daemon#@}" ]; then
start_daemon $daemon
else
start_daemon_bkgd ${daemon:1}
fi
fi
done

if [ -x /etc/rc.local ]; then
/etc/rc.local
fi

# vim: set ts=2 noet:

会执行/etc/rc.conf和/etc/rc.d/functions,前者是arch用户最熟悉的,后者看看代码很长,也是一些启动设置。上面我们看到会执行/etc/rc.local,这个也是一个启动脚本,用户常加入自定义脚本在里面。

/etc/rc.conf里面的服务启动都是相应在/etc/rc.d/目录下当脚本,arch上并没有链接到/etc/init.d目录下,因为arch根本没有/etc/init.d这个目录


对于ubuntu:
参考文档
http://hi.baidu.com/benzus/blog/item/a0f9791700bcf701c83d6d6e.html

ubuntu中inittab不见了,而变成了upstart机制,启动脚本改成了/etc/event.d/rc-default,内容如下:
start on stopped rcS

script
runlevel --reboot || true

if grep -q -w -- "-s\|single\|S" /proc/cmdline; then
telinit S
elif [ -r /etc/inittab ]; then
RL="$(sed -n -e "/^id:[0-9]*:initdefault:/{s/^id://;s/:.*//;p}" /etc/inittab || true)"
if [ -n "$RL" ]; then
telinit $RL
else
telinit 2
fi
else
telinit 2
fi
end script

telinit 2默认运行级别2,另外保留了inittab的方式,可以在/etc下建inittab来加入自己的选择。


运行级别2触发相应的runlevel事件,开始运行/etc/event.d/rc2
sai@sai-desktop:/etc$ cat /etc/event.d/rc2
# rc2 - runlevel 2 compatibility
#
# This task runs the old sysv-rc runlevel 2 ("multi-user") scripts. It
# is usually started by the telinit compatibility wrapper.

start on runlevel 2

stop on runlevel [!2]

console output
script
set $(runlevel --set 2 || true)
if [ "$1" != "unknown" ]; then
PREVLEVEL=$1
RUNLEVEL=$2
export PREVLEVEL RUNLEVEL
fi

exec /etc/init.d/rc 2
end script

执行的是exec /etc/init.d/rc 2,这个脚本就很长了,而这里传递给它的参数为2,看这个脚本
先是设置环境变量
PATH=/sbin:/usr/sbin:/bin:/usr/bin
export PATH
。。。。
然后是确认允许级别
# Now find out what the current and what the previous runlevel are.

runlevel=$RUNLEVEL
# Get first argument. Set new runlevel to this argument.
[ "$1" != "" ] && runlevel=$1
if [ "$runlevel" = "" ]
then
echo "Usage: $scriptname <runlevel>" >&2
exit 1
fi

接下来
。。。。。。
# Now run the START scripts for this runlevel.
# Run all scripts with the same level in parallel
CURLEVEL=""
for s in /etc/rc$runlevel.d/S*
do

看来是驱动rcX下的运行脚本了,ubuntu的默认驱动级别为level 2。所以查看/etc/rc2.d下目录的脚本。
sai@sai-desktop:/etc/rc2.d$ ls
K08vmware-tools S19vmware-tools S50pulseaudio S89cron
README S20apport S50rsync S90binfmt-support
S01policykit S20hotkey-setup S50saned S98usplash
S10acpid S24hal S50system-tools-backends S99acpi-support
S10apmd S25bluetooth S70bootlogs.sh S99laptop-mode
S10sysklogd S30gdm S70dns-clean S99ondemand
S11klogd S50avahi-daemon S70pppd-dns S99rc.local
S12dbus S50cups S89anacron S99rmnologin
S16ssh S50NetworkManager S89atd S99stop-readahead


可以看到这些就是ubuntu的启动脚本了,而这些脚本都是链接到/etc/init.d/下的符号。另外注意到/etc/rc2.d/rc.local,这个是/etc/init.d/rc.local的符号链接
那么看下/etc/init.d/rc.local:
sai@sai-desktop:/etc/init.d$ cat rc.local
#! /bin/sh
### BEGIN INIT INFO
# Provides: rc.local
# Required-Start: $remote_fs
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop:
# Short-Description: Run /etc/rc.local if it exist
### END INIT INFO


PATH=/sbin:/usr/sbin:/bin:/usr/bin

. /lib/init/vars.sh
. /lib/lsb/init-functions

do_start() {
if [ -x /etc/rc.local ]; then
[ "$VERBOSE" != no ] && log_begin_msg "Running local boot scripts (/etc/rc.local)"
/etc/rc.local
ES=$?
[ "$VERBOSE" != no ] && log_end_msg $ES
return $ES
fi
}

case "$1" in
start)
do_start
;;
restart|reload|force-reload)
echo "Error: argument '$1' not supported" >&2
exit 3
;;
stop)
;;
*)
echo "Usage: $0 start|stop" >&2
exit 3
;;
esac

其实就是运行/etc/rc.local,所以说很多人把自己的启动项都加到/etc/rc.local中就是这么来得。

最后用参考资料中总结.
upstart管理的ubuntu启动过程:
1,内核启动init
2,init找到/etc/event.d/rc-default文件,确定默认的运行级别(X)
3,触发相应的runlevel事件,开始运行/etc/event.d/rcX
4,rcX运行/etc/init.d/rc,传入参数X
5,/etc/init.d/rc脚本进行一系列设置,最后运行相应的/etc/rcX.d/中的脚本
6,/etc/rcX.d/中的脚本按事先设定的优先级依次启动,直至最后给出登录画面(启动X服务器和GDM)

转载于:https://www.cnblogs.com/zhouhbing/p/4457766.html

<think>我们正在讨论Linux运行级别。根据引用内容,运行级别是操作系统当前正在运行的功能级别级别从0到6,每个级别有不同的功能,这些级别定义在/etc/inittab文件中(对于sysvinit系统)。在systemd系统中,运行级别的概念有所改变,但为了兼容性,仍然提供了类似的功能。 用户的问题:Linux运行级别介绍及如何查看和配置运行级别 回答结构: 1. 介绍运行级别的概念和作用 2. 详细说明各个运行级别的含义(0-6) 3. 如何查看当前运行级别(针对sysvinit和systemd分别说明) 4. 如何配置运行级别(包括临时切换和永久设置) 5. 注意事项(特别是关于systemd和sysvinit的区别) 注意:由于现代Linux发行版(如CentOS 7及以上)已经转向systemd,因此需要同时介绍两种方式,但重点放在systemd上,并说明兼容性方法。 根据引用[1]和[3],我们可以整理如下: 一、运行级别介绍 Linux系统有7个运行级别(0-6),每个级别对应特定的系统状态,例如: - 0:关机 - 1:单用户模式(救援模式,用于系统维护) - 2:多用户模式(不带网络) - 3:多用户模式(带网络,文本界面) - 4:未使用(用户可自定义) - 5:图形界面模式 - 6:重启 二、查看运行级别 1. 对于使用sysvinit(传统init)的系统: - 使用`runlevel`命令:显示前一个运行级别和当前运行级别(N表示没有前一个) - 使用`who -r`命令:显示当前运行级别 - 查看配置文件`/etc/inittab`:里面有一行类似`id:5:initdefault`,其中的数字5就是默认运行级别。 2. 对于使用systemd的系统(如CentOS 7及以上): - 运行级别被target替代,但为了兼容,运行级别与target有对应关系: runlevel0 -> poweroff.target runlevel1 -> rescue.target runlevel2 -> multi-user.target runlevel3 -> multi-user.target runlevel4 -> multi-user.target runlevel5 -> graphical.target runlevel6 -> reboot.target - 查看当前运行级别(实际上是查看当前的target): `systemctl get-default`:显示默认的target `systemctl list-units --type target`:查看当前活动的target - 也可以使用`runlevel`和`who -r`,但显示的是与当前target对应的运行级别(通过符号链接实现)。 三、配置运行级别(设置默认运行级别) 1. 对于sysvinit系统: 修改`/etc/inittab`文件中的`id:5:initdefault`一行,将数字改为想要的运行级别(如3)。 2. 对于systemd系统: 使用`systemctl set-default`命令,例如设置默认运行级别为多用户模式(对应运行级别3): `sudo systemctl set-default multi-user.target` 设置图形界面(运行级别5): `sudo systemctl set-default graphical.target` 四、临时切换运行级别 1. 在sysvinit系统中,使用`init`或`telinit`命令,如: `init 3` # 切换到运行级别3 `telinit 5` # 切换到运行级别5 2. 在systemd系统中,可以使用`systemctl isolate`命令,如: `sudo systemctl isolate multi-user.target` # 相当于运行级别3 `sudo systemctl isolate graphical.target` # 相当于运行级别5 或者使用兼容命令: `sudo init 3` 注意:切换运行级别会改变系统状态,比如切换到运行级别0会关机,6会重启。 五、注意事项 1. 在systemd系统中,运行级别只是target的别名,实际上是通过创建符号链接(例如`/etc/systemd/system/default.target`指向具体的target)来实现的。 2. 不要随意修改运行级别,特别是将默认运行级别设置为0或6会导致系统无法正常启动。 3. 在systemd系统中,运行级别2、3、4都被映射到multi-user.target,因此它们没有区别。如果需要自定义,可以创建新的target。 六、示例 查看当前运行级别(systemd系统): ```bash $ systemctl get-default graphical.target ``` 将默认运行级别设置为多用户模式(无图形界面): ```bash $ sudo systemctl set-default multi-user.target ``` 临时切换到图形界面: ```bash $ sudo systemctl isolate graphical.target ``` 七、相关问题 根据内容生成相关问题。 现在开始组织回答:</think>### Linux 运行级别详解与配置指南 #### 一、运行级别基础概念 运行级别是 Linux 系统的工作状态标识,定义了系统启动时加载的服务和功能。主要分为 **7 个级别**(0-6),每个级别对应特定系统状态: | 运行级别 | 名称 | 功能说明 | |----------|------------------|--------------------------------------------------------------------------| | 0 | Halt | 关机状态 | | 1 | Single User Mode | **救援模式**:仅 root 可登录,用于系统修复[^3] | | 2 | Multi-User | 多用户模式(无网络) | | 3 | Multi-User+Net | **标准服务器模式**:完整多用户支持+网络服务(无图形界面)[^1] | | 4 | Custom | 用户自定义级别 | | 5 | Graphical | **桌面模式**:图形界面+网络服务(默认桌面环境)[^2] | | 6 | Reboot | 重启状态 | > **关键作用**:控制服务启动顺序、管理系统状态切换、故障恢复[^3] #### 二、查看运行级别 根据系统初始化工具不同,查看方式有所差异: ##### 1. SysVinit 系统(传统) ```bash # 查看当前级别 $ runlevel N 5 # 输出格式: [前一级别] [当前级别] # 替代方法 $ who -r run-level 5 2024-06-15 10:00 # 当前为级别5 ``` ##### 2. Systemd 系统(现代) ```bash # 查看当前目标(target) $ systemctl get-default graphical.target # 等价于运行级别5 # 查看级别映射关系 $ ls -l /usr/lib/systemd/system/runlevel*.target lrwxrwxrwx. 1 root root 15 Jan 10 graphical.target -> multi-user.target ``` #### 三、配置运行级别 **重要**:操作前备份配置文件! ##### 1. 永久配置(设置默认级别) ###### SysVinit 系统: ```bash sudo vi /etc/inittab # 修改此行数字 (示例设为级别3) id:3:initdefault ``` ###### Systemd 系统: ```bash # 设置多用户模式(级别3) sudo systemctl set-default multi-user.target # 设置图形模式(级别5) sudo systemctl set-default graphical.target ``` ##### 2. 临时切换级别 ```bash # SysVinit 系统 sudo init 3 # 切换到级别3 # Systemd 系统 sudo systemctl isolate multi-user.target ``` #### 四、运行级别目录结构 服务启动脚本按级别分类存放: ```bash /etc/rc.d/ ├── rc0.d # 级别0脚本 ├── rc1.d # 级别1脚本 ├── rc2.d ├── rc3.d # 级别3脚本(K*停用服务,S*启用服务) ├── rc4.d ├── rc5.d # 级别5脚本 └── rc6.d ``` 示例级别5的启动服务: ```bash ls /etc/rc5.d/S* # 列出所有级别5启动的服务 S01network S10sshd S12rsyslog ... ``` #### 五、注意事项 1. **危险级别**: - 避免将默认级别设为 0 或 6(会导致循环关机/重启) - 生产服务器建议使用级别 3(无图形界面资源开销) 2. **Systemd 兼容性**: ```bash # 查看传统运行级别对应的target $ systemctl list-units --type target runlevel5.target loaded active active Graphical Interface ``` 3. **服务管理**: ```bash # 禁止服务在级别3启动 sudo chkconfig --level 3 servicename off ``` > **最佳实践**:服务器环境使用级别3,桌面环境使用级别5,救援维护使用级别1[^2] #### 六、示例场景 **问题**:系统无法启动图形界面,需临时切换到命令行模式 **解决方案**: ```bash # 查看当前级别 $ systemctl get-default graphical.target # 临时切换到级别3 $ sudo systemctl isolate multi-user.target # 修复后恢复图形界面 $ startx # 或 sudo systemctl isolate graphical.target ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值