一 背景

某专有云客户在使用云桌面过程中,有一云桌面启动不了了,客户想把该桌面内的数据拷贝出来。使用libguestfs-tools就可以在云桌面不启动的情况下,直接把数据拷贝出来。libguestfs 是一组 Linux 下的 C 语言的 API ,用来访问虚拟机的磁盘映像文件。其项目主页是http://libguestfs.org/,该工具可以在不启动KVM guest主机的情况下,直接查看guest主机内的文内容,也可以直接向img镜像中写入文件和复制文件到外面的物理机,当然其也可以像mount一样,支持挂载操作。它包含的工具有virt-cat、virt-df、virt-ls、virt-copy-in、virt-copy-out、virt-edit、guestfs、guestmount、virt-list-filesystems、virt-list-partitions等。

1.1 前置条件

  • 安装了kvm的环境,本文用的centos。
  • 存放kvm镜像的空间(默认是/var/lib/libvirt/images)比将要操作的镜像大,否则libguestfs-tools运行失败。

具体恢复步骤如下。

二 工具安装

Centos环境使用yum安装,安装命令

  1. yum -y install libguestfs-tools

支持win镜像还需要安装libguestfs-winsupport

  1. yum install libguestfs-winsupport

三 数据恢复

3.1 查看镜像

使用virt-ls查看镜像格式为:
virt-ls -a 镜像名 目录
如查看测试镜像:

  1. #virt-ls -a x86_asp_win_0001_001_001_020.raw /
  2. $Recycle.Bin
  3. BOOTNXT
  4. Boot
  5. CloudMusic
  6. Documents and Settings
  7. LogtailData
  8. PerfLogs
  9. Program Files
  10. Program Files (x86)
  11. ProgramData
  12. Recovery
  13. System Volume Information
  14. Users
  15. Windows
  16. bootmgr
  17. cache
  18. maservice
  19. pagefile.sys
  20. warnings

可以使用virt-ls —help查看具体使用方法。上面不是客户的镜像,客户镜像使用virt-ls报错,提示性信息如下:

  1. #virt-ls -a m-gg30ga5ak2i50amf4yn3_system.raw /
  2. virt-ls: multi-boot operating systems are not supported
  3. If using guestfish '-i' option, remove this option and instead
  4. use the commands 'run' followed by 'list-filesystems'.
  5. You can then mount filesystems you want by hand using the
  6. 'mount' or 'mount-ro' command.
  7. If using guestmount '-i', remove this option and choose the
  8. filesystem(s) you want to see by manually adding '-m' option(s).
  9. Use 'virt-filesystems' to see what filesystems are available.
  10. If using other virt tools, multi-boot operating systems won't work
  11. with these tools. Use the guestfish equivalent commands
  12. (see the virt tool manual page).

提示virt-ls不支持多分区镜像,需要使用virt-df查看镜像到底有几个分区,命令格式:virt-df -a + 镜像名,客户镜像名m-gg30ga5ak2i50amf4yn3_system.raw,操作如下:

  1. #virt-df -a m-gg30ga5ak2i50amf4yn3_system.raw
  2. Filesystem 1K-blocks Used Available Use%
  3. m-gg30ga5ak2i50amf4yn3_system.raw:/dev/sda1
  4. 306584 4 306580 1%
  5. m-gg30ga5ak2i50amf4yn3_system.raw:/dev/sda2
  6. 1515376 159332 1261020 11%
  7. m-gg30ga5ak2i50amf4yn3_system.raw:/dev/sda3
  8. 15416264 9567468 5045980 63%
  9. m-gg30ga5ak2i50amf4yn3_system.raw:/dev/sda4
  10. 15416264 8685476 5927972 57%
  11. m-gg30ga5ak2i50amf4yn3_system.raw:/dev/sda5
  12. 27948116 7396660 19108692 27%
  13. m-gg30ga5ak2i50amf4yn3_system.raw:/dev/sda6
  14. 10255636 7257628 2457336 71%

可以看到问题镜像有6个分区,sda1~sda6。

3.2 分区挂载

确定镜像有6个分区后,可以使用guestmount把分区挂载出来,挂载命令格式:
guestmount -a 镜像 -m 分区 —rw 挂在路径

这里先把镜像的“/dev/sda5”分区挂载出来,操作如下。

  • 先在本地创建挂载路径

    1. #mkdir -p ./mnt/sda5
  • 然后执行挂载命令

命令格式:gustmount -a 镜像名 -m 分区 —rw 路径,具体操作如下:

  1. #guestmount -a m-gg30ga5ak2i50amf4yn3_system.raw -m /dev/sda5 --rw ./mnt/sda5/

操作成功,使用df命令查看,可以看到已经挂载出来了。

  1. #df -h|grep mnt
  2. /dev/fuse 27G 7.1G 19G 28% /apsarapangu/disk1/sysimage/zsimage/mnt/sda5

可以在刚创建的mnt/sd5目录下,像操作本地文件一样操作镜像里面的文件了,这里只是把客户文件打包拷贝出来即可。

  1. #cd ./mnt/sda5
  2. #ls -lh
  3. total 32K
  4. drwxr-xr-x 3 root root 4.0K Aug 4 20:12 home
  5. drwx------ 2 root root 16K Jul 14 2020 lost+found
  6. drwxr-xr-x 8 root root 4.0K Aug 20 16:22 opt
  7. drwx------ 15 root root 4.0K Sep 11 14:19 root
  8. drwxr-xr-x 13 root root 4.0K Jul 14 2020 var

也可以取消挂载,使用umount命令

  1. #umount -v /dev/fuse
  2. umount: /apsarapangu/disk1/sysimage/zsimage/mnt/sda5 (/dev/fuse) unmounted

四 拓展介绍

以上是libguestfs-tools在恢复数据中的一个具体应用,了解一个工具的最好途径就是看官网(http://libguestfs.org/),官网介绍中:
kvm镜像数据恢复 - 图1
还可以使用shell命令模式,有guestfish和virt-resue两种模式,按文档提示试了一下gueshfile,使用还是挺方便的。

  1. guestfish -a m-gg30ga5ak2i50amf4yn3_system.raw进入guestfish shell模式
  2. 执行run,加载镜像
  3. 执行list-filesystems查看分区
  4. mount /dev/sda5 / 把sda5挂在/目录
  5. ls /查看目录

操作视图如下

  1. #guestfish -a m-gg30ga5ak2i50amf4yn3_system.raw
  2. Welcome to guestfish, the guest filesystem shell for
  3. editing virtual machine filesystems and disk images.
  4. Type: 'help' for help on commands
  5. 'man' to read the manual
  6. 'quit' to quit the shell
  7. ><fs> run
  8. â—“ 25% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒═══════════════════════════════════════════════════════════════════════â$<2>â—‘ 75% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒$<2> 100% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒⟧ 00:00
  9. ><fs>
  10. ><fs>
  11. ><fs> list-filesystems
  12. /dev/sda1: vfat
  13. /dev/sda2: ext4
  14. /dev/sda3: ext4
  15. /dev/sda4: ext4
  16. /dev/sda5: ext4
  17. /dev/sda6: ext4
  18. /dev/sda7: swap
  19. ><fs>
  20. ><fs> mount /dev/sda5 /
  21. ><fs> ls
  22. .__deepin.db
  23. home
  24. lost+found
  25. opt
  26. root
  27. var
  28. ><fs>

最后

本文是在云桌面vm启动不了的情况下,使用libguestfs-tools工具直接操作镜像文件,进行数据恢复一次应用记录供大家参考,欢迎大家一起交流。