流程图

引导程序(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之后,操作系统启动之前。它的主要作用就是引导操作系统启动。

MBR(1.0阶段)

第 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 管理

GRUB修复 /boot下全删
进入光盘troublshooting模式
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-core、kernel-modules、kernel-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
内核
流程
- 探测可识别到的所有硬件设备
- 加载硬件驱动程序(借助于initramfs加载驱动)
- 挂载根文件系统
- 以只读方式挂载根文件系统。确保系统完整性。
- 将根文件系统重新挂载为读写模式。
- 启动用户空间第一个应用程序
内核启动的时候,依赖的大量内核模块文件


修复vmlinuz文件
- CD中获取vmlinuz文件
- dracut 制作
- dracut /boot/initramfs-$(uname -r).img $(uname -r)
修复initramfs文件
- CD中获取initramfs文件
- mkinitrd 制作
- mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
系统启动


1
2
3
|
systemctl get-default
systemctl multi-user.target
|
系统初始化
init初始化
1
2
3
4
5
6
7
8
9
|
init进程是内核启动的第一个用户级进程,它的进程ID(PID)通常为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. 清理操作
|

/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
|


服务管理
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
|



服务脚本文件
位于
1
2
3
|
/usr/lib/systemd/system/
/run/systemd/system
/etc/systemd/system
|






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.msgmnb、kernel.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
|
