系统启动流程
*服务器上电(按下开机键的这一刻),系统固件(BIOS)运行,开机自检,开始初始化部分硬件
#BIOS==》最小化的输入输出系统,存在与主板的芯片上,出厂时已内置
*BIOS根据启动引导项来加载各项设备
BIOS根据哪些设备来启动系统呢?
1,Hard Drive(硬盘),如果硬盘中没用启动项则往下
2,CD-ROM Drive(光盘),如果光盘中也没有启动项则继续往下
3,Network boot from ***(网卡)
如图:
*系统固件从磁盘上读取boot loader,将系统控制器转移到boot loader==》在 RHEL8中,boot loader 为 GRand Unified Bootloader Version 2(GRUB2)
GRUB2引导菜单:
*使用 grub2-install 命令可以在磁盘上安装GRUB2作为boot loader
*GRUB2加载 /boot/grub2/grub.cfg 配置文件,选择所需要启动的内核
*/boot/grub2/grub.cfg 配置文件由/etc/grub.d/目录,/etc/default/grub 文件和grub2-mkconfig命令配置
*boot loader 加载内核和 initramfs,并放到内存里面,initramfs 包含启动时硬件必要的内核模块(释放内核所需要的各种驱动)和初始化脚本
*initramfs 如果是rhel7以下的版本,使用init老初始化系统,如果是rhel7以上的版本,使用systemd来初始化
*boot loader将控制权交给内核,内核在initramfs中找到所有硬件的驱动程序,并初始化这些硬件,在rhel8中,/sbin/init 是一个指向systemd的链接
*initramfs中的systemd会执行initrd.target目标所有的单元,包括将磁盘中的root文件系统挂载与/sysroot
*使用的是/etc/fstab 配置
*内核将根文件系统从initramfs切换到/sysroot中的根文件系统,随后systemd会使用磁盘中安装的systemd来重新执行
*systemd最终会查找默认的启动目标,还会启动一个基于文本登陆或图形登陆的界面。
*使用 /etc/systemd/system/default.target 和 /etc/systemd/system、配置
#注:系统的第一个分区永远是boot,因为系统的前446字节的引导程序就写在硬盘的最前面
#思考:逻辑卷为什么不能作为boot分区呢?
#因为boot分区是启动引导分区,要在系统还没启动之前去加载这个分区,但是逻辑卷是一个软件上的虚拟概念,所以它必须要等到系统启动之后才能产生逻辑卷,如果你将逻辑卷作为boot分区,就会诞生你在系统启动时逻辑卷都还没有,就无法加载到boot的问题
简化:
(1)硬件上电
(2)BIOS质检
(3)加载引导启动项
(4)在引导项上加载446字节引导程序(硬盘上的一串代码)
(5)引导程序读取grub.cfg的配置得到启动选项菜单
(6)选择启动引导项菜单
(7)内核通过initramfs来加载根文件系统,并且这个是只读权限
(8)initramfs 通过自身的systemd启动后将真正的根挂载到/sysroot 下
(9)initramfs 将自身的根文件系统切换成/sysroot 下真正的根文件系统
(10)内核将重新运行真正根中的systemd初始化操作系统
(11)用户的得到指定运行级别也就是启动目标
查看内核启动项信息:
grubby --default-kernel #查看默认启动的内核菜单
grubby --info=ALL #查看所有的内核
示例:
#所以由启动流程就可以分析如果我root密码忘记了该如何重置
#从启动顺序不难看出,因为 initramfs 之后才是真正的根文件系统,所以可以从这里开始入手
注:在rhel8中,可以让initramfs运行的脚本暂停,并提供给你shell,然后在继续执行。
第一步:选择到要启动的内核,并且按 e 来进行编辑这个条目
第二步:找到内核命令行,并且在末尾加上rd.break
第三步:通过ctrl+x保存启动后用读写的权限来挂载/sysroot
第四步:切换到操作系统的根/sysroot 后重置密码
第五步:打上 .autorelabel 标签(SELINUX 在这一块存在限制)
第六步:输入两次exit即可正常启动(修改密码后启动系统会给你自动打标签,所以会稍微慢一点,稍等即可)