过去,当您引导大多数 Linux 时,您将引导至运行级别 6,除非您在引导加载期间执行了某些操作来更改运行级别。
然后,该进程将查找 /etc/init/rcX.d (IIRC),其中 X 是运行级别,并按字典排序顺序执行以 S 开头的所有脚本(因此 S01xxx 在 S20yyy 之前运行)。
当您完成关闭过程时,将以 K 开头的脚本将以反向字典排序顺序运行并 IIRC。
现在情况发生了变化,rcX.d 目录已移至 /etc,并添加了 /etc/rcS.d,默认运行级别为 2。
不幸的是,直到现在我还没有关注这些变化。有人可以描述一下当前系统中运行级别 2 的启动和关闭过程吗?
答案1
当系统从一个运行级别转换到另一个运行级别时,它会按顺序执行现有运行级别中的所有“K”脚本,然后按顺序执行新运行级别中的所有“S”脚本。 Debian 实现并行启动,因此大多数脚本将同时运行(但按顺序有效),并且有一个包含每个脚本的依赖信息的标准,以及用于插入/删除脚本的工具。您可以通过添加CONCURRENCY=NONE
到 来关闭并发/etc/default/rcS
。
在 Debian 的 current 上inittab
,在每个运行级别转换时运行的命令集是/etc/init.d/rc
当您启动时,系统被视为处于运行级别S
。中的“S”脚本 /etc/rcS.d
按顺序执行(按/etc/init.d/rc
)。
当它们完成时,系统将进入您在内核命令行上指定的运行级别,或者默认的运行级别,如果您没有安装 X,则默认运行级别为 2。
没有“K”脚本,/etc/rcS.d
因此什么也没有发生 - 运行级别“S”用于一般系统初始化。但随后所有“S”脚本/etc/rc2.d
都会按顺序执行。
一旦这些完成,您就正式进入运行级别 2。该/etc/init.d/rc
命令返回,并init
生成它getty
配置为执行的操作,并等待更改运行级别的信号。
当您关闭时,会向 发送一个信号init
。然后,系统从运行级别 2 移动到 6(重新启动)或 0(关闭)。因此,所有“K”脚本/etc/rc2.d
都会按顺序执行。然后,按顺序执行/etc/rc6.d
或中的所有“S”脚本/etc/rc0.d
(如果存在)。
然后,由于这是运行级别 0 或 6(请注意/etc/init.d/rc
- 该脚本显式测试 0 或 6),它将立即转换出运行级别,导致所有“K”脚本运行。
0 或 6 的最终“K”脚本将是暂停/关闭电源或重新启动系统的命令。
答案2
/etc/inittab
就在我的/etc/inittab
(Fedora 系统)中:
# Default runlevel. The runlevels used are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 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)
#
我的这一行/etc/inittab
控制我的默认运行级别:
id:5:initdefault:
像这样改变它:
$ sudo vim /etc/inittab
id:3:initdefault:
运行级别
您当前的运行级别是这样的:
$ runlevel
N 5
所以我以前的运行级别是未知的 ( N
),而我当前的运行级别是 5。暂时更改您的运行级别:
telinit 3
请看一下这篇文章,标题为:启动管理器(文档),它解释了这个目录在 Debian 下是如何组织的。
在 Debian 下,它显示以下运行级别:
N System bootup (NONE).
S Single user mode (not to be switched to directly)
0 halt
1 single user mode
2 - 5 multi user mode
6 reboot