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)
查看当前运行级别
systemctl get-default #查看系统默认运行级别,
运行级别 | 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 | 重新启动,使用该级别时将会重启主机 |
设置永久运行级别
systemctl set-default multi-user.target
或
ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target
示例:
ln命令 - ln [参数][源文件或目录][目标文件或目录]
-s 软链接(符号链接) -f 强制执行
root@linux:/lib/systemd# ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target
root@linux:/lib/systemd# systemctl get-default
multi-user.target
就是对/lib/systemd/system/multi-user.target
建立一个链接文件/etc/systemd/system/default.target
,我们进入/etc/systemd/system/目录查看,可以看到默认的target就链接到multi-user.target。
再用另一种方法修改回去:
root@linux:/etc/systemd/system# systemctl set-default graphical.target
Removed /etc/systemd/system/default.target.
Created symlink /etc/systemd/system/default.target → /lib/systemd/system/graphical.target.
root@linux:/etc/systemd/system# systemctl get-default
graphical.target
可以根据提示信息看出,这个命令先删除了原先的default.target
,再重新创建了一个软链接
启动过程
参考:
技术|走进Linux之systemd启动过程 (强烈推荐看看这篇文章!)
systemd启动流程分析_systemd 启动顺序-CSDN博客
systemd启动时会默认启动default.target
配置,并且递归的处理它的依赖关系,一般这个配置为graphical.target
或者 multi-user.target
。第一种会启动图形界面,第二种会启动多用户字符模式。从上一小节可以知道,实际上default.target是指向graphical.target的软链接。
查看default.target
,我们上面设置的就是graphical.target
图形界面:
root@linux:/etc/systemd/system# cat default.target
# SPDX-License-Identifier: LGPL-2.1+
#
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
[Unit]
Description=Graphical Interface
Documentation=man:systemd.special(7)
Requires=multi-user.target
Wants=display-manager.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target display-manager.service
AllowIsolate=yes
其中,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
命令切换到本服务。
ice需要启动,那么本服务应该在它们之后启动。相应地,还有一个
Before`字段,定义本服务应该在哪些服务之前启动。
注意,After
和Before
字段只涉及启动顺序,不涉及依赖关系。
AllowIsolate
字段:允许使用systemctl isolate
命令切换到本服务。
因此,这是一个递归过程,可以从依赖字段看出,需要先启动multi-user.target
,然后multi-user.target
会将控制权交给另一层basic.target
等等.