第二节:操作系统启动流程

操作系统启动流程

一、linux系统构成

1.1 从功能维度划分

(1)系统调用接口+内核

按照功能维度划分,linux系统可以分为两大部分

1、系统调用接口:为上层应用程序准备好的一系列可调用的接口,

2、内核:负责具体控制硬件的运行

注意:

1、应用程序无法直接控制计算机硬件,想控制硬件只能给操作系统发请求,即调用系统调用接口

2、只有操作系统,具体来说是内核部分才能操作硬件

file

(2)内核态与用户态

举例:应用程序操作硬件完整的流程:例如应用程序想读取一个电影文件来播放

最上层的应用程序发起的指令会向下一层层传递,拿到结果后再向上一层一层返回,具体流程是

向下走

1、应用程序发起调用操作系统接口的指令

2、操作系统、准确的是系统调用接口层接受到指令—–》此时操作系统运行是这一层的程序,称之为用户态

3、指令向下传递给内核,内核负责控制具体的硬件运作,读取文件—-》此时操作系统运行的是内核这一层的程序,称之为内核态

向上走:

1、内核将数据向上传递—————————————–》内核态

2、系统调用接口成收到,将数据返回给应用程序——-》用户态

3、应用程序收到数据

总结:

内核态与用户态是操作系统工作的两种状态

内核态代表操作系统此刻正在执行的是自己内核这部分功能,去跟底层的硬件打交道

用户态代表操作系统此刻正在执行的是自己系统调用接口层这部分代码,去跟上层的应用程序打交道

linux操作系统在工作的过程中会涉及到频繁的内核态与用户态切换(因为你的应用程序会频繁的与硬件打交道)

1.2 从文件维度划分

(1)bootfs+rootfs

linux系统有一个非常重要的核心设计思想就是:一切皆文件,即系统中包含的具体内容全都是一个个文件,就连文件夹也是一种文件

按照文件的维度去划分,一个典型的 Linux 系统由 bootfs 和 rootfs 两部分组成

  • 1、bootfs(boot file system)
    • 主要包含 bootloader 和 kernel,bootloader 主要用于引导加载 kernel,当 kernel 被加载到内存中后,计算机的控制器就会交给内核, bootfs (包含bootloader与内核相关磁盘文件)便会被 umount 掉,卸载掉完全没问题,因为内核kernel已经加载到内存中了
    • 同样的内核版本、不同的Linux发行版,其bootfs都是一致的。
  • 2、rootfs (root file system)
    • 包含的就是典型 Linux 系统中的/dev,/proc,/bin,/etc 等标准目录和文件。Linux系统在启动时,rootfs首先会被挂载为只读模式,然后在启动完成后被修改为读写模式,随后它们就可以被修改了。
    • 不同的 linux 发行版(如 ubuntu 和 CentOS、rockylinnux ) 在 rootfs 这一层会有所区别,体现发行版本的差异性。

(2)镜像的本质

注意:镜像的本质就是一个iso格式的压缩包,操作系统的镜像里面存放了该系统所有的内容,部署系统的本质就是把镜像的内容解压释放到磁盘中,这块带有系统包的磁盘称之为启动盘

二、linux系统启动流程

以物理机/虚拟机上运行的一个完整的操作系统为例,一个 Linux 操作系统的启动流程

1、通电后,执行 BIOS(basic input output system)操作系统(写死在主板上)

2、BIOS会根据自己的配置,找到启动盘(启动盘指的是安装操作系统的盘。BIOS这个小系统配置的数据是存放与CMOS中的)

3、BIOS会控制计算机读取启动盘的第一个扇区512bytes(即mbr,称之为主引导记录)的内容到内存中,mbr的前446是boot-loader程序,后64是分区信息,后2字节是结束的标志位

4、Boot-loader启动后,会将磁盘中的操作系统内核加载到内存中让cpu去执行

 Boot-loader 是引导加载器,是一个小程序,它的作用就是将磁盘中操作系统的内核程序加载到内存中去并让CPU去执行。其中常见的Boot-loader有 Grub、Lilo、spfdisk等等,linux中通常用的就是Grub(GRand Unified Bootloader:grand统一加载器)

 bootfs 会被 umount 掉,从而释放内存

Linux 内核执行文件一般会放在 /boot 目录下,文件名类似 vmlinuz*,如下

[root@rockylinux ~]# ll /boot/ |grep vm
-rwxr-xr-x. 1 root root 13364712 Mar 15 18:16 vmlinuz-0-rescue-38e2404ef0af4d86a04f631aa44ce83b
-rwxr-xr-x. 1 root root 13364712 Nov  9 01:47 vmlinuz-5.14.0-362.8.1.el9_3.x86_64

5、linux内核加载之后,启动的第一个进程是0号进程,是静态创建的

在0号进程启动后会接连创建两个进程,分别是1号进程和2和进程。

1号进程最终会去调用可init可执行文件,init进程最终会去创建所有的用户态应用进程。

2号进程会在内核中负责创建所有的内核线程

所以说0号进程是1号和2号进程的父进程;1号进程是所有用户态进程的父进程;2号进程是所有内核线程的父进程。

rockylinux9.3、centos7.9系统如下

file

PID为1的用户态进程

(1)在centos6中该祖宗进程称之为init

(2)在centos7之后(包括rockylinux)该祖宗进程名为systemd、、ubuntu还是叫init

ps:目前linux的好多发行版,如红帽、debian等,都会把/sbin/init作为软连接指向Systemd,Systemd是目前最流行的linux init进程,

rockylinux

file

操作系统的1号进程除了负责创建所有用户态线程之外,还有很多特殊功能,这点我们后续陆续都会介绍到

三、启动级别

Linux分为7个启动级别:

运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
运行级别2:多用户状态(没有NFS)
运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
运行级别4:系统未使用,保留
运行级别5:X11控制台,登陆后进入图形GUI模式
运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

这些启动级别何时加载的呢?

1、C6

# 1.加电自检(BIOS)
# 2.MBR引导 (512k) dd </dev/zero >/dev/sda bs=1k count=400 
# 3.GRUB菜单(选择系统)
# 4.运行init
- 检查/etc/inittab (id:3:initdefault)
- 找到/etc/rc3.d/目录下,所有以S开头的服务,并启动 

# 5.建立终端

# 6.用户登录
## 运行级别: 
- 0:关机
- 1:单用户模式
- 2:多用户模式(没有文件系统,没有网络) - 3:多用户模式(命令行)
- 4:没有被使用
- 5:图形化界面
- 6:重启

2、C7.9、rockylinux9.3、ubuntu

# 1.加电自检(BIOS)
# 2.MBR引导 (512k)  dd </dev/zero >/dev/sda bs=1k count=400 
# 3.GRUB2菜单(选择系统)
# 4.运行systemd
- 检查/etc/systemd/system/default.target -> /usr/lib/systemd/system/multi-user.target
- 找到/etc/systemd/system/multi-user.target.wants/所有服务,并启动 # 5.建立终端
# 6.用户登录

## 运行级别: 
- 0:关机 poweroff.target
- 1:单用户模式 rescue.target
- 2:多用户模式(没有文件系统,没有网络) multi-user.target
- 3:多用户模式(命令行) multi-user.target
- 4:没有被使用 multi-user.target
- 5:图形化界面 graphical.target
- 6:重启 reboot.target

init命令加启动级别,可以让系统运行在某个级别下

init 启动级别编号

都可以设置与获取

通过systemctl get-default可获得默认启动的target

通过systemctl set-default设置默认启动的target

那么,想修改为多用户状态只需执行:
systemctl set-default multi-user.target

修改为图形界面执行:
systemctl set-default graphical.target

四、单用模式

1、开机时进入如下界面,(按下方向键盘,阻止系统自动继续)

按e键出现下面界面

按方向键下,定位到最后,找到“ro”一行,ro的意思是read only,将“ro”替换成 rw init=/sysroot/bin/sh,如下图

2、按Ctrl-x 进入单用户模式

3、执行chroot /sysroot。其中chroot命令用来切换系统,/sysroot/目录就是原始系统

4、如果要修改root密码

passwd是修改root密码的命令,touch /.autorelabel 执行这行命令作用是让SELinux生效(或者干脆关闭SELinux)
如果不行,密码不会生效。按Ctrl+D,执行reboot重启生效。如下图

​ 5、如果因为启用x-window或者显卡驱动更新,无法进入桌面,可以修改默认启动级别(开机进入命令行模式)

systemctl set-default multi-user.target  #设置成命令模式
init 3 # 切换到字符模式,有时只使用上面的语句没有效果
按下Ctrl+D后,执行reboot

五、grub加密

centos7.2 + 中引入了新的实用程序“ grub2-setpassword ”

1) 执行 grub2-setpassword 命令
# grub2-setpassword
Enter password:
Confirm password:
2)如果现在重新启动系统并尝试修改引导条目,系统将要求提供凭据,但是可以在没有凭据的情况下修改引导条目。为了阻止未经授权的修改和未经授权的启动,我们需要对 /boot/grub2/grub.cfg 文件进行更改

打开文件并使用密码搜索需要保护的启动条目,它以menuentry开头。找到条目后,从中删除 --unrestricted 参数

3) reboot 重启验证,只有当输入正确的用户名和密码时,才能进入 grub 菜单或者修改引导条目。

六、光盘修复模式

#1、进入bios、从光盘启动
#2、点击Troubleshooting
#3、进入到Troubleshooting界面
选择:Rescue a CentOS Linux system

#4、三:进入到Rescue选项   按 ENTER键 选1 ,其他选项意思如下
1)continue:救援模式程序会自动查找系统中已有的文件系统,并可读写挂载到/mnt/sysimage目录下。
2)Read-Only:会以只读的方式挂载已有的文件系统。
3)Skip to shell: 手动挂载

#5、sh切换bash模式
chroot /mnt/sysimage/

#6、执行命令
passwd root

bios加密

....

扣电池

上一篇
下一篇
Copyright © 2022 Egon的技术星球 egonlin.com 版权所有 帮助IT小伙伴学到真正的技术