一. Linux系统启动引导过程及相关知识点概念
1.1 Linux系统引导过程
- 通电
- bios初始化
- 加载BIOS的硬件信息与进行自我检测(自检),并根据设置取得第一个可启动的设备;
- 读取并执行第一个启动设备内MBR的启动引导程序(gurb2、spfdisk等程序)
- 指定boot分区所在分区
- 根据启动引导程序的设置加载 Kernel (内核), Kernel会开启检测硬件与加载驱动程序——完成后,主机硬件已经准备就绪;
- 在硬件驱动成功后,Kernel会主动调用systemd程序 ——准备软件执行环境,并以default.target流程启动:
- 启动systemd初始化进程 (rethat 7 之前版本 inin初始化进程)
- systemd 执行 sysinit.target 初始化系统及 basic.target 准备操作系统;
- systemd 启动 mulit-user.target 下的本机与服务器服务;
- systemd 执行 mulit-user.target 下的 /ect/rc.d/rc.local 文件;
- systemd 执行 mulit-user.target 下的 getty.target 及登录服务;
- systemd 执行 graphical 需要的服务;
1.2 系统启动流程知识点解析
BIOS (Basic Input Output System)
- 基本输入 / 输出系统 ( BIOS ) 是内置于标准 x86/x86-64 硬件的固件接口 , 将硬件置于已知状态并准备好系统以加载操作系统
- 启动自我测试与MBR
- 当该步骤出现问题时会发出蜂鸣声,需要刷bios解决
MBR (Master Boot Record ,主引导记录)
- 代表该磁盘的最前面可安装 boot loader 的那个区块
boot loader (启动引导程序)
- BIOS 会指定启动的设备好让我们可以读取磁盘中的操作系统内核文件时,我们必须要以一个启动引导程序(boot loader)来处理内核文件加载(load)的问题;
- boot loader 程序安装在,启动设备的第一个扇区(sector)中,也就是 MBR;
- boot loader 加载 kernel 与 initramfs (init ram filesystem,它是一个cpio格式的内存文件系统打包),在内存中让 initramfs 解压缩成为 根目录,内核就能借此加载适当驱动程序,最终释放虚拟文件系统,并挂载实际的根目录文件系统,从而开始后续正常启动流程。
二. 系统启动常见问题的 恢复处理
2.1 MBR 主引导记录修复
2.11 模拟问题 —— MBR 引导文件丢失
# 主机系统磁盘/dev/sda
dd if=/dev/zero of=/dev/vda bs=446 count=1
# 从/dev/zero复制446字节大小数据文件,覆盖系统/dev/sda上的mbr数据,破坏主引导记录
# mbr 在磁盘记录的数据位置就是0-446字节
当重启时将会出现以下错误:
解决方法步骤:
- 制作镜像光盘
- 选择光盘启动模式
- 启动系统,进入挽救模式
- grub2-install 安装启动引导程序,在启动分区所在硬盘
- 退出挽救模式
- 关闭系统,更改启动项为硬盘之后正常启动系统
要解决该问题需要制作镜像光盘,虚拟机制作制作镜像光盘步骤如下:
之后选择从光盘启动:
之后启动系统,进入救援模式:
在救援模式下需要执行以下命令:
chroot /mnt/sysimage
grub2-install /dev/vda # grub2-install 安装启动引导程序,在启动分区所在硬盘
之后执行两次 exit 退出:
关闭系统,更改启动项为硬盘之后再次启动系统发现可以成功进入系统:
2.2 引导文件以及启动加载文件 丢失的解决方案
/boot/grub2/grub.cfg # 系统引导文件,指定 /boot 位置
/boot/loader/entries/xxxxxxxxx.conf # 指定系统启动时加载文件名称
2.21 问题模拟<一> —— 引导文件丢失
rm -rf /boot/grub2/grub.cfg #删除系统引导文件
恢复情景一:当系统没有重新启动时
解决方法:
# 可以执行以下命令恢复系统:
grub2-mkconfig > /boot/grub2/grub.cfg
恢复情景二:当系统被重新启动时:
解决方法步骤:
- 首先查看系统分区挂载情况
- 重启系统发现不能正常进入系统
- 输入以下命令:
grub > set root='hd0,msdos1' ##此位置不固定,位置指定/boot所在分区
grub > linux16 /vmlinuz-3.10.0-123.el7.x86_64 ro root=/dev/vda1 #根分区的设备名称
grub > initrd16 /initramfs-3.10.0-123.el7.x86_64.img
grub > boot
4. 以上操作可以使系统正常启动,但是是临时的,再次启动还是会出问题,所以进入系统后还是需要执行
grub2-mkconfig > /boot/grub2/grub.cfg
2.22 问题模拟<二> —— grub2相关系统启动加载文件缺失
rm -fr /boot/loader/entries/xxxxxxxxx.conf
恢复情景一:当系统没有重新启动时
内核版本号 内核镜像
kernel-install add $(uname -r) /lib/modules/$(uname -r)/vmlinuz
恢复情景二:当系统被重新启动时:
set root='hd0,msdos1'
linux16 /vmlinuz-3.10.0-957.el7.x86_64 ro root=/dev/nvme0n1p2
initrd16 /initramfs-4.18.0-80.el8.x86_64.img
boot
2.3 内核文件丢失的解决方案
内核文件
/boot/vmlinuz-$(uname -r) # 内核文件
uname -r # 查看内核版本号 ,输出结果:4.18.0-80.el8.x86_64
2.31 模拟问题—— 内核文件丢失
rm -rf /boot/vmliunz-3.10.0-123.el7.x86_64 #删除内核文件
恢复情景一:当系统没有重新启动时
- 拆解内核文安装包并复制内核压缩镜像到/boot
恢复情景二:当系统被重新启动时:
重启后无法进入系统:报错
解决方法步骤:
- 进入挽救模式,执行以下命令:
chroot /mnt/sysimage #更改根环境
mount /dev/cdrom /media #挂载光盘到/media中
cd /media/BaseOS/Packages #打开安装包所在位置
cp kernel-3.10.0-123.el7.x86_64.rpm /mnt #复制内核安装文件到/mnt中
cd /mnt
rpm2cpio kernel-3.10.0-123.el7.x86_64.rpm | cpio -id #将安装包解开并输出为目录
cp /mnt/lib/modules/4.18.0-80.el8.x86_64/vmlinuz /boot/vmlinuz-$(uname -r) #复制缺少的内核文件到/boot目录
exit
exit
2. 关机,调整启动项后再次启动发现可以正常进入系统
2.4 系统初始化镜像丢失的修复方案
系统初始化镜像:/boot/initramfs-3.10.0-123.el7.x86_64.img
2.41 问题模拟方式 —— 虚拟文件系统文件缺失
rm -fr /boot/initramfs-xxxxx.img # 系统初始化镜像文件
恢复情景一:当系统没有重新启动时
mkinitrd /boot/initramfs-$(uname -r).img $(uname -r) #生成系统初始化镜像
恢复情景二:当系统被重新启动时:
启动系统时不能启动:报错
解决步骤:
- 重启,进入挽救模式
chroot /mnt/sysimage
mkinitrd /boot/initramfs-$(uname-r).img $(uname -r)
exit
exit
2. 关机重启系统即可恢复正常
2.5 系统启动级别的修复及root用户密码破解
2.51 系统启动级别概念
init
-
0 关机
-
1 单用户
-
2 无图形网络模式
-
3 无图形网络模式
-
4 无图形网络模式
-
5 有图形网络模式
-
6 重启
2.52 模拟问题<一>—— 反复重启,无法正常开机启动
systemctl set-default reboot.target #设置系统开机重启,进入反复重启死循环
解决方法步骤:
- 系统开机时,按上/下键,停止读秒
- 按 进入编辑模式
- 选择内核启动行
linux16 /vmlinuz-xxxxxxxx ro xxxxxxxxxxxxx 改为:
linux16 /vmlinuz-xxxxxxxx ro xxxxxxxxxxxxx 5 # 有图形的系统启动初始化模式
- 启动系统 ctrl+x
- 重新设定启动 systemctl set-default graphical.target
2.53 root用户密码破解
模拟问题 —— 当系统root用户密码忘记之后…
解决方法步骤:
- 开机上下键停止读秒
- 按< e > 进入编辑模式
- 选择内核启动行
linux16 /vmlinuz-xxxxxxxx ro xxxxxxxxxxxxx 改为:
linux16 /vmlinuz-xxxxxxxx rw rd.break ##在内核启动完成后终止系统初始化程序的执行
- 启动系统执行命令行,之后即可使用新密码登陆系统
chroot /sysroot #进入真实系统
echo redhat | passwd --stdin root #其中 redhat 为新密码
touch /.autorelabel ##重新初始化selinux,当selinux未开启时不需要操作
exit
exit