1.15 Linux系统中的引导修复

系统启动的原理

系统启动时,首先会从一个固定扇区寻找下一步去磁盘的哪个扇区开始引导数据.这个扇区也就叫做主引导记录–MBR(Master Boot Record).MBR是计算机开机后访问硬盘时所必须要读取的首个扇区,包括开头446字节内容的"主引导记录"(MBR),其后是4个16字节的"磁盘分区表"(DPT),以及2字节的结束标志(55AA).这个过程叫做磁盘引导阶段.在读取完MBR后磁盘转动到启动分区通过二级引导目录选择并开始引导系统,读取内核并加载系统初始化镜像文件,在进入系统后开始读取系统的启动级别.最后进入我们熟悉的系统界面.
整个流程如果排布下来大概是这样:

  • 通电
  • BIOS初始化
  • 读取主引导记录
  • 读取二级引导记录
  • 读取系统内核
  • 加载系统初始化镜像文件
  • 读取系统的启动级别
  • 成功进入系统
  • 不难发现,通过逆向思维我们可以知道,上面的步骤中的任何一步出现了问题我们都无法成功进入系统.如何对上述可能出现的问题进行排错也是我们需要进行实验的内容.

需要注意的实验环境设置

如何从光盘启动系统

在无法正常启动系统时,通过光盘来启动系统或进行系统修复是本次的重要前提.因此首先要学习如何设置光盘启动.
从光盘启动

  • Windows下虚拟机中

Windows下虚拟机中的光盘启动方式分为两种

第一种就是典型的手动切换启动项.
即在虚拟机CDROM中装载镜像时,开机启动时通过按压热键手动切换启动项.
优点是不会影响之后的启动顺序.
缺点是反应时间实在太短容易来不及操作.

第二种是在Bios中直接修改启动顺序
将CDROM的启动优先级调高到硬盘之上,这样无论硬盘是否损坏都会直接从CDROM中启动了
优点是不需要在开机时与读取时间斗智斗勇.
缺点是会持续影响之后的启动顺序,事后需要将启动优先级归位.
直接进入Bios进行设置的方法如下.
直接进入Bios进行设置的方法如下

  • Linux下虚拟机中
    Linux系统下KVM虚拟机的设置方法大同小异,甚至更为简单.
    需要先在KVM虚拟机设置中增加光驱并载入镜像.
    修改Boot Options选项,将CD-ROM的优先级调到最高.
    启动后就会从光盘启动了.
    与Windows相比,甚至启动优先级都在设置中可以直接改动.
    Linux添加光盘
    Linux 更改启动顺序

引导中可能出现的问题及其修复

主引导记录损坏

模拟问题的出现

作为系统起步的第一步,如果MBR损坏了,系统的启动也就无从谈起.当系统引导程序被破坏之后,系统无法识别从硬盘的什么位置读取数据来启动.我们可以通过截取数据的方式手动来破坏MBR进行实验环境的部署.(请在虚拟机中进行实验)

fdisk -l												##查询硬盘的分区情况
dd if=/dev/zero of=/dev/sda(硬盘名) bs=446 count=1		##进行数据截取

上面的步骤完成了两件事:

  1. 查询了硬盘分区,可以看到带*的含有引导记录的分区是哪个,之后恢复中会使用到.
  2. 通过dd命令从sda硬盘中截取了一块446个字节的数据,也就是将MBR中的主引导记录截取掉了.

清除主引导记录

进行如上操作后由于主引导分区的数据被破坏,系统自然无法进入正确的引导过程,更谈不上开机了.

修复方式

这时我们就需要用到光盘启动了,通过从光盘中切换到真实系统,重新安装mbr的方式来解决问题.

修复步骤:

  1. 关机
  2. 光盘启动计算机
  3. 选择Troubleshooting(排错模式)
  4. 在二级目录中选择Rescue 挽救系统
  5. 进入系统挽救模式开始进行修复操作.
chroot /mnt/sysimage/			##从光盘模式切换到真实系统,标志为shell从sh变为bash
grub2-install /dev/sda			##安装mbr到原本有引导记录的硬盘
reboot							##重新启动系统
								##观测到系统修复,启动项正确出现

光盘启动界面
错误排查
进入系统挽救模式
挽救模式的运行选项
重新安装引导
系统被修复

二级引导文件破损

模拟问题的出现

二级引导文件就是我们常说的可选择启动项,他们系统中也以独立的文件模式存在,存储在/boot/loader/entries目录中,每个*.conf文件对应一个启动项.
那么自然而然,破损的二级引导文件无法正常启动系统,缺失二级引导文件也一定会报错.
我们通过在系统中删除所有的二级引导文件来模拟这一问题的出现.
删除二级引导文件
但同时为了操作方便,我们需要事先查询根目录和启动分区所在的设备,已经系统目前的内核版本.

df					##查看分区记录
uname -r			##查询内核版本

在这里插入图片描述
查看内核版本
重启后我们就会发现系统卡在启动项这一步无法继续了.
需要手动引导

修复方式

就如上图所说的一样,解决方式手动填写引导信息.
开机进入命令行grub模式后需要对以下内容依次进行设置

  • 设置引导分区
  • 只读挂载内核到根目录
  • 启动初始化镜像
  • 引导完成完成启动

手动挂载步骤1

##手动引导步骤
set root='hd0,msdos1'										##指定引导分区在第一块硬盘的第一个分区中
linux16 /vmlinuz-4.18.0-193.el8.x86_64 ro root=/dev/sda3	##只读挂载内核文件到根分区设备
initrd16 /initramfs-4.18.0-193.el8.x86_64.img				##加载系统初始化镜像
boot														##启动

需要注意的是,这么做的目的是为了帮助你进入系统.
手动引导的方式并不会修复系统中的二级引导文件,只是用手动输入的方式临时代替执行.
因此在进入系统后我们依旧需要对二级引导文件进行重新创建,避免下次启动系统出现同样的问题.
重新创建二级启动文件的命令为kernel-install

cd /boot/loader/entries/			##进入二级引导文件目录
ls									##预检查目录中的内容
kernel-install add 4.18.0-193.el8.x86_64 /boot/vmlinuz-4.18.0-193.el8.x86_64	##尝试创建新的二级引导文件

不出意外的话,这里一定会报错.提示找不到目录或者文件.
我们从/usr目录下复制需要的文件过来解决这个问题.
之后重新执行创建命令,可以查看到二级引导文件被成功创建.
再次重启系统,问题被解决.
重新创建二级引导文件
问题修复

对于主引导的举一反三

二级引导文件可能破碎,这个危险对于主引导也是一样的.grub.cfg保存在/boot/grub2中,对其删除也会导致开机无法正确引导的问题.
解决方法一样是设置手动引导.
唯一的不同在于重新生成文件的方法.

##闯进新的主引导文件的方法
grub2-mkconfig > /boot/grub2/grub.cfg			##运行命令生成引导数据并写入目标文件中

主引导问题举例
生成主引导文件

内核文件损坏

在经过引导阶段后,就该读取内核文件了.同理如果内核文件缺失或破损导致无法加载,一样会导致无法初始化硬件设备.
内核的作用:

  • 系统初始化硬件设备
  • 只读挂载/目录

制造内核缺失问题

cd /boot/					##进入内核文件保存目录
ls							##查看目录内容内容
rm -rf vmlinuz-*			##删除可能存在的内核文件
reboot						##重启系统进入报错环境

重启后系统会进入命令行模式,并提示内核确实无法启动.
对于内核缺失的问题修复一样需要用到挽救模式,因此需要设置从CDROM启动.
制造内核问题

修复方式

  1. 设置CDROM启动
  2. 进入挽救模式
  3. 切换到真机环境
  4. 挂载ISO到真机环境
  5. 将内核安装包复制到真机目录
  6. 使用内核安装包进行内核安装修复
  7. 确认启动引导内记录的信息与内核版本一致
  8. 重启并成功修复问题
    开机报错展示
    从光盘镜像中找到对应的内核文件
    拷贝内核文件到启动分区中
    值得一提的是当系统中存在多个内核时,对于引导和内核文件的修改会更为复杂,尽量避免这种情况的发生

系统初始化文件缺失

在内核文件读取完毕后,就轮到加载系统初始化镜像文件了.

##系统初始化镜像文件在系统中的位置
cd /boot/								##存储目录
ls										##查看目录内容
initramfs-4.18.0-193.el8.x86_64.img		##系统初始化文件的格式举例

与内核操作类似,通过删除系统初始化文件,可以模拟开机时系统初始化文件缺失的问题.

rm -rf initramfs-*						##删除可能存在的系统初始化文件
reboot									##重启进入报错界面

系统初始化文件缺失

修复方式

首先,我们依旧需要进入挽救模式,并进入真机环境.

##首先进入挽救模式
chroot /mnt/sysimage			##切换到真机环境
cd /boot/						##进入启动目录
ls								##查看目录内容
mkinitrd /boot/initramfs-4.18.0-193.el8.x86_64.img 4.18.0-193.el8.x86_64
								##通过mkinitrd命令生成系统初始化文件
exit
exit							##退出shell环境2次,重启

系统初始化文件直接使用mkinitrd命令就可以进行生成,这个命令不输入任何的安装包,也不会出现不存在的问题.
生成系统初始化文件

系统启动级别设置出错

在读取系统初始化文件后就轮到最后一步了:读取系统的启动级别
系统的启动级别即为启动系统最后一步时需要做什么的指引.关于系统启动级别的文件保存在/etc/systemd/system/中.
所有服务启动脚本都在这里面
打开目录发现所有内容都是软链接,连接到真实的启动脚本
当执行systemctl disable时 其实是把其中的链接删掉了.
当执行systemctl enable时 则是添加了新的链接.
设置启动或不启动时,实际是将/etc/systemd/system/multi-user.target.wants 里建立或删除链接
这就是系统服务开机启动方式的原理

根据这样的实现原理,我们可以做到如下操作.

systemctl set-default reboot.target			##将开机启动级别设置为重启

如果这么设置,再开机流程运行到读取系统启动级别之后,系统就会不断地重启重复这个流程.
那么如何解决呢?
链接的本质
设置无限重启操作

修复方式

在启动项(二级引导目录)的选择界面我们能够看到提示

↑↓选择启动项
e进入编辑模式
这里我们进入编辑模式

更改配置文件第四行的内容,在末尾加入表示图形化启动的启动级别5.
手动编辑启动级别
增加参数5
这样我们就手动设置了启动级别5,以图形模式启动了系统.
但是系统的自动启动级别设置依旧在无限重启上.
在进入系统后依旧需要systemctl set-default进行更改.
否则下次进入系统时仍然会出现无限重启的现象.
重新指向图形

附加内容 忘记用户密码的解决情况

如果上述情况都没有发生,我们便可以正常进入系统.
但如果是人为的问题导致的无法使用,如虽然系统可以正常启动但是忘记了超级用户密码的情况该如何.
这样的情况可以通过进入单用户模式来解决.
进入单用户模式的方式仍然需要我们在启动项选择界面按e进入编辑模式
对第四行的内容进行修改:

ro
↓
rw rd.break								##修改启动方式
ctrl + x								##保存并启动

ro改为rw表示从只读挂载根目录修改为读写挂载,方便进行密码修改.
rd.break表示在系统内核加载完成后终止系统起来,来进行密码修改操作.
之后系统就会启动进入单用户模式,在单用户模式下默认为root用户.

chroot /sysroot							##更改root目录
echo 密码 | passwd -stdin root			##通过echo方式设置写入密码
touch ./autorelabel						##初始化selinux

这个文件的作用就是让系统中内核级加强型火墙重新初始化.
如果更新密码后selinux未被初始化,会阻止新密码生效.
需要注意的是,此操作只有在selinux开启时需要执行.
单用户修改密码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值