服务器发生内核panic,根据panic堆栈来看,是ext4文件系统报错,基本意思是访问特定扇区位置出错了,从而导致了内核panic,日志如下:
panic重启后,发现系统无法启动,从bmc上面来看,系统完成BIOS关于硬件初始化后,grub没有出现,bmc上面呈现黑屏状态,没有任何信息。
一般linux发布版系统都会提供修复模式的系统,需要在grub中选择启动的系统,但是这次的问题是grub都没有看到,基本上就是在BIOS完成后就没有了下文了,基本可以确定了问题大概原因:
这里仅仅是猜测,需要先确定硬件是否正常。需要有一个可用的系统把服务器驱动起来,第一个想到的是livecd。
通过bmc把livecd iso挂载到服务器上,成功启动了服务器。启动后,因为当前主机上存储较多的磁盘,需要通过fdisk找到先前的系统盘(因为是livecd系统,所以sda不一定是系统盘)。看到的磁盘有Linux swap / Solaris之类的分区,基本上就是系统盘了。
接下来就要判断磁盘是否正常,直接简单的方法就是mount,先mount /dev/sda3,因为该分区较大,可以大胆猜测是根分区,
# mkdir /data
# mount /dev/sda3 /data
发现可以成功mount,那么根分区没有问题,再去mount /dev/sda1,
# mount /dev/sda1 /data/boot
mount也是成功的,里面的内容是/boot分区内容,两个主要分区均是正常的,那么可以断定硬盘没有出问题,至少文件系统没有出错。
补充内容:
Linux系统基本的启动简要流程是:硬件从EPROM的0地址开始启动,也就是从BIOS所在的存储0地址开始启动,也就是加载BIOS相关代码,BIOS在运行最后会加载启动磁盘的0号扇区内容,也就是我们经常说的MBR扇区,0号扇区记录的内容很少,最重要的是会有一个跳转地址,会加载grub的主体代码,会有更丰富的启动功能。这里的0号扇区内容也就是经常说的bootloader中boot的功能,而grub则对应了loader功能,grub提供选择内核镜像功能,传入内核参数等,最好会把内核从磁盘加载到内存中,完成一个loader该做的事情,接下来就是内核初始化的过程了。这里不再详细说明,有兴趣的可以去看内核启动流程代码。
根据补充资料中来看,当前的问题出在了bootloader阶段,就要看0号扇区boot部分的数据是否正常,再看grub部分的数据是否正常。方法如下:
1、查看0号扇区内容
# dd if=/dev/sda of=/root/sda bs=512 count=1
# hexdump -Cv /root/sda
这个截图是正常的MBR扇区内容,当时出问题的时候,hexdump的数据是混乱的,和正常的MBR扇区内容差距较大,到这时候,基本可以判断是MBR扇区数据异常。
数据恢复
那么如何恢复呢?在CentOS的/boot/grub中会有关于grub相关内容备份文件
其中stage1就是MBR的内容,而stage2就是grub的代码内容,可以都hexdump出来进行查看。同时grub提供的好用的工具:grub-install,恢复方法如下:
# mount /dev/sda3 /data
# mount /dev/sda1 /data/boot
# grub-install --root-directory=/data /dev/sda
这里挂载方式需要注意,这里我是把要修复的磁盘/dev/sda中根分区/dev/sda1挂在在/data/boot中,因为grub-install在修复的时候,会根据指定的根目录位置找到/boot/grub中的相关备份文件。这种修复方式会保证无论在boot阶段还是在loader阶段的数据异常,都会进行修复。
修复后,重启服务器,从指定磁盘启动,发现grub成功加载,同时与出问题前保持一致,选择启动内核,系统成功启动后,再恢复虚拟机,恢复虚拟机中相关业务,从而之前出现的服务问题均迎刃而解。
https://zh.wikipedia.org/wiki/%E4%B8%BB%E5%BC%95%E5%AF%BC%E8%AE%B0%E5%BD%95
http://www.ahlinux.com/start/desk/19644.html
http://balistardut.github.io/2016/01/30/Linux%E7%A3%81%E7%9B%98%E7%9B%B8%E5%85%B3-%E5%88%86%E5%8C%BA%E4%B8%8E%E4%BF%AE%E5%A4%8D/