Linux启动流程和内核管理

Linux启动流程和内核管理

流程图

image-20241122175237471

引导程序(Bootstrap Program)

BIOS

其代码存储在主板的一颗ROM存储芯片上,ROM是只能读不能写的

修改的数据是存储在另外一颗RAM存储芯片上,RAM掉电后数 据就会消失,所以主板上有一颗纽扣电池来给这个RAM供电,当这颗纽扣电池没电了,BIOS里面的设置项,就 又恢复成出厂设置了。

  • POST:
    • Power-On-Self-Test (加电自检),是硬件程序BIOS芯片中的一个主要功能,负责完成对CPU、主 板、内存、硬盘子系统、显示子系统、串并行接口、键盘等硬件情况的检测。
  • ROM:
    • Read-Only Memory (只读存储),该存储器上的数据只能读出,不能写入
  • RAM:
    • Random Access Memory (随机存取存),这里的随机取存,是指通电后,随时可在任意位置单元存 取数据信息,不过断电后内部信息也随之消失。
  • 系统启动自举程序:
    • 搜寻并加载操作系统引导记录(MBR)的程序。
      • 按照RAM中保存的启动顺序,搜寻有效的启动驱动器(如硬盘、光盘驱动器、网络服务器等)。
      • 读入操作系统引导记录。
      • 将系统控制权交给引导记录,由引导记录完成系统的启动。

BIOS只支持传统的MBR(主引导记录)磁盘分区格式

BIOS里面的 boot 指定我们要启动的位置,0:0 == [第一块磁盘的第一个分区]

EFI,UEFI

UEFI(统一可扩展固件接口)是一种新的启动方式,它在BIOS的基础上进行了改进,可以看作是BIOS的 升级版。UEFI模式具有许多优势:

  • 启动速度快:
    • UEFI支持硬件加速和并行处理,可以在几秒钟内启动操作系统,而BIOS通常需要几十秒。
  • 支持大容量硬盘:
    • UEFI基于GPT(全局唯一标识分区表)分区结构,能够支持超过2TB的硬盘容量。
  • 功能丰富:
    • UEFI拥有更加现代化的图形界面,可以更方便地进行设置和管理。
    • 它支持网络启动、安全启动等高级功能,并提供灵活的驱动程序支持。
  • 兼容性好:
    • UEFI可以识别MBR和GPT两种分区格式,因此可以兼容不同版本的Windows和Linux操作系统。

在UEFI模式下,直接由EFI系统分区中的 .efi 引导程序来引导操作系统。

EFI 系统分区(ESP)起始于第 2048 扇区,用于存储 .efi 引导文件。

bootloader 启动加载器

Bootloader叫引导加载器,引导程序。

独立的软件,运行在BIOS之后,操作系统启动之前。它的主要作用就是引导操作系统启动。

image-20241121115303839

MBR(1.0阶段)

image-20241121114636800

第 0 扇区(512 字节)存储了 MBR(主引导记录),其空间非常有限,只能容纳引导加载器的第一阶段(Stage 1)。

Stage 1 主要负责定位和加载后续阶段的引导代码,而文件系统驱动程序可能体积较大,需要额外空间。

1-2047扇区(1.5阶段)

用于加载文件系统驱动程序,支持解析磁盘上的文件系统。

在 1-2047 扇区中存储文件系统驱动或支持代码,使第二阶段引导程序(Stage 2)能够读取磁盘上的文件系统(如 /boot 分区)。

GRUB(2.0阶段)

CentOS 5,6 GRUB 0.97(GRUB Legacy), CentOS 7 以后使用 GRUB 2.xx

GRUB(GRand Unified Bootloader)是一个启动加载程序,用于启动操作系统。其配置文件在 Linux系统的启动过程中起着至关重要的作用。

目前grub的配置文件主要有两种样式:

  • grub1的配置文件在 /boot/grub/grub.conf
  • grub2的配置文件在 /boot/grub2/grub.cfg

读取 /boot/grub 下的配置文件和操作系统内核。选择和加载内核。

1
2
3
4
5
6
7
8
 # GRUB 2 的主配置文件
 cat -n /boot/grub2/grub.cfg | grep '###'
 # 其中 ### BEGIN /etc/grub.d/10_linux ### 是linux系统启动的选择区域
 
 # 系统启动信息配置文件,放置在另外一个目录下
 ls /boot/loader/entries/
# ed2606c630314e8ebc3fe115115cb13e-0-rescue.conf                            救援模式的
# ed2606c630314e8ebc3fe115115cb13e-5.14.0-427.13.1.el9_4.x86_64.conf        正常的

vmlinuz是一个压缩的内核镜像文件,包含了Linux内核的压缩版本以及相关的启动信息。

在系统启动时,引导加载程序(如GRUB)会加载vmlinuz文件,并将其解压缩到内存中。

然后,操作系统的控制权会转移到内核镜像,从而启动Linux操作系统。

mlinuz文件包含了操作系统的核心功能、驱动程序和必要的文件系统支持,负责初始化硬件设备、管理进程、提供系统调用接口等。

initramfs(initial ramdisk filesystem)是一个在内存中的临时根文件系统。

它在Linux内核启动之前被加载到内存中。initramfs包含了内核启动所需的文件系统模块和驱动程序,使得内核能够顺利地加载真正的根文件系统。一旦真正的根文件系统加载完成,initramfs就会被卸载,系统将转移到真正的根文件系统上运行

initramfs(initial ramdisk filesystem)是一个在内存中的"临时根文件系统",它在Linux内核启动之前被加载到内存中。

initramfs包含了内核启动所需的文件系统模块和驱动程序,使得内核能够顺利地加载真正的根文件系统。一旦真正的根文件系统加载完成,initramfs就会被卸载,系统将转移到真正的根文件系统上运行。

  • 提供必要的文件系统支持: initramfs中包含了内核启动所需的文件系统模块和驱动程序,它们使得内核能够识别和挂载真正的根文件系统。 从而定位到 init 程序,从而完在真正的系统启动。

  • 简化内核启动过程: 通过提前加载必要的文件系统支持和驱动程序。 它可以在内核启动的早期提供一个用户态环境,用于完成在内核启动阶段不易完成的工作。

  • 支持特定的启动需求: initramfs可以根据系统的需求进行定制,包含特定的文件系统支持和驱动程序,以满足特定的启动需求。

  • 提供系统维护和故障排除的功能: 在系统无法正常启动时,可以通过initramfs进入救援模式进行修复。initramfs中可以包含一些系统维护和故障排除工具,这些工具可以帮 助用户诊断和解决系统启动过程中遇到的问题。

1
2
3
4
dnf install -y dracut-tools

查看文件内容
lsinitrd initramfs-5.14.0-427.13.1.el9_4.x86_64.img

GRUB 管理

image-20241121182112379

GRUB修复 /boot下全删

进入光盘troublshooting模式

  • 1 continue(这会自动将原根挂载到/mnt/sysroot下)

    • ubuntu中要自己手动挂载:mount /dev/vg/lvm /mnt
  • 切根:chroot /mnt/sysroot

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
dnf install grub2


# 重新安装grub到启动设备
grub2-install /mnt/sysimage

# 生成GRUB配置文件:
grub2-mkconfig -o /mnt/sysimage/grub2/grub.cfg


dnf install kernel

注意
 如果无法安装的话可以先卸载内核然后再安装内核即可
 这里安装的软件有kernel kernel-corekernel-moduleskernel-modules-core

root口令绕过

init=/bin/bash

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
 e 进入内核编辑模式然后修改内核的启动参数
 "ro" 改成 "rw"
 rhgb 后面添加 init=/bin/bash

Ctrl+x 进行保存启动

如果开启SElinux
设置 SElinux 重启标记
 touch /.autorelabel
最后重启系统
 exec /usr/sbin/init

rd.break

1
2
3
4
5
6
7
8
9
 e 进入内核编辑模式然后修改内核的启动参数
 "ro" 改成 "rw"
 rhgb 后面添加 rd.break
 
进入紧急模式切根
chroot /sysroot

如果提示sh没有chroot使用根的chroot
/sysroot/usr/sbin/chroot /sysroot

无限重启

添加参数 systemd.unit=multi-user.target 然后 ctrl+x

其他的一些target

desired.target、multi-user.target、emergency.target、rescue.target

内核

流程

  1. 探测可识别到的所有硬件设备
  2. 加载硬件驱动程序(借助于initramfs加载驱动)
  3. 挂载根文件系统
    • 以只读方式挂载根文件系统。确保系统完整性。
    • 将根文件系统重新挂载为读写模式。
  4. 启动用户空间第一个应用程序
    • systemd

内核启动的时候,依赖的大量内核模块文件

image-20241121172509676

image-20241121172520046

修复vmlinuz文件

  • CD中获取vmlinuz文件
  • dracut 制作
    • dracut /boot/initramfs-$(uname -r).img $(uname -r)

修复initramfs文件

  • CD中获取initramfs文件
  • mkinitrd 制作
    • mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)

系统启动

image-20241121173505858

image-20241121173516433

1
2
3
 systemctl get-default
 
 systemctl multi-user.target

系统初始化

init初始化

1
2
3
4
5
6
7
8
9
init进程是内核启动的第一个用户级进程它的进程IDPID通常为1在Linux系统中init进程负责如下作用

 - 系统初始化
 	init进程在系统启动时执行一系列初始化操作如设置系统环境挂载文件系统等
 	该程序是内核启动之后的第一个进程也是进程树中的树根所以其进程ID始终为1
 - 启动其他进程
 	根据系统配置文件如Linux中的/etc/inittab),init进程会启动其他必要的系统进程和服务
 - 监控与管理
	 init进程还会监控系统中的其他进程确保它们正常运行并在必要时进行重启或终止
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
初始化脚本 sysinit

系统初始化脚本功能
    1. 设置主机名
    2. 设置欢迎信息
    3. 激活udev和selinux 
    4. 挂载/etc/fstab文件中定义的文件系统
    5. 检测根文件系统并以读写方式重新挂载根文件系统
    6. 设置系统时钟
    7. 激活swap设备
    8. 根据/etc/sysctl.conf文件设置内核参数
    9. 激活lvm及software raid设备
    10. 加载额外设备的驱动程序
    11. 清理操作

image-20241121180929782

/etc/rc.d/rc 控制服务脚本的开机自动运行

chkconfig 管理服务

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
查看所有服务在不同运行级别下的停启情况
[root@c6 ~]# chkconfig --list
NetworkManager 0:off 1:off 2:on 3:on 4:on 5:on 6:off
abrtd         0:off 1:off 2:off 3:on 4:off 5:on 6:off
......
查看指定服务
[root@c6 ~]# chkconfig --list crond
crond         0:off 1:off 2:on 3:on 4:on 5:on 6:off
查看链接
[root@c6 ~]# ll /etc/rc3.d/*cron*
lrwxrwxrwx. 1 root root 15 Aug 29 05:40 /etc/rc3.d/S90crond -> ../init.d/crond
修改服务
[root@c6 ~]# chkconfig --level 3 crond off
再次查看变成了K开头
[root@c6 ~]# ll /etc/rc3.d/*cron*
lrwxrwxrwx. 1 root root 15 Aug 30 14:49 /etc/rc3.d/K60crond -> ../init.d/crond
crond在3模式下变成了off
[root@c6 ~]# chkconfig --list crond
crond         0:off 1:off 2:on 3:off 4:on 5:on 6:off

service 手动管理服务

1
2
3
service crond stop
service crond start
service crond status

xinetd 管理非独立服务

1
2
3
	有很多服务不是常用服务使用频率不高如果这种服务也加入开机启动则会消耗服务器资源为了平衡资源与服务使用之间的关系我们可以用一个代理服务来管理这些不常用的服务

	这些被代理的服务就称之为非独立服务

systemd初始化

unit

1
2
3
4
5
6
7
在systemd中unit是一个基本概念表示一个系统功能或服务
 unit表示不同类型的systemd对象systemd会根据配置文件和设置启动各种units
 包括服务service)、设备device)、挂载点mount)、监听(socket)
 每个unit都有一个名称和一个类型systemd使用依赖关系来确保正确的启动顺序
 
 查看unit类型
[root@rocky9 ~]# systemctl -t help

image-20241121195911311

image-20241121195834449

服务管理

1
2
3
4
5
1. systemd执行默认target配置配置文件/etc/systemd/system/default.target
2. systemd执行sysinit.target初始化系统及basic.target准备操作系统
3. systemd启动multi-user.target 下的本机与服务器服务
4. systemd执行multi-user.target 下的/etc/rc.d/rc.local
5. Systemd执行multi-user.target下的getty.target及登录服务
1
2
3
4
5
6
7
# 查看依赖
systemctl list-dependencies

# 分析启动时间
systemd-analyze
systemd-analyze blame
systemd-analyze plot > html

image-20241121200046202

image-20241121200055379

image-20241121200101234

服务脚本文件

位于

1
2
3
/usr/lib/systemd/system/
/run/systemd/system
/etc/systemd/system

image-20241121200745872

image-20241121200757840

image-20241121200808479

image-20241121200817567

image-20241121200823554

image-20241121200843641

1
2
3
对于新创建的unit文件或者修改了的unit文件要通知systemd重载此配置文件或者选择重启系统
systemctl daemon-reload
init q

内核参数

一些参数

文件系统

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
readahead决定了操作系统在从磁盘读取数据时预先读取的数据量增加readahead的值可以提高顺序
读取的性能但可能会降低随机读取的性能

dirty_background_ratio控制当脏页被修改过的页面占总可用内存的百分比达到多少时后台写入
开始将脏页写回磁盘如果系统中有大量的写操作可能需要调低这个比例

dirty_expire_centisecs指定了一个脏页在被写入磁盘前在内存中停留的最大时间以百分之一秒为单
)。减少这个值可以确保脏页更快地被写回磁盘但太低的值可能会导致频繁的写操作影响性能

dirty_ratio控制当脏页占可用内存的百分比达到多少时内核开始同步地将脏页写回磁盘这个值通常应
该比dirty_background_ratio高

内存管理

1
2
3
4
5
6
7
8
vm.swappiness控制内核倾向于使用swap空间的程度值越高系统越倾向于使用swap空间适当调整该
参数可以平衡内存使用和swap的使用从而减少磁盘I/O操作提高系统性能

vm.min_free_kbytes设置系统尝试保留的最少空闲内存量以KB为单位)。如果空闲内存低于这个值
内核会采取措施来增加空闲内存量

shmall和shmmax分别控制共享内存段的总数量以及单个共享内存段的最大大小适当调整这些参数可以提
高系统处理进程间通信的能力

进程和线程相关参数

1
2
3
4
kernel.pid_max控制系统中可以同时存在的进程数量的上限

kernel.threads-max定义了系统中进程数量包括线程的最大值对于多线程应用程序适当增加此
值以支持更多的线程

网络相关参数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
net.ipv4.tcp_max_tw_buckets控制系统中TIME_WAIT套接字的最大数量增加该值可以减少
TIME_WAIT套接字的数量适用于高并发的服务器

net.ipv4.tcp_tw_reuse和net.ipv4.tcp_tw_recycle控制TCP TIME-WAIT快速重用开启这些参
数可以允许快速重用TIME_WAIT状态的连接

net.ipv4.tcp_fin_timeout和net.ipv4.tcp_keepalive_time分别控制TCP连接的关闭时限和空闲
超时时间适当减少这些时间可以加快资源的回收

net.ipv4.ip_local_port_range定义UDP和TCP连接的本地端口的取值范围扩大端口范围以支持更多
的并发连接

消息队列和共享内存参数

1
2
kernel.msgmnbkernel.msgmax和kernel.msgmni分别控制消息队列的最大长度单个消息的最大长
度和系统中同时运行的消息队列的个数

sysctl 参数设置

参数以文件的形式显示在 /proc/sys/ 目录中,配 置项就是目录名加文件名,值就是该文件中的内容

1
2
3
4
5
sysctl -a		# 显示所有

sysctl -p		# 重载参数

sysctl -w		# 设置参数
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 临时
[root@rocky9 ~]# echo 123 > /proc/sys/net/ipv4/ip_forward
[root@rocky9 ~]# cat /proc/sys/net/ipv4/ip_forward
123
[root@rocky9 ~]# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 123

# 写配置文件,永久有效
vim /etc/sysctl.conf
sysctl -p
1
2
3
4
5
系统在启动时会按下列顺序加载配置文件读取参数值
/etc/sysctl.d/*.conf
/usr/lib/sysctl.d/*.conf 
/lib/sysctl.d/*.conf
/etc/sysctl.conf

image-20241121201526325