VMFS文件系统数据删除恢复阶段性成果

转载地址: http://www.intohard.com/article-582-1.html


0X01 VMFS文件系统

  VMware VMFS (Virtual Machine File System) is VMware, Inc.’s clustered file system used by the company’s flagship server virtualization suite, vSphere. It was developed to store virtual machine disk images, including snapshots. eg:VMFS6 is used by vSphere 6.5.

  VMFS is the formatting (like NTFS/EXT3/FAT/FAT32) used for a partition on the ESX Host. A VMFS volume is used to store virtual Machines. Virtual Machines are stored in the VMDK format (onto the VMFS volume). So the disks of a virtual machine are stored as VMDK files on a VMFS volume on the ESX host.


0X02 VMFS文件系统数据删除恢复

  前阶段,遇到个客户,客户ESX4.0的服务器,文件系统VMFS3,删除了一个96G左右的VMDK,客户要求,重新启动。第一次遇到vmfs的,网上资料少的可怜,但是还好,官方的一些资料以及开源的vmfstools给予了本次恢复莫大的帮助。

  首先看看客户盘中现存的vmdk的情况,vmdk的碎片量非常大,几个vmdk都看了一下碎片后,碎片总量在800-10000之间,因此对flat的vmdk做碎片基本是不可能了,只能从文件系统存储角度考虑。

  记得夜里加班的时候,我给我同事写过四句话,这四句话其实可以概括了,所有的文件系统类型的反删除恢复的基本操作步骤,当然,如果你对本文件系统相当了解的情况下,也可以直接跳过去,分享下四句话:

1. 文件系统如何读文件?
2. 删除文件的时候发生了什么,是否会干掉所有pointer(类似fat那样)?
3. 哪些系统元数据是与数据指向有关的?(与编程一样,都是靠pointer来实现寻址)
4. 制作一个工具,逆向这些步骤,你就可以恢复出来了。

  因此,通过上诉四句话,我们基本上可以了解了从一个未知的文件系统中恢复数据的基本逻辑步骤,因此作为第一步,我们需要一个测试环境,能够让我们随意的创建和删除文件用,因此我把ESXI安装在了虚拟机中,作为分析,逐步解开vmfs的删除操作之谜
VMFS文件系统数据删除恢复阶段性成果

  这个是我测试用的vmfs文件系统,通过不断反复几十次的增,删,改,查的方式,我们发现两个箭头中所指向的文件应该是恢复的重点。.fdc.sf(=file descriptor cluster.system file英文全称,这样好记一点,主要负责存储文件元数据以及一级索引),pbc.sf = pointer block cluster.system file,主要存储2级索引。下面是我们测试的结果:

当我们删文件的时候发生了什么?
1. 文件的目录项(包含名称以及record id等信息)会被直接清空掉(搞不懂为何要用这种这么低效的办法,对于文件数量庞大的存储,vmfs绝对是噩梦,还好只是少量的vmdk)
2. 一级索引会被直接清空。因此小文件是无法通过索引恢复的。

那么一级和二级索引在文件删除时发生了什么?
  一级索引,只有256个槽位,每个索引都是u_int32,因此一共可以存放256个索引,我们测试了一下,在默认情况下,一个vmfs的block的大小是1m的情况下,一级索引能够承载的最大文件就是256M,如果文件一旦大于这个量一级索引就不会直接在指向数据区,而是改到二级索引位置由二级索引完成数据指向,从而达到扩展索引槽位的目的。当发现这个信息的时候,我们就激动了,因为vmdk基本不可能那么小,都是上百G,因此所有的二级索引都会被保留下来,通过对PBC中的二级索引进行提取即可完成所有碎片的搜集和恢复工作。


备注:使用Linux vmfs-tools挂载访问VMFS文件磁盘,即可将其中的文件复制出来,参考教程[1]