一、运行级别的概念
运行级别是指 Linux 系统在特定状态下启动或关闭一组服务的方式。每个运行级别都有一个编号,通常从 0 到 6,其中每个编号对应一个特定的运行模式。不同的 Linux 发行版可能会对运行级别有不同的定义和使用方式,但大致上的约定是相似的。
二、常见的运行级别
在大多数传统的 SysVinit(System V Init)系统中,运行级别的定义通常如下:
-
运行级别 0:关机模式(Halt)
- 当系统进入运行级别 0 时,系统会执行关机操作。此时,所有进程都被终止,所有文件系统都被卸载,系统最终关机。
-
运行级别 1:单用户模式(Single User Mode)
- 运行级别 1 是维护模式,通常用于系统维护和修复。此级别启动最少的服务,只允许 root 用户登录,且不启动网络服务。它通常用于修复文件系统或忘记 root 密码的情况下。
-
运行级别 2:多用户模式,无网络服务(Multi-user Mode without Networking)
- 在运行级别 2 下,系统启动多用户模式,但不启动网络服务。适用于需要多个用户使用系统但不需要网络连接的环境。
-
运行级别 3:多用户模式,有网络服务(Multi-user Mode with Networking)
- 运行级别 3 是完整的多用户模式,启动所有必要的网络服务,并允许多个用户通过网络连接登录系统。这是一个常见的服务器运行级别。
-
运行级别 4:用户自定义模式(User Defined Mode)
- 运行级别 4 通常不被系统使用,保留给用户进行自定义配置。用户可以根据需要配置运行级别 4 启动特定的服务。
-
运行级别 5:多用户模式,带有图形界面(Multi-user Mode with Graphical Interface)
- 运行级别 5 与运行级别 3 相似,但它还会启动图形用户界面(GUI)。大多数桌面系统默认使用这个运行级别。
-
运行级别 6:重启模式(Reboot)
- 当系统进入运行级别 6 时,系统会执行重启操作,所有进程终止,文件系统卸载,系统重新启动。
三、系统缺省的运行级别
系统启动时会进入一个默认的运行级别,这个运行级别通常称为系统的缺省运行级别。这个级别决定了系统在启动时会启动哪些服务,并进入哪种运行模式。对于传统的 SysVinit 系统,缺省的运行级别通常定义在 /etc/inittab
文件中:
示例:/etc/inittab
文件中的缺省运行级别配置
id:5:initdefault:
在这个示例中,initdefault
指令指定了系统的默认运行级别为 5,即系统启动时会进入带有图形界面的多用户模式。
四、系统 V 初始化(SysVinit)与 Systemd
尽管传统的运行级别系统基于 SysVinit 管理,现代的大多数 Linux 发行版已经采用了 systemd
作为初始化系统,取代了传统的 SysVinit。systemd
通过 target
的概念来管理系统状态,它提供了比传统运行级别更细粒度的控制。
1. SysVinit 的运行级别管理
在 SysVinit 系统中,运行级别是通过 /etc/rc.d/
或 /etc/init.d/
目录下的一组脚本来管理的。这些脚本会根据运行级别启动或停止相应的服务。例如,在运行级别 3 下,系统会执行 /etc/rc.d/rc3.d/
目录中的启动脚本,启动网络和多用户环境。
切换运行级别的命令
init 3 # 切换到运行级别 3
init 5 # 切换到运行级别 5
2. Systemd 中的运行级别与 Target
systemd
使用 target
来替代传统的运行级别。每个 target
对应于一个或多个服务和系统状态,类似于 SysVinit 中的运行级别。
常见的 target
poweroff.target
:相当于运行级别 0,关机。rescue.target
:相当于运行级别 1,单用户模式。multi-user.target
:相当于运行级别 3,多用户模式(无图形界面)。graphical.target
:相当于运行级别 5,多用户模式(带图形界面)。reboot.target
:相当于运行级别 6,重启。
查看当前 target
systemctl get-default
设置默认 target
sudo systemctl set-default graphical.target
这个命令将系统的默认启动模式设置为带有图形界面的多用户模式。
切换 target
sudo systemctl isolate multi-user.target
此命令将系统切换到多用户模式(无图形界面),类似于 SysVinit 的 init 3
命令。
五、自定义和管理运行级别(Target)
在实际运维中,有时需要根据具体的需求定制运行级别或 target,例如在服务器上禁用图形界面以节省资源,或创建一个自定义的 target 以满足特殊应用场景。
1. 创建自定义 Target
你可以通过创建自定义 target 文件来实现特定服务和系统状态的管理。
步骤:
- 创建目标文件:在
/etc/systemd/system/
目录下创建一个自定义的 target 文件,例如mycustom.target
。
sudo touch /etc/systemd/system/mycustom.target
- 配置目标文件:编辑这个文件,配置它的基本信息和依赖服务。
[Unit]
Description=My Custom Target
Requires=multi-user.target
- 启动和设置默认 Target:使用
systemctl
启动并设置默认的 target。
sudo systemctl enable mycustom.target
sudo systemctl set-default mycustom.target
2. 管理运行级别的服务
在传统的 SysVinit 系统中,可以使用 chkconfig
或 update-rc.d
来管理各个运行级别中的服务启动项。
在 CentOS/Red Hat 系统中:
chkconfig --level 3 httpd on # 在运行级别 3 中启动 httpd 服务
chkconfig --level 5 httpd off # 在运行级别 5 中禁用 httpd 服务
在 Debian/Ubuntu 系统中:
update-rc.d apache2 defaults # 配置 apache2 服务为默认启动
update-rc.d apache2 disable # 禁用 apache2 服务在所有级别中启动
在 systemd
中,管理服务启动项更为简单:
sudo systemctl enable httpd # 启用服务
sudo systemctl disable httpd # 禁用服务
六、总结
运行级别是 Linux 操作系统启动和运行时的重要概念,不同的运行级别决定了系统将启动哪些服务以及系统的工作模式。在传统的 SysVinit 系统中,运行级别通过编号来表示,每个运行级别代表一种特定的系统状态。随着 systemd
的引入,运行级别被 target
概念所取代,提供了更灵活和更强大的系统状态管理能力。