虚拟机镜像文件系统损坏的通用修复方法
一、背景
随着云场景下云主机大量的有客户使用,经常会出现客户在有意无意的使用过程中,导致系统崩溃,客户最常见的处理方式就是重启云主机,看看是否能恢复正常。这时候,经常会遇到系统相关文件、数据、配置等信息被篡改和损坏,导致系统开机失败,无法登陆。针对这种常见情况,我们梳理总结通用的方法流程,帮助客户快速的恢复云主机系统,最大可能不重新安装云主机,也可以避免客户重新安装系统,部署应用。
二、技术实现
针对云主机这种特殊性,镜像文件本身是存储在后端存储集群中,他是通过云主机所在的宿主机,通过librbd块存储client端访问存储集群中云主机镜像文件。所以云主机的磁盘信息是可以在宿主机上查到的。整个guest镜像的挂载是通过libguestfs和libguestfs-tools两个软件实现的。所以首先需要安装工具包:
yum -y install libguestfs libguestfs-tools
查找想要挂在虚拟机的本地挂载点:
查看虚拟机uuid信息
guestmount -d instance-c289202c-7bf8-4f02-8321-865db49398a5 -m /dev/sda4 /mnt
通过输出信息,确认本地映射的设备是/dev/sdb1
guestmount -d instance-c289202c-7bf8-4f02-8321-865db49398a5 -m /dev/sdb1 /mnt
此时,这台云主机的镜像文件就挂载到了本地/mnt目录下,就可以对该路径下的文件进行修改,替换。然后卸载/mnt目录,重新启动云主机,就可以恢复到正常的云主机状态。
三、问题实例
- 两台centos6.8的guest系统启动失败。
通过guestmount工具把云主机镜像挂在到宿主机本地后查看,发现系统内/boot, /lib/modules目录下文件都清空了,内核,驱动等文件都丢失。同一批机器里有两台同样现象(系统,部署完全一样)。分析后决定从正常机器拷贝内核,驱动目录到问题机器上,然后重新启动系统,问题解决。
- 云主机重启失败,进入紧急模式
通过guestmount挂载工具,把云主机镜像挂在到宿主机后,排查系统的/etc/fstab文件,发现系统自动挂载文件被修改,数据盘uuid错误,修改此文件,把正确的uuid信息写入文件,系统重启后正常。
四、总结
通过guestmount工具可以很方便的包云主机镜像文件挂在到本地,然后对系统内进行修复后,使系统恢复正常,大大节省了重新安装和部署软件的工作量。