暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

twt企业IT社区 2021-07-30
3691

【作者】dmsong,浪潮商用机器


问题背景

一台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
              复制
              如有任何问题,可点击文末阅读原文,到社区原文下评论交流
              觉得本文有用,请转发、点赞或点击“在看”,让更多同行看到


              长按二维码关注公众号

              *本公众号所发布内容仅代表作者观点,不代表社区立场;封面图片由版权数据库授权使用

              文章转载自twt企业IT社区,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论