KVM虚机无法启动导致数据无法访问的问题解决一例

字数 2576阅读 442评论 1赞 2

问题背景
一台KVM宿主机重启后,某个KVM虚机无法启动。屏幕报错:

booting from harddisk  
failure reading sector 0x181630 from hd0  
grub rescue>

因为这台虚机上有一些没有备份的数据,所以尝试修复。

解决过程
从报错来看,应该是虚机的boot分区sda1损坏导致无法grub无法正常工作,所以系统无法启动。
在grub rescue命令行下尝试修复,失败。

grub rescue> ls  
(hd0) (hd0,msdos2) (hd0,msdos1)  
grub rescue> ls (hd0,msdos1)/   #能看到grub2目录,还有一些vmlinuz,initrd文件  
grub rescue>set root=(hd0,msdos1)   
grub rescue>set prefix=(hd0,msdos1)/grub2   
grub rescue>insmod normal   #会找到grub2/i386-pc/目录下normal.mod文件,加载模块
error:failure reading sector 0x181630 from 'hd0'

可见坏块导致grub菜单无法修复。
又尝试给这个虚机连接一个安装光盘镜像文件,从光盘启动进入resure模式恢复boot分区。但是尝试几次仍然都失败了,所以只能另想办法。

后来想到即使虚机无法启动,只要能读出虚机中的数据即可,所以用libguestfs工具把虚机的文件系统挂载到宿主机上,就可以拷贝数据出来了。

步骤如下:
1,安装libguestfs工具

# yum install libguestfs libguestfs-tools

2,查看虚机的文件系统和分区

# cd /var/lib/libvirt/images
# virt-filesystems -a rhel7.3-2.qcow2   
/dev/sda1  
/dev/rhel/home  
/dev/rhel/root  
# virt-filesystems -d guestos  
libguestfs: error: list_filesystems: sgdisk: Invalid partition data!  
# virt-filesystems -d guestos --parts  
/dev/sda1  
/dev/sda2

可见,这个虚机的虚拟磁盘划分了两个分区sda1,sda2,其中sda1是boot分区,sda2做了LVM,有两个逻辑卷home和root

这个工具包还提供了其他一些命令帮助我们直接查看虚机文件系统里面的内容。比如查看文件系统使用率、列文件目录、拷贝文件到宿主机、直接查看虚机文件内容等:

# virt-df /var/lib/libvirt/images/rhel7.3-2.qcow2   
Filesystem 1K-blocks Used Available Use%  
rhel7.3-2.qcow2:/dev/rhel/home 252706244 18515596 234190648 8%  
rhel7.3-2.qcow2:/dev/rhel/root 52403200 40325392 12077808 77%  
# virt-ls -a /var/lib/libvirt/images/rhel7.3-2.qcow2 /  
libguestfs: error: mount_ro: mount exited with status 32: mount: /dev/sda1: can't read superblock  
virt-ls: some filesystems could not be mounted (ignored)  
(内容略)
]# virt-copy-out -a /var/lib/libvirt/images/rhel7.3-2.qcow2 /etc/fstab /tmp/  
libguestfs: error: mount_ro: mount exited with status 32: mount: /dev/sda1: can't read superblock  
virt-copy-out: some filesystems could not be mounted (ignored)  
# head /tmp/fstab
(内容略)
# virt-cat -a /var/lib/libvirt/images/rhel7.3-2.qcow2 /etc/hosts  
libguestfs: error: mount_ro: mount exited with status 32: mount: /dev/sda1: can't read superblock  
virt-cat: some filesystems could not be mounted (ignored)  
(内容略)

3,最方便的方式就是通过guestmount命令直接把虚机文件系统挂载到宿主机上,就可以随意查看备份数据了。步骤如下:

# mkdir /tmp_mount  
# guestmount -a /var/lib/libvirt/images/rhel7.3-2.qcow2 -i --rw /tmp_mount  
libguestfs: error: mount: mount exited with status 32: mount: /dev/sda1: can't read superblock  
guestmount: some filesystems could not be mounted (ignored)  
# cd /tmp_mount/  
# ls  
bin dev home lib64 opt root sbin sys u01 usr  
boot etc lib mnt proc run srv tmp Users var  

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

2

添加新评论1 条评论

hfbosshfboss技术总监, ahzyhl
2天前
好经验!
Ctrl+Enter 发表