Linux的启动流程与级别,以ARM-RK3566开发板系统为例

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

image-20240330230527718

这些文件都是从/etc/init.d目录下链接过来的。

内核启动过程:

1.系统启动后,内核初始化硬件和驱动,然后调用 init 程序。

2.init 程序会读取 /etc/inittab 文件来决定默认的运行级别(如果你的系统不使用inittab文件,那么可能是通过其他方式指定默认运行级别,例如通过 systemd(系统管理守护进程) 的target)。

3.假设系统使用 inittabinit 找到默认的运行级别之后(比如说是 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说明
0target关机状态,使用该级别时将会关闭主机
1rescue.target单用户模式,不需要密码验证即可登录系统,多用于系统维护
2multi-user.target用户定义 / 域特定运行级别。默认等同于3
3multi-user.target字符界面的完整多用户模式,大多数服务器主机运行在此级别
4multi-user.target用户定义 / 域特定运行级别。默认等同于3
5graphical.target用户定义 / 域特定运行级别。默认等同于3
6reboot.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。

image-20240330233759198

再用另一种方法修改回去:

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,再重新创建了一个软链接

image-20240330234447584

启动过程

参考:

技术|走进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字段,定义本服务应该在哪些服务之前启动。

注意AfterBefore字段只涉及启动顺序,不涉及依赖关系。

AllowIsolate字段:允许使用systemctl isolate命令切换到本服务。

ice需要启动,那么本服务应该在它们之后启动。相应地,还有一个Before`字段,定义本服务应该在哪些服务之前启动。

注意AfterBefore字段只涉及启动顺序,不涉及依赖关系。

AllowIsolate字段:允许使用systemctl isolate命令切换到本服务。

因此,这是一个递归过程,可以从依赖字段看出,需要先启动multi-user.target,然后multi-user.target会将控制权交给另一层basic.target等等.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值