前几天RHRL中的qemu-KVM的一个虚拟机上面安装的window
server系统不知因为中毒还是什么原因,一打开就卡死,懒得去找原因直接重建一个。Linux可以直接从KVM虚拟机的镜像文件(**.img)中将虚拟机文件系统中的文件读取出来,下面记录一下解决的过程。
首先要将虚拟机关闭,使用file命令查看镜像的格式eg: file
windows.img,得到的结果可能是raw格式的也可能是qcow2格式的。我的是qcows格式的,这种格式的也可以直接挂载但是要用到KVM-ndb工具,而不一定所有版本的Linux都支持NDB模块,非要用的话还要进行内核的重编译,相对比较麻烦。不如直接把qcow2的合适转化成raw格式,可以用qemu-img命令eg
:
qemu-img convert -O raw -f qcow2 linux-6-x86_64.img linux-6-x86_64_bak.img
,这样得到的linux-6-x86_64_bak.img 是前者的备份但是已经变成了raw格式。
下面要用到loop设备,loop
设备是一种伪设备(pseudo-device),或者也可以说是仿真设备。它能使我们像块设备一样访问一个文件。首先使用命令
losetup -f
看看有哪些是空闲的,一般找到的是/dev/loop0设备,下面将loop0设备与之前的镜像关联起来,eg:losetup
/dev/loop0 kvm/linux-6-x86_64_bak.img
,现在loop0就是一个虚拟的设备,我们可以将它挂载,kpartx -av
/dev/loop0可以查看它的分区,然后可以分别挂载它的不同的分区,mount /dev/mappper/loop0p1
/mnt 这边的loop0p1即它的第一个分区。
最后,如果虚拟机安装的是linux系统还好,如果里面是windows系统,它的文件系统是NTFS格式的,不能直接安装,安装一个叫NTFS-3g的软件,安装好后mount
-t ntfs-3g /dev/mappper/loop0p1
/mnt 就OK了,现在进入/tmp目录就可以查看虚拟机中的文件了。