概述:
我们在使用linux的时候如果遇到无法开机了怎么办呢?难道要重装系统了吗?是不是看着那满屏幕的乱码(其实很有用)束手无策,本次博客,我来给大家尽量详尽的介绍几种linux常见错误的修复方法,当然,会修还不是最重要的,如果能理解这其中的原理,就算和我介绍的样例不一样的情况你也一定能自己修复了,所以会一并介绍一下linux的开启启动流程(以RHEL7为标准,也就是systemd为开机第一个程序)。
1.引导损坏了(boot-loader)
某一天开机突然看到这个画面,内心肯定是崩溃的,这个提供的minimal的shell也不是很友好,让初学者可能有点无所适从。一般这个问题的出现一定是/boot/grub2(或者grub)里面的grub.cfg文件损坏了,计算机无法找到自己操作系统的内核等文件了,才会出现这个画面,损坏的原因也多种多样,除了手残误删外,比较可能的就是在装Windows和Linux双系统的机器上,你使用PE修复了自己Windows的引导,或者去掉Windows密码的时候会出现这样的问题。提供的这个shell是用来给你手动引导用的,这样大家就应该明白了,自动引导没有了那就自己手动引导呗。
根据分区方式的不同我们将手动引导分为两种。
1)/boot没有单独分区
这种修复起来比较容易,只需要自己完成grub.cfg需要做的动作即可。
但在修复之前我们先来看下这个shell
用ls查看都有什么东西,发现都是些不太熟悉的。但其实这个(hd0)就代表第一块硬盘,而(hdo,msdos?)代表第一块硬盘上的某块分区。
我们已经知道/分区在我们的第二个分区上,我们查看一下他的文件
显示对这个分区ls,可以查看这个分区的信息,根据大小可以确定确实是/分区,但是看到了一个“No know filesystem detected”可以知道没有识别根的文件系统,再使用ls查看/分区下的文件(已经是掩耳盗铃了),什么都看不到,因为没有识别文件系统。知道这里后对理解后面的initrd等概念非常有用。
输入上面三条命令,这就是手动引导的步骤,最后输入boot,就将你的操作系统引导起来了。
2)/boot单独分区
遇到问题。。。(尽快解决)
3)终极方法
如果你不想管你的/boot是单独还是没有单独分区,那么找出你安装这台机器的镜像,做一个启动盘,通过这个媒体启动(修改bios的选项),会发现恢复选项如下:
第三个选项“Troubleshooting”(寻找故障)
选择第二个拯救红帽系统,接下来会进入一个拯救模式。
上面两个的意思是告诉你,你真正的根挂载在了/mnt/sysimage,你需要使用chroot切换到你真正的根处。
这就是救援模式的shell
将/mnt/sysimage作为根目录
这时就相当于你登陆你的系统了,由于一开始分析出,出问题的原因是没有了grub.cfg文件,现在可以用grub2-mkconfig > /boot/grub2/grub.cfg生成这个文件。
2.将内核文件或者initrd文件误删
开机发现"vmlinuz-3....."找不到了,那就是内核丢失的意思,这个我们没办法手动创建了,赶快进入救援模式
进入了久违的系统,但是怎么恢复内核文件呢,其实内核文件也是一个软件包,我们把这个内核的软件包重新安装一遍就好了。所以先挂载上光驱,把内核的软件包文件找出来。
配置好本地yum源,找一下哪个包里面有内核文件,发现正是这个kernel-3.10.0-229.e17.x86_64
给出一个报错说这个软件已经安装了,但是我们的一个文件确实坏了,所以我们使用--force继续安装。
进入/boot,我们的内核文件又回来了。
我们有了内核软件包的rpm包可不可以把这个包打开,把/boot下缺少的文件复制进去就可以。通过rpm2cpio命令就可以。
内核文件就在这个boot文件夹下,接下来只要将内核复制到boot中就好了。
删除initramfs文件
其实仍然是缺少一个文件,我们只要重新安装就好了,这次查看一下initramfs是哪个软件包中的。
但是这个initramfs并不在哪个软件包中。
天无绝人之路,经过查资料,有一个命令可以进行initramfs文件的创建,就是mkinitrd
通过这条命令就可以创建出一个新的initramfs文件。
3.root密码忘记了怎么办
我们可以进入linux的单用户模式,rhel7可以通过rd.break来进入这个模式的shell
首先进入系统前看到这个选单
下面说输入e就可以编辑那个项目,也就是对启动时的一些细节进行修改,我们选择输入‘e’。
找到linux16那一行,也就是启动内核那一行,一直删除到'ro'后面,加入rd.break。
我们就进入了那个shell,但是/目录没有被挂载,而是在sysroot下,我们进行切/操作,然后修改密码即可。
但是切记,如果你之前系统开启了selinux的enforcing模式的话,一定要在/下创建一个autorelabel文件,否则你的密码都会失效。
4.linux的启动过程的简单讲解
如果我们能深入理解linux的启动过程,那么上面的问题都不是问题,所以我简单介绍下linux的启动过程(本人能力有限,只能简单说明)。
第一部分我们讲到引导坏掉的修复过程时,进入了一个shell,用来给我们手动引导用的,通过那个shell中的ls命令我们发现了(hd0)硬盘的三个分区,并且找到了根所在的分区,但是当我们想查看根所在分区的内容时,却发现,根的文件系统无法在这个shell下面被识别,说明加载grub.cfg之前,系统并不具备识别文件系统的能力,也就是系统还没有完全启动,那么什么时候才可以识别文件系统呢,系统什么时候才可以完全启动呢?下面我们讲解下启动的流程。
加载BIOS的硬件信息进行硬件的自我监测(比如当我们的内存条没插好的时候,系统报警),并根据BIOS中的设定选择第一个可以开机的装置(硬盘启动,USB启动,pxe启动等等)。
读取第0柱面的第一个扇区的512Byte,这就是MBR,上面的前446个字节放置着boot-loader(第一阶段grub)。
根据grub中的设置加载内核文件,内核会侦测硬件与加载驱动,准备挂载根。
到现在系统仍然不具备识别根的文件系统的能力,也就无法挂载根,所以linux引入了一个叫initramfs(虚根)的东西,把他加载到内存中,他具有一些磁盘驱动程序,通过他就可以识别硬盘了。将根挂载上了
kernel开始加载systemd(红帽6是init)程序,systemd开始初始化各种系统服务,网络等。
系统完全启动。
如果想对启动有详细了解的小伙伴可以看下面的博客:
传送门
5.systemd
开机呼叫玩systemd程序后会根据default.target的设定来准备系统的环境
[root@foundation3 system]# ll /etc/systemd/system/default.target
lrwxrwxrwx. 1 root root 36 Oct 11 22:09 /etc/systemd/system/default.target -> /lib/systemd/system/graphical.target
[root@foundation3 system]# systemctl isolate multi-user.target
通过上面的命令可以进行图形模式和字符模式,或者关机,重启模式的切换,类似于红帽6的init。
[root@foundation3 system]# systemctl set-default multi-user.target
通过上面的命令可以设置默认的启动模式。