Linux内核-Linux启动过程与级别
2024年5月 · 预计阅读时间: 3 分钟
#
Linux 启动过程与级别Linux 启动过程:BootLoader -> kernel -> RootFilesystem
#
Linux 系统启动级别runlevel 0 : 系统停机状态,系统默认运行级别不能设为 0,否则不能正常启动 runlevel 1 : 单用户工作模式,root 权限,用于系统维护,禁止远程登陆 runlevel 2 : 多用户工作模式(但不支持 NFS),命令行模式登陆 runlevel 3 : 完全的多用户工作模式(有 NFS),命令行模式登陆 runlevel 4 : 系统未使用的模式,保留 runlevel 5 : X11 图形模式,登陆后进入图形 GUI 模式 runlevel 6 : 系统正常关闭并重启,默认运行级别不能设为 6,否则不能正常启动
分别对应了/etc/rc0.d
至/etc/rc6.d
七个目录。例如rc3.d
这些文件都是从/etc/init.d
目录下链接过来的。
内核启动过程:
1.系统启动后,内核初始化硬件和驱动,然后调用 init
程序。
2.init
程序会读取 /etc/inittab
文件来决定默认的运行级别(如果你的系统不使用inittab
文件,那么可能是通过其他方式指定默认运行级别,例如通过 systemd
(系统管理守护进程) 的target
)。
3.假设系统使用 inittab
,init
找到默认的运行级别之后(比如说是 3),它将执行/etc/init.d/rc
脚本,参数为3
。
4./etc/init.d/rc
脚本会按顺序执行 /etc/rc3.d/
目录内所指向的 /etc/init.d/
目录下的启动脚本。其名称前缀带有 S (用于启动) 和一个数字(定义启动顺序,数字小的先启动)。
当重启或关机时:
1.当执行 shutdown 命令时,系统切换到运行级别 0 或 6,依据是关机还是重启。
2./etc/init.d/rc
脚本将执行 /etc/rc0.d/
(关机) 或 /etc/rc6.d/
(重启) 目录内相应的脚本。这些脚本的名称前缀带有 K (用于终止) 和一个数字(定义终止顺序,数字小的先关闭)。
3.脚本按数字顺序从小到大依次执行,确保各服务有序关闭。
#
传统 Init 启动传统的 Linux 系统启动过程主要由著名的 init 进程(也被称为 SysV init 启动系统)处理,而基于 init 的启动系统被认为有效率不足的问题。
当一台 Linux 电脑启动后,处理器会先在系统存储中查找 BIOS,之后 BIOS 会检测系统资源然后找到第一个引导设备,通常为硬盘,然后会查找硬盘的主引导记录(MBR),然后加载到内存中并把控制权交给它,以后的启动过程就由 MBR 控制。主引导记录会初始化引导程序(Linux 上有两个著名的引导程序,GRUB 和 LILO,80%的 Linux 系统在用 GRUB 引导程序),这个时候 GRUB 或 LILO 会加载内核模块。(在嵌入式 Linux 设备上,上述过程由 uboot 完成)
接着,内核会马上查找/sbin 下的“init”程序并执行它。从这里开始 init 成为了 Linux 系统的父进程。init 读取的第一个文件是/etc/inittab,通过它 init 会确定我们 Linux 操作系统的运行级别。它会从文件/etc/fstab 里查找分区表信息然后做相应的挂载。然后 init 会启动/etc/init.d 里指定的默认启动级别的所有服务/脚本。所有服务在这里通过 init 一个一个被初始化。在这个过程里,init 每次只启动一个服务,所有服务/守护进程都在后台执行并由 init 来管理。
#
systemd 服务systemd(系统管理守护进程)是 Linux 系统机器的另一种启动方式,宣称弥补了以传统 Linux SysV init为基础的系统的缺点,主要目的就是减少系统引导时间和计算开销。
参考博文: Linux 系统服务控制(systemd 的运行级别以及 systemctl 命令)_systemd 运行级别-CSDN 博客 【转载】Systemd 服务配置文件 - hongdada - 博客园 (cnblogs.com) Systemd 入门教程:命令篇 - 阮一峰的网络日志 (ruanyifeng.com)
#
查看当前运行级别运行级别 | Systemd 的 target | 说明 |
---|---|---|
0 | target | 关机状态,使用该级别时将会关闭主机 |
1 | rescue.target | 单用户模式,不需要密码验证即可登录系统,多用于系统维护 |
2 | multi-user.target | 用户定义 / 域特定运行级别。默认等同于 3 |
3 | multi-user.target | 字符界面的完整多用户模式,大多数服务器主机运行在此级别 |
4 | multi-user.target | 用户定义 / 域特定运行级别。默认等同于 3 |
5 | graphical.target | 用户定义 / 域特定运行级别。默认等同于 3 |
6 | reboot.target | 重新启动,使用该级别时将会重启主机 |
#
设置永久运行级别示例:
ln 命令 - ln [参数][源文件或目录][目标文件或目录]
-s 软链接(符号链接) -f 强制执行
就是对/lib/systemd/system/multi-user.target
建立一个链接文件/etc/systemd/system/default.target
,我们进入/etc/systemd/system/目录查看,可以看到默认的 target 就链接到 multi-user.target。
再用另一种方法修改回去:
可以根据提示信息看出,这个命令先删除了原先的default.target
,再重新创建了一个软链接
#
启动过程(1)默认的 RunLevel(在
/etc/inittab
文件设置)现在被默认的 Target 取代,位置是/etc/systemd/system/default.target
,通常符号链接到graphical.target
(图形界面)或者multi-user.target
(多用户命令行)。(2)启动脚本的位置,以前是
/etc/init.d
目录,符号链接到不同的 RunLevel 目录 (比如/etc/rc3.d
、/etc/rc5.d
等),现在则存放在/lib/systemd/system
和/etc/systemd/system
目录。(3)配置文件的位置,以前
init
进程的配置文件是/etc/inittab
,各种服务的配置文件存放在/etc/sysconfig
目录。现在的配置文件主要存放在/lib/systemd
目录,在/etc/systemd
目录里面的修改可以覆盖原始设置。
参考:
技术|走进 Linux 之 systemd 启动过程 (强烈推荐看看这篇文章!)
systemd 启动流程分析_systemd 启动顺序-CSDN 博客
systemd 启动时会默认启动default.target
配置,并且递归的处理它的依赖关系,一般这个配置为graphical.target
或者 multi-user.target
。第一种会启动图形界面,第二种会启动多用户字符模式。从上一小节可以知道,实际上 default.target 是指向graphical.target的软链接。
查看default.target
,我们上面设置的就是graphical.target
图形界面:
其中,Unit
区块的Description
字段给出当前服务的简单描述,Documentation
字段给出文档位置。
Requires
字段:表示"强依赖"关系,即如果该服务启动失败或异常退出,这本服务也会退出。
Wants
字段:表示display-manager.service
与本服务之间存在"弱依赖"关系,即如果display-manager.service
启动失败或停止运行,不影响本服务的继续执行。
Conflicts
字段:与本服务有冲突的模块,如果列出的模块中有已经在运行的,本服务就不能启动,反之亦然。
After
字段:表示如果multi-user.target rescue.service rescue.target display-manager.service
需要启动,那么本服务应该在它们之后启动。相应地,还有一个Before
字段,定义本服务应该在哪些服务之前启动。
注意,After
和Before
字段只涉及启动顺序,不涉及依赖关系。
AllowIsolate
字段:允许使用systemctl isolate
命令切换到本服务。
因此,这是一个递归过程,可以从依赖字段看出,需要先启动multi-user.target
,然后multi-user.target
会将控制权交给另一层basic.target
等等.