0x00 背景
最近一直接到技术支持的请求,其中最多的就是开机自动的进入了救援模式,Welcome to emergency mode! After logging in ,type "journalctl -xb" to view system logs,"systemctl reboot" to reboot,"systemctl default" or ^D to try again to boot into default mode. Give root password for maintenance ( Control-D )
通常都会收到这样的一个提示。一般来说能够遇到这个提示,那么还有救。哈哈哈,先心里窃喜一小下。
还没有死的透透的,我们先来看看上面这句话的意思。其实很多人学习不好 Linux 或编程的最主要的原因在于英文不好。看到英文跟没看见一样直接就忽视掉了。其实上面这段话有很多有用的信息。我们先来翻译一下,看看都有什么。
其实我请问水平也不是很好,但是还是可以看得懂的。下面是译文,
欢迎来到紧急救援模式,(这是在向我表示祝贺么?),登录以后输入 ‘journalctl -xb’ 来查看系统日志,输入‘systemctl reboot’重启主机,输入‘systemctl default’或者 “ctrl d”会尝试在默认的模式下启动。请输入root密码进入维护模式。
稍微分析一下就知道,只要能进入救援模式那么说明系统的主要的组件功能上还是正常的,否则不可以进入这个模式。这也就给救援打下了基础。
0x01 分析
工欲善其事必先利其器,这里我们要做的第一步就是判断故障的原因。虽然是一句废话,但是不知道原因的话,就是瞎搞。
现在我们开始修复,先用root账号登录进来。然后输入 journalctl -xb
来查看日志。这里可能会遇到一个比较棘手的问题,那就是以前的 root 密码失效了。怎么办呢?进入单用户模式进行 root 密码的重置,方法如下(centos7以及红旗操作系统)用下面这个方法,fedroa 比较新的版本也是可以的,这里我就不自己写了,引用 linux 就该这么学中提到的方法照着操作即可。
重置root密码
重启 Linux 系统主机并出现引导界面时,按下键盘上的 e 键进入内核编辑
Linux 系统的引导界面
在 linux16 参数这行的最后面追加“rd.break”参数,然后按下 Ctrl + X 组合键来运行修改过的内核程序,
大约 30 秒过后,进入到系统的紧急求援模式
依次输入以下命令,等待系统重启操作完毕
mount -o remount,rw /sysroot
chroot /sysroot
passwd
touch /.autorelabel
exit
reboot
继续前面分析的过程,首先要看日志,看看到底是哪里坏了。
journalctl -xb
一条条的看着,这就是机器的启动过程中的所有日志。一路向下我找到了2个 failed 日志。第一个是 failed to mount /boot. 第二个是failed to start Crash revovery kernel arming。第一个日志无法挂载boot分区,第二个是kdump服务的问题。boot的问题一般来说是直接原因也是最大的问题,boot都没了肯定无法启动。第二个问题是一个服务,这个服务非常的重要,可以说就是监控内核的一个服务。下面我们来修复他们。
0x02 修复
重建引导
mkdir /boot/grub2
grub2-mkconfig -o /boot/grub2/grub.cfg
之后nano /etc/fstab
# UUID=4572458b-53f5-4f3a-938a-2eefe8cea65f /boot 这行在行首添加 # 之后ctrl + x 保存退出
之后 systemctl reboot 重启。
重启以后应该就可以正常的进系统了
进系统以后开终端,lsblk
找size 是1G 的 name,一般是sda1
之后修复这个分区 fsck -y /dev/sda1
修复以后 再编辑 fstab
nano /etc/fstab 去掉刚才加的注释
之后再重启看能不能进入系统。
能进入修复成功结束。
如果不能进去先去把注释掉的这行的最后的1 2 改成0 0 ,要是还不行再注释掉fstab的这行。这样重启以后也能用,但是这种情况下如果再坏了,可能就没法再修复了。这个问题的根源在于 boot 分区被破坏了,所有的操作都在围绕着boot分区进行。之前一直是修复 /dev/sda1 这个硬盘的分区,这个分区要是的作用是坏了可以修,直接写在根分区的话不单独分离出来,根分区坏了就再不会提示让修复了。