一 背景
某专有云客户在使用云桌面过程中,有一云桌面启动不了了,客户想把该桌面内的数据拷贝出来。使用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安装,安装命令
yum -y install libguestfs-tools
支持win镜像还需要安装libguestfs-winsupport
yum install libguestfs-winsupport
三 数据恢复
3.1 查看镜像
使用virt-ls查看镜像格式为:
virt-ls -a 镜像名 目录
如查看测试镜像:
#virt-ls -a x86_asp_win_0001_001_001_020.raw /$Recycle.BinBOOTNXTBootCloudMusicDocuments and SettingsLogtailDataPerfLogsProgram FilesProgram Files (x86)ProgramDataRecoverySystem Volume InformationUsersWindowsbootmgrcachemaservicepagefile.syswarnings
可以使用virt-ls —help查看具体使用方法。上面不是客户的镜像,客户镜像使用virt-ls报错,提示性信息如下:
#virt-ls -a m-gg30ga5ak2i50amf4yn3_system.raw /virt-ls: multi-boot operating systems are not supportedIf using guestfish '-i' option, remove this option and insteaduse the commands 'run' followed by 'list-filesystems'.You can then mount filesystems you want by hand using the'mount' or 'mount-ro' command.If using guestmount '-i', remove this option and choose thefilesystem(s) you want to see by manually adding '-m' option(s).Use 'virt-filesystems' to see what filesystems are available.If using other virt tools, multi-boot operating systems won't workwith these tools. Use the guestfish equivalent commands(see the virt tool manual page).
提示virt-ls不支持多分区镜像,需要使用virt-df查看镜像到底有几个分区,命令格式:virt-df -a + 镜像名,客户镜像名m-gg30ga5ak2i50amf4yn3_system.raw,操作如下:
#virt-df -a m-gg30ga5ak2i50amf4yn3_system.rawFilesystem 1K-blocks Used Available Use%m-gg30ga5ak2i50amf4yn3_system.raw:/dev/sda1306584 4 306580 1%m-gg30ga5ak2i50amf4yn3_system.raw:/dev/sda21515376 159332 1261020 11%m-gg30ga5ak2i50amf4yn3_system.raw:/dev/sda315416264 9567468 5045980 63%m-gg30ga5ak2i50amf4yn3_system.raw:/dev/sda415416264 8685476 5927972 57%m-gg30ga5ak2i50amf4yn3_system.raw:/dev/sda527948116 7396660 19108692 27%m-gg30ga5ak2i50amf4yn3_system.raw:/dev/sda610255636 7257628 2457336 71%
可以看到问题镜像有6个分区,sda1~sda6。
3.2 分区挂载
确定镜像有6个分区后,可以使用guestmount把分区挂载出来,挂载命令格式:
guestmount -a 镜像 -m 分区 —rw 挂在路径
这里先把镜像的“/dev/sda5”分区挂载出来,操作如下。
先在本地创建挂载路径
#mkdir -p ./mnt/sda5
然后执行挂载命令
命令格式:gustmount -a 镜像名 -m 分区 —rw 路径,具体操作如下:
#guestmount -a m-gg30ga5ak2i50amf4yn3_system.raw -m /dev/sda5 --rw ./mnt/sda5/
操作成功,使用df命令查看,可以看到已经挂载出来了。
#df -h|grep mnt/dev/fuse 27G 7.1G 19G 28% /apsarapangu/disk1/sysimage/zsimage/mnt/sda5
可以在刚创建的mnt/sd5目录下,像操作本地文件一样操作镜像里面的文件了,这里只是把客户文件打包拷贝出来即可。
#cd ./mnt/sda5#ls -lhtotal 32Kdrwxr-xr-x 3 root root 4.0K Aug 4 20:12 homedrwx------ 2 root root 16K Jul 14 2020 lost+founddrwxr-xr-x 8 root root 4.0K Aug 20 16:22 optdrwx------ 15 root root 4.0K Sep 11 14:19 rootdrwxr-xr-x 13 root root 4.0K Jul 14 2020 var
也可以取消挂载,使用umount命令
#umount -v /dev/fuseumount: /apsarapangu/disk1/sysimage/zsimage/mnt/sda5 (/dev/fuse) unmounted
四 拓展介绍
以上是libguestfs-tools在恢复数据中的一个具体应用,了解一个工具的最好途径就是看官网(http://libguestfs.org/),官网介绍中:
还可以使用shell命令模式,有guestfish和virt-resue两种模式,按文档提示试了一下gueshfile,使用还是挺方便的。
- guestfish -a m-gg30ga5ak2i50amf4yn3_system.raw进入guestfish shell模式
- 执行run,加载镜像
- 执行list-filesystems查看分区
- mount /dev/sda5 / 把sda5挂在/目录
- ls /查看目录
操作视图如下
#guestfish -a m-gg30ga5ak2i50amf4yn3_system.rawWelcome to guestfish, the guest filesystem shell forediting virtual machine filesystems and disk images.Type: 'help' for help on commands'man' to read the manual'quit' to quit the shell><fs> runâ—“ 25% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â$<2>â—‘ 75% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒$<2> 100% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒⟧ 00:00><fs>><fs>><fs> list-filesystems/dev/sda1: vfat/dev/sda2: ext4/dev/sda3: ext4/dev/sda4: ext4/dev/sda5: ext4/dev/sda6: ext4/dev/sda7: swap><fs>><fs> mount /dev/sda5 /><fs> ls.__deepin.dbhomelost+foundoptrootvar><fs>
最后
本文是在云桌面vm启动不了的情况下,使用libguestfs-tools工具直接操作镜像文件,进行数据恢复一次应用记录供大家参考,欢迎大家一起交流。
