一、linux启动流程
1、开机上电
2、BIOS开机自检(检查硬件是否故障)
3、BIOS根据启动项加载硬件设备
4、硬盘如果有系统,会读取到硬盘的引导代码(硬盘前446字节中的一串代码);引导程序(grub2)最主要的作用就是加载系统中的引导配置文件(/boot/grub2/grub.cfg);所以/boot分区就是又叫引导分区
5、选择内核进入系统,grub2程序加载内核及initramfs到内存中
为什么要加载内核?:内核需要挂载根文件系统,然后执行根下的systemd服务来初始化系统环境,比如系统启动后操作环境是字符界面还是图形化界面
initramfs:提供文件系统驱动,提供内核必要的一些驱动;自身是一个小型的操作系统,有自己的文件系统
6、根目录具有文件系统,挂载文件系统需要有文件系统驱动,但是文件系统是在根下的目录中,这是一个死循环(开箱子需要钥匙,钥匙却在箱子里面);所以由initramfs会先将根文件系统挂载到自己本地的/sysroot目录下
7、内核切换到真正的根文件系统(/),执行systemd初始化系统
8、根据启动目标得到一个操作环境
二、内核管理机制
grubby --info=ALL ----------查看所有的内核信息
grubby --default-kernel ----------查看默认的启动内核
grubby --set-default-index 内核编号or内核文件绝对路径 ----------设置默认的启动内核
修改内核参数
1、修改配置文件/etc/default/grub,加入参数
GRUB_TIMEOUT=5 设置进入默认启动项的等候时间
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" 用于在grub菜单中显示系统的发行版本名称
GRUB_DEFAULT=saved 设置默认的引导项,saved表示沿用上次的启动项
GRUB_DISABLE_SUBMENU=true 是否要隐藏次菜单
GRUB_TERMINAL_OUTPUT="console" 设置grub的输出设备
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet net.ifname=0 biosdevname=0" 设置传递给内核的参数,设定内核的行为
GRUB_DISABLE_RECOVERY="true" 是否禁用恢复模式net.ifname=0 biosdevname=0 ------修改网卡名称,在分布式系统中需要多个节点保持网卡名称一致时用到
重新生成引导配置文件,永久生效
grub2-mkconfig -o /boot/grub2/grub.cfg
2、开机选择内核菜单,e键修改内核参数,crtl+X正常引导;临时生效
3、grubby 命令添加内核参数;添加的内核参数信息保存在/boot/loader/entries目录下
三、故障处理
1、引导配置文件/boot/grub2/grub.cfg 丢失
并且重启后会出现以下情况
grub.cfg文件记录了内核文件的路径和initramfs文件的路径,文件丢失,这些路径记录也就没有了
解决办法:手动指定内核文件的路径和initramfs文件的路径、根文件系统的路径
hd0 第一块硬盘
hd0,msdos1 第一个硬盘的第一个分区
只要是系统盘,第一个分区永远是boot分区
处理流程
指定boot分区并查看内容
指定内核文件,指定根分区, 只读挂载;指定根分区时注意系统盘是nvme还是scsi以及是否做了lvm
指定initramfs文件
进行系统引导
进入系统成功后,之前配置只是临时生效
需要重新生成cfg文件
initramfs是指在Linux内核初始化时所使用的一个临时文件系统。它包含必要的驱动程序、文件系统和工具,以确保内核能够启动并能够访问根文件系统
2、grub2引导程序故障
dd if=/dev/zero of=/dev/sda bs=1 count=446
一般此操作用于修复或重新初始化硬盘的MBR区域(主引导扇区)
MBR:广义的MBR就是指磁盘的第一个扇区,其中包含446字节的主引导程序、64字节的分区表信息、2字节的结束标志
MBR的作用:检查分区表是否正确以及确认哪个分区是引导扇区,会把引导扇区的程序调入内存进行加载
引导扇区:引导扇区是每个分区的第一个扇区
错误原因:硬盘前446字节数据损坏
挂载光盘 使用救援模式
进入救援模式(需要光盘并已经挂载)
救援模式已经找到了咱们的根文件系统,并挂载在它的/mnt/sysimage 目录下
chroot命令 切换根文件系统
使用grub2-install命令安装引导程序
选择错误选项2后,以只读挂载文件系统;可以使用mount -o remont,rw重新以读写挂载
最后使用两次exit退出救援模式,切换启动项到硬盘,从新加载MMR、引导并启动系统
3、root密码忘记
重启系统,选择内核(从rhel9开始,需要使用救援内核进行重置密码操作)
rd.break 打断正常引导流程,进入紧急救援模式
目前shell所处位置为initramfs
真正的根文件系统在sysroot目录下
切换到紧急模式根下,重新以读写方式挂载 /sysroot
使用echo 密码 | passwd --stdin root 命令修改root密码
创建/.autorelabel文件,防止selinux阻止你的修改root密码操作,并重新给目录文件打标签
4、/etc/fstab文件中内容错误
错误类型
1、设备名字错误
2、文件系统错误
3、挂载点错误
mount -a 检查配置文件错误点,进入配置文件进行修改
5、内核文件丢失
/boot目录下内容丢失
进入光盘救援模式,通过配置yum仓库,安装对应软件包得到缺失的文件
rpm -qf vmlinuz-**** 通过一台正常的相同系统机器rpm命令查找内核文件所属软件包
进入紧急救援模式,挂载光盘到本地/media目录
yum install kernel* -y 安装所有以kernel开头的包
生成/boot/grub2目录 grub2-install /dev/nvme0n1:重新安装grub2到系统硬盘上(重新给硬盘写mbr)
生成grub.cfg文件 grub2-mkconfig -o /boot/grub2/grub.cfg
-----------------------------------------------------------------------------------------------------------------------
扩展
系统启动流程
BIOS:硬件检测、初始化、寻找磁盘的引导记录(MBR)
MBR:引导扇区,用于加载引导程序;当计算机启动时,BIOS会读取磁盘的第一个扇区(也就是MBR)到内存中,然后执行其中的引导加载程序。引导加载程序会根据MBR中的分区表信息找到操作系统所在的分区,并读取操作系统内核到内存中执行
GRUB:引导加载程序,多操作系统引导程序,可以读取不同操作系统所在分区的内核
kernel:操作系统和硬件之间的桥梁;硬件控制、进程管理、文件系统管理、驱动管理
init:用于初始化系统进程,是第一个启动的进程,并去启动其它进程;负责初始化系统资源、启动系统服务、管理用户会话,并处理系统的关机与重启