Linux启动流程分析以及系统恢复处理
< 一 > 启动流程一览
- 加载BIOS的硬件信息与进行自我检测(自检),并根据设置取得第一个可启动的设备;
- 读取并执行第一个启动设备内MBR的启动引导程序(gurb2、spfdisk等程序);
- 根据启动引导程序的设置加载Kernel (内核),Kernel会开启检测硬件与加载驱动程序 ——完成后,主机硬件已经准备就绪;
- 在硬件驱动成功后,Kernel会主动调用systemd程序 ——准备软件执行环境,并以default.target流程启动:
- 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 需要的服务;
BIOS (Basic Input Output System) ,启动自我测试与MBR
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 解压缩成为 根目录,内核就能借此加载适当驱动程序,最终释放虚拟文件系统,并挂载实际的根目录文件系统,从而开始后续正常启动流程。
fdisk -l 命令 查看启动设备
< 二 > 启动恢复
挽救模式的进入
- 主机设置-开机启动时连接光驱-加载系统镜像文件
- 打开电源时进入固件 —— BIOS界面-CD device 启动设备 / 重新启动客户机 ——【Esc】+ 光标选定 -BIOS -CD device 启动设备
1 ) 磁盘引导
问题模拟方式 —— 当MBR内的数据丢失,系统会因为找不到启动分区而停止启动
- 主机系统磁盘/dev/sda
- dd if=/dev/zero of=/dev/sda bs=446 count=1 # 清空系统/dev/sda上的mbr数据
恢复方式:
- 用光盘进入系统挽救模式
- chroot /mnt/sysimage grub2-install /dev/xxxxxx # 重新安装grub2到系统磁盘上
2 ) grub2启动引导程序
/boot/grub2/grub.cfg # 指定/boot位置
/boot/loader/entries/xxxxxxxxx.conf # 指定系统启动时加载文件名称
问题模拟方式 —— grub2相关系统启动加载文件缺失
- rm -fr /boot/loader/entries/xxxxxxxxx.conf
恢复方式 1 (未重启时):
- kernel-install add $(uname -r) /lib/modules/$(uname -r)/vmlinuz
内核版本号 内核镜像
恢复方式 2 (重启时):
• 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
3 ) 内核文件
/boot/vmlinuz-$(uname -r) # 内核文件
uname -r # 查看内核版本号 ,输出结果:4.18.0-80.el8.x86_64
问题模拟方式 —— /boot/vmlinuz 内核文件缺失
- rm -fr /boot/vmlinuz-$(uname -r)
恢复方式 1 (未重启时):
- 拆解内核文安装包并复制内核压缩镜像到/boot
恢复方式 2 (重启时):
- 挽救模式
- chroot /mnt/sysimage
- mount /dev/cdrom /media
- cd /media/BaseOS/Packages
- cp kernel-core-4.18.0-80.el8.x86_64.rpm /mnt/
- cd /mnt
- rpm2cpio kernel-core-4.18.0-80.el8.x86_64.rpm | cpio -id
- cp /mnt/lib/modules/4.18.0-80.el8.x86_64/vmlinuz /boot/vmlinuz-$(uname -r)
- exit
- exit
4 ) 虚拟文件系统文件
/boot/initramfs-4.18.0-80.el8.x86_64.img
问题模拟方式 —— 虚拟文件系统文件缺失
- rm -fr /boot/initramfs-xxxxx.img
恢复方式 1 (未重启时):
- mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
恢复方式 2 (重启时):
- 挽救模式
- chroot /mnt/sysimage
- mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
- exit
- exit
5 ) 系统启动级别
- 0 关机
- 1 单用户
- 2 无图形网络模式
- 3 无图形网络模式
- 4 无图形网络模式
- 5 有图形网络模式
- 6 重启
问题模拟方式 —— 无法正常开机启动
- systemctl set-default reboot.target
恢复方式 (重启时):
- 在开机选择界面按< e >进入到引导文件编辑模式
- 在内核加载选项最后加入启动级别5
- < ctrl > + < x > # 保存设置 ,启动系统
- systemctl set-default graphical.target # 进入系统 ,更改启动设置
6 ) 超级用户密码遗忘
恢复方式 (重启时):
- 开机选择界面按<e>进入到引导文件编辑模式
- 在内核加载选项最后删除到ro选项
- 更改编辑 ro---->rw 内容
- 加入rd.break参数,终止系统启动进入单用户模式
• < ctrl > + < x > # 保存设置 ,启动系统
• chroot /sysroot
• echo 123| passwd --stdin root # 重置root用户密码
• touch /.autorelabel # 当 /.autorelabel文件存在selinux会重新初始化
• cp kernel-core-4.18.0-80.el8.x86_64.rpm /mnt/
• cd /mnt
• rpm2cpio kernel-core-4.18.0-80.el8.x86_64.rpm | cpio -id
• cp /mnt/lib/modules/4.18.0-80.el8.x86_64/vmlinuz /boot/vmlinuz-$(uname -r)
• exit
• exit
7 )综合实验练习
问题模拟方式
- rm -fr /boot/*
恢复方式 (重启时):
- grub2-install /dev/sda
- grub2-mkconfig > /boot/grub2/grub.cfg
- rpm -ivh kernel-core-xxxx.rpm