深度解析Linux系统排错及修复方法
Linux系统的配置文件缺失,或核心文件被篡改(例如:启动级别被篡改),都会导致系统启动的不成功。
为了解决系统启动过程中出现的问题,我们先来了解系统引导启动的过程:
Linux的系统启动过程大致为:
通电——bios初始化——grub2磁盘引导阶段——grub2文件引导阶段——指定boot所在分区——启动内核,只读挂载 / 设备——启动init程序进入初始化阶段——启动systemd初始化进程——读取/etc/systemd/中的文件——启动程序——启动登录程序
系统主要故障的解决:
1.grub2磁盘引导异常(MBR异常):
MBR:
作用:是为了记录/boot目标所在分区位置
地址:磁盘的0磁道1扇区的前446字节。
注意:磁盘的0磁道1扇区的前512字节记录的信息如下
512 = 446 + 64 + 2
MBR(主引导记录) mpt(主分区表) 55aa(硬盘有效性标志)
##一个分区占用16,所以最多有4个
故障模拟:
dd if=/dev/zero of=/dev/sda bs=446 count=1 ##填充MBR,使MBR失效
注意:其中 /dev/sda1后面的*是自举功能标识,有代表具有自举功能
重启,可以看到系统停止在下面这样的界面:
故障解决方法:
如果是虚拟机,我们可以进入虚拟机管理器,给系统添加有系统镜像的虚拟光盘,并设定优先从光盘启动
如果是真实主机,我们可以通过bios从拥有系统镜像的光盘或者U盘启动
进入挽救模式后,配置安装MBR,然后虚拟机调整优先从磁盘启动或真机拔下U盘
##添加带有系统镜像的虚拟关
##设置优先从光盘启动
##选择第三个Troubleshooting,修理故障
##选择第2个Rescue a RedHat Enterprise linux system
1 ##键入1
##回车
chroot /mnt/sysimage/ ##进入shell
df
grub2-install /dev/sda ##安装grub2
exit
exit
##配置完成后,恢复从磁盘启动
##可以看到问题被成功解决,系统恢复正常
2.grub2文件引导异常(引导文件丢失):
问题模拟:为了模拟故障环境,我们删除grub2引导文件:
即删除/boot/gurb2/grub.cfg
我们首先查看系统的挂载情况
可以看到系统的挂载在 / 下的硬盘为/dev/sda3,挂载在/boot下的硬盘为/dev/sda1(也可以进入挽救模式查看挂载情况)
重启系统,可以看到异常,重启不了
解决方法:
如果发现引导文件丢失时,还没有关机,我们可以直接用命令新建文件
grub2-mkconfig > /boot/grub2/grub.cfg
如果已经重启,进入报错界面,我们可以键入命令
set root='hd0,msdos1' ##此位置是不固定的,位置指定boot所在分区
linux16 /vmlinz-3.10.0-123.el7.x86_64 ro root=/dev/sda3 ##写根分区挂载设备名称
initrd16 /initramfs-3.10.0-123.el7.x86_64.img
boot
##注意:文件名比较长,可以tab键补齐
配置完后,可以重启成功,但是这只是临时的,再次启动还是会异常无法启动,所以需要用命令生成引导文件
grub2-mkconfig > /boot/grub2/grub.cfg
配置完后,重启能够继续正常启动。
至此,就可以解决由于引导文件丢失所引起的系统故障。
3.内核文件丢失:
首先我们看一下/boot下有哪些文件:
系统启动异常模拟:我们删除/boot下的内核文件,模拟内核文件丢失的情况:
重启电脑,可以看到系统,可以看到系统异常,无法正常启动:
解决方法:
首先,给系统插入一个与系统版本一致的镜像,然后我们从镜像启动,进入挽救模式:
进入挽救模式后,我们做以下操作:分布键入以下命令:
chroot /mnt/sysimage
mkdir /rhel7.0 ##新建一个目录
mount /dev/sr0 /rhel7.0/ ##把完整的系统镜像挂载到该目录下
cd /rhel7.0/Packages ##打开系统镜像中的安装包
cp kernel-3.10.0-514.el7.x86_64.rpm /mnt/ ##将我们需要的安装包拷贝到/mnt下
cd /mnt/
rpm2cpio kernel-3.10.0-514.el7.x86_64.rpm | cpio -id ##解开内核对应的安装包
cd boot
cp vmlinuz-3.10.0-514.el7.x86_64 /boot ##将解开的内核安装包中对应的boot文件复制到我们原系统的/boot下 ,以填补原来/boot文件的缺失
exit
exit
恢复从硬盘启动,可以看到系统正常启动:
开机后我们可以看到我们之前删除的文件重新出现在/boot下:
4.系统初始化镜像文件丢失
系统启动异常模拟:
我们删除/boot下的系统初始化镜像文件
重启系统,我们可以看到系统的异常,系统初始化镜像文件找不到
解决方法:
依旧是给系统插入一个带有相同版本系统镜像的光驱,然后进入挽救模式:
进入挽救模式后,我们可以键入以下命令:
chroot /mnt/sysimage
mkinitrd /boot/initramfs-$(uname -r).img $(uname -r) ##重建系统初始化镜像文件
cd /boot/ ##打开系统配置目录
ls ##查看配置文件
exit
exit
配置后关闭系统,重新选择通过硬盘启动:
至此,该问题就完全得到了解决。
注意:$(uname -r) 是一个变量,用来指代当前系统的内核版本
5./boot分区丢失
模拟问题:我们删除/boot分区中的信息,以模拟/boot分区丢失的情况:
删除分区后我们重启电脑,可以看到系统异常,无法正常启动:
解决方案:
给系统插入一个载有与系统版本一致的系统镜像的光驱,并使系统从光驱启动:
进入挽救模式后,一次键入以下命令:
1 ##输入1,选择continue
[Enter] ##再回车
chroot /mnt/sysimage ##切换到真实根目录下
mkdir /boot ##新建/boot
mkdir /rhel7.3 ##新建镜像挂载目录
mount /dev/sr0 /rhel7.3/ ##挂载系统镜像到我们新建的目录下
cp /rhel7.3/Packages/kernel-3.10.0-514.el7.x87_64.rpm /mnt/ ##将内核的安装包复制到/mnt下
cd /mnt/ ##切换到/mnt
rpm -ihv kernel-3.10.0-514.el7.x87_64.rpm --force ##强制安装
grub2-mkconfig > /boot/grub2/grub.cfg ##新建系统引导文件
exit
exit
执行完上面的命令后,我们切换系统从硬盘启动,就可以正常启动系统
6.启动级别init异常
模拟问题:
我们将启动级别改为重启,这样开机时就不会正常进入系统,而是处于不断的开机自启:
ln -s /lib/systemd/system/reboot.target /etc/systemd/system/default.target ##更改重启为新开机级别
配置完模拟问题后,我们重启系统,可以看到系统一直在不断自启,无法正常进入系统。
解决方案:
在进入上面的界面后,我们按上下键,避免自动直接进入系统,而后按e进入可编辑模式,在linux16 /。。。后面加上启动级别为 5 即图像化系统启动界面 就可以正常进入系统。
在进入系统后我们重新设定系统的启动级别为级别5
systemctl set-default graphical.target ##设置系统的默认启动级别为5
至此,启动级别异常导致的系统异常就解决了。
可以看到,系统启动异常的原因就是将重启链接到了系统默认启动级别上。