修复ESXi的快照混乱问题

提示:本文更新于 5159 天前,技术内容可能已发生变化,仅供参考。

在母系统为 ESXi 3.5 的服务器上,有一台 FreeBSD 的客户机。不知为何,该客户机上的十一个快照出现了紊乱的情况。我记得以前在强行删除所有快照时,好像遇到过类似情况。在明白问题状况之后,我第一时间关闭了客户机,并打开了 ESXi 的命令行控制台。在相应的文件夹内,我看到了 FreeBSD8.vmdkFreeBSD8-0000xx.vmdk 等文件,其中 FreeBSD8.vmdk 是镜像最基本的硬盘,而 FreeBSD8-0000xx.vmdk 是每个快照之后的硬盘镜像。

这篇文章是在等待 PORTS 更新和编译的过程中匆忙写成的,可能有些混乱。

一、网络资源的局限性

网络上关于 ESXi 下虚拟硬盘损坏该如何修复的文档很少,虚拟化技术很少人用,所以相应问题及解决方案特别难找,幸好找到了一篇跟今天遇到的情况类似的文章,很勉强地将出问题的硬盘恢复到了第八个快照,9、10、11快照都挂掉了,把相关过程记录下来。

二、查看虚拟硬盘和快照的配置文件

首先,我们大概查看一下虚拟硬盘和快照的配置文件:

cat FreeBSD8.vmdk
# Disk DescriptorFile
version=1
CID=ca6e491c
parentCID=ffffffff
createType="vmfs"
# Extent description
RW 52428800 VMFS "FreeBSD8-flat.vmdk"

# The Disk Data Base
#DDB

ddb.toolsVersion = "0"
ddb.adapterType = "lsilogic"
ddb.geometry.sectors = "63"
ddb.geometry.heads = "255"
ddb.geometry.cylinders = "3263"
ddb.uuid = "60 00 C2 97 58 8b 85 4b-0d 26 c1 0d 18 6f 30 99"
ddb.virtualHWVersion = "4"
cat FreeBSD8.vmdk
# Disk DescriptorFile
version=1
CID=ca6e491c
parentCID=ffffffff
createType="vmfs"

# Extent description
RW 52428800 VMFS "FreeBSD8-flat.vmdk"

# The Disk Data Base
#DDB

ddb.toolsVersion = "0"
ddb.adapterType = "lsilogic"
ddb.geometry.sectors = "63"
ddb.geometry.heads = "255"
ddb.geometry.cylinders = "3263"
ddb.uuid = "60 00 C2 97 58 8b 85 4b-0d 26 c1 0d 18 6f 30 99"
ddb.virtualHWVersion = "4"

这是基本的硬盘配置文件,看起来似乎没有什么问题,理论上可以挂载到虚拟机中直接运行。然而,需要注意的是,这个硬盘里面的内容是相当旧的,也就是第一次做快照之前的内容。

尝试使用 vmkfstools 工具进行操作时,出现了以下错误:

vmkfstools -i FreeBSD8-000011.vmdk recover/newFB8.vmdk
/vmfs/volumes/4c4b73b2-7bd2fabc-31ce-00188b48fd66/FreeBSD8 # vmkfstools -i FreeBSD8-000011.vmdk recover/newFB8.vmdk
Destination disk format: VMFS thick
Failed to open 'FreeBSD8-000011.vmdk': The parent virtual disk has been modified since the child was created (18).
vmkfstools -i FreeBSD8-000011.vmdk recover/newFB8.vmdk
/vmfs/volumes/4c4b73b2-7bd2fabc-31ce-00188b48fd66/FreeBSD8 # vmkfstools -i FreeBSD8-000011.vmdk recover/newFB8.vmdk
Destination disk format: VMFS thick
Failed to open 'FreeBSD8-000011.vmdk': The parent virtual disk has been modified since the child was created (18).

这种错误的出现,是因为如果不将所有的依赖关系修复正确,就会出现 The parent virtual disk has been modified since the child was created (18) 的提示。

接着查看各个快照镜像的配置文件:

cat FreeBSD8-000001.vmdk
# Disk DescriptorFile
version=1
CID=fe461459
parentCID=77039591 //这里开始出问题了
createType="vmfsSparse"
parentFileNameHint="FreeBSD8.vmdk"
# Extent description
RW 52428800 VMFSSPARSE "FreeBSD8-000001-delta.vmdk"

# The Disk Data Base
#DDB

ddb.toolsVersion = "0"
----------------------------------------------------------------------
cat FreeBSD8-000002.vmdk
# Disk DescriptorFile
version=1
CID=004ed653
parentCID=fe461459
createType="vmfsSparse"
parentFileNameHint="FreeBSD8-000001.vmdk"
# Extent description
RW 52428800 VMFSSPARSE "FreeBSD8-000002-delta.vmdk"

# The Disk Data Base
#DDB
ddb.toolsVersion = "0"
----------------------------------------------------------------------
cat FreeBSD8-000003.vmdk
# Disk DescriptorFile
version=1
CID=1d8809e0
parentCID=004ed653
createType="vmfsSparse"
parentFileNameHint="FreeBSD8-000002.vmdk"
# Extent description
RW 52428800 VMFSSPARSE "FreeBSD8-000003-delta.vmdk"

# The Disk Data Base
#DDB

ddb.toolsVersion = "0"
…………
----------------------------------------------------------------------
cat FreeBSD8-000009.vmdk
# Disk DescriptorFile
version=1
CID=997874b0
parentCID=6bc1e139
createType="vmfsSparse"
parentFileNameHint="FreeBSD8-000008.vmdk"
# Extent description
RW 52428800 VMFSSPARSE "FreeBSD8-000009-delta.vmdk"

# The Disk Data Base
#DDB

ddb.toolsVersion = "0"
cat FreeBSD8-000001.vmdk
# Disk DescriptorFile
version=1
CID=fe461459
parentCID=77039591     //这里开始出问题了
createType="vmfsSparse"
parentFileNameHint="FreeBSD8.vmdk"
# Extent description
RW 52428800 VMFSSPARSE "FreeBSD8-000001-delta.vmdk"

# The Disk Data Base
#DDB

ddb.toolsVersion = "0"
----------------------------------------------------------------------
cat FreeBSD8-000002.vmdk
# Disk DescriptorFile
version=1
CID=004ed653
parentCID=fe461459
createType="vmfsSparse"
parentFileNameHint="FreeBSD8-000001.vmdk"
# Extent description
RW 52428800 VMFSSPARSE "FreeBSD8-000002-delta.vmdk"

# The Disk Data Base
#DDB
ddb.toolsVersion = "0"
----------------------------------------------------------------------
cat FreeBSD8-000003.vmdk
# Disk DescriptorFile
version=1
CID=1d8809e0
parentCID=004ed653
createType="vmfsSparse"
parentFileNameHint="FreeBSD8-000002.vmdk"
# Extent description
RW 52428800 VMFSSPARSE "FreeBSD8-000003-delta.vmdk"

# The Disk Data Base
#DDB

ddb.toolsVersion = "0"
…………
----------------------------------------------------------------------
cat FreeBSD8-000009.vmdk
# Disk DescriptorFile
version=1
CID=997874b0
parentCID=6bc1e139
createType="vmfsSparse"
parentFileNameHint="FreeBSD8-000008.vmdk"
# Extent description
RW 52428800 VMFSSPARSE "FreeBSD8-000009-delta.vmdk"

# The Disk Data Base
#DDB

ddb.toolsVersion = "0"

通过简单查看所有快照镜像的配置文件,发现了以下问题:

  • 1 到 11 个快照镜像中间缺失了三个依赖关系。
  • FreeBSD8-000001.vmdk 的父盘 CID 错误。

考虑到要最大程度恢复到最近的磁盘数据,我最初打算先将 FreeBSD8-000001.vmdk 的父盘 CID 更正,再使用 vmkfstools 将快照镜像和虚拟原盘合并拷贝成一个新磁盘。

然而,在执行以下操作时:

/vmfs/volumes/4c4b73b2-7bd2fabc-31ce-00188b48fd66/FreeBSD8 # vmkfstools -i FreeBSD8-000011.vmdk recover/newFB8.vmdk
Destination disk format: VMFS thick
Cloning disk 'FreeBSD8-000011.vmdk'...
Clone: 5% done.Failed to clone disk : Read beyond the end of file (2311).
/vmfs/volumes/4c4b73b2-7bd2fabc-31ce-00188b48fd66/FreeBSD8 # vmkfstools -i FreeBSD8-000011.vmdk recover/newFB8.vmdk
Destination disk format: VMFS thick
Cloning disk 'FreeBSD8-000011.vmdk'...
Clone: 5% done.Failed to clone disk : Read beyond the end of file (2311).

最新的一个快照镜像在 5% 的时候就出现了问题,报错 2311,提示 Read beyond the end of file。我尝试了很多办法,但都没有效果。

之后偶然发现了一个帖子,其中的内容如下:

For me, the problem was that the block count for the drive (RW number in.vmdk file) didn't match the actual size of the -flat.vmdk file.
Power off the Virtual Machine.
In Service Console, do ls -l to see the size of the machinename+-flat.vmdk+ file. Divide the value by 512. The result should be the RW number which goes into machinename+.vmdk+ file. Don't change the geometry parameters in the.vmdk file!!
Try vmkfstools -i now, should besuccessfull now.
Do necessary changes you want in the Properties of the Virtual Machine (or edit.vmx file directly)
Power on the Virtual Machine
For me, the problem was that the block count for the drive (RW number in.vmdk file) didn't match the actual size of the -flat.vmdk file. 
Power off the Virtual Machine. 
In Service Console, do ls -l to see the size of the machinename+-flat.vmdk+ file. Divide the value by 512. The result should be the RW number which goes into machinename+.vmdk+ file. Don't change the geometry parameters in the.vmdk file!!
Try vmkfstools -i now, should besuccessfull now.
Do necessary changes you want in the Properties of the Virtual Machine (or edit.vmx file directly) 
Power on the Virtual Machine

但是经过排查,发现并非是因为错误的大小导致的,所以只能放弃使用最新的快照。

当尝试使用第十个快照镜像恢复时,又出现了新的错误:

/vmfs/volumes/4c4b73b2-7bd2fabc-31ce-00188b48fd66/FreeBSD8 # vmkfstools -i FreeBSD8-000010.vmdk recover/newFB8-10.vmdk
Destination disk format: VMFS thick
Cloning disk 'FreeBSD8-000010.vmdk'...
Clone: 23% done.Failed to clone disk : Input/output error (327689).
/vmfs/volumes/4c4b73b2-7bd2fabc-31ce-00188b48fd66/FreeBSD8 # vmkfstools -i FreeBSD8-000010.vmdk recover/newFB8-10.vmdk
Destination disk format: VMFS thick
Cloning disk 'FreeBSD8-000010.vmdk'...
Clone: 23% done.Failed to clone disk : Input/output error (327689).

这个 Input/output error (327689) 是明显的 I/O 错误,这意味着要恢复的可能性不大,而且即使可行,过程也会相当麻烦。所以,只能忍痛使用更老的版本。

最后,使用以下命令进行恢复操作:

/vmfs/volumes/4c4b73b2-7bd2fabc-31ce-00188b48fd66/FreeBSD8 # vmkfstools -i FreeBSD8.vmdk recover/newsysdisk.vmdk
Destination disk format: VMFS thick
Cloning disk 'FreeBSD8.vmdk'...
Clone: 92% done.
/vmfs/volumes/4c4b73b2-7bd2fabc-31ce-00188b48fd66/FreeBSD8 # vmkfstools -i FreeBSD8.vmdk recover/newsysdisk.vmdk
Destination disk format: VMFS thick
Cloning disk 'FreeBSD8.vmdk'...
Clone: 92% done.

即使这样,同样遇到了 I/O 错误,直到使用第 8 个快照才成功还原出一个完整的虚拟硬盘。挂载系统之后,发现硬盘上的内容是一个月前的。幸运的是,其他重要数据磁盘和日志磁盘使用的是独立模式,不依赖于快照的虚拟磁盘。这次的经历让我对 ESXi 的快照功能感到非常失望,因为它带来了很大的麻烦。

不推荐使用 ESXi 的快照功能的原因如下

  • 一是使用快照的 ESXi 客户机系统会严重降低性能。这可能是因为在使用快照功能后,原本定长的虚拟硬盘文件变成了动长文件,导致系统在读取和写入数据时性能下降,因为系统需要处理文件的动态扩展,这在 2010 年的 ESXi 3.5 中可能没有得到很好的优化。
  • 二是快照功能容易莫名其妙地出现紊乱,尤其是在创建十几个快照之后,一旦维护人员操作稍有失误,后果不堪设想。

三、进入 ESXi 命令行的方法

为了方便大家进入 ESXi 的命令行,这里提供一个方法:按 Alt-F1(切换控制台),输入 unsupported(输入时无回显内容),然后按回车键,这样就可以激活本地控制台提示符。之后,输入 root 密码,接着就能进入 ESXi 主机的本地控制台界面。


「倘若有所帮助,不妨酌情赞赏!」

Holmesian

感谢您的支持!

使用微信扫描二维码赞赏


相关文章

发表新评论
仅有 1 条评论
  1. 小说库

    http://www.seomimic.com/成都SEO表示很关注你的博客,并且希望能和博主交换友情链接

    小说库 回复