[Virtualization] VMware ESXi 6.0 iSCSI硬盘分区表丢失

此文适用于正常关机/重启/掉电后,ESXi 6.0主机能够重新连接到正确的iSCSI Target,但是硬盘分区表丢失的情况。

*** !注意! 本文中出现的t10.xxxxxxx以及分区开始和结尾block为示例,请按照自己的实际情况操作,本人不负任何责任 ***

*** 数据无价,请谨慎操作 ***

//实际上适用于所有ESXi硬盘分区表丢失的情况,只不过步骤不大一样

在我的实践中,ESXi主机正常关机后,再开机,连接上iSCSI Target,但却没有分区表,分区表格式为Unknown。如下图所示

https://kb.vmware.com/selfservice/search.do?cmd=displayKC&docType=kc&docTypeID=DT_KB_1_1&externalId=2046610

Google一圈之后在VMware Knowledge Base找到了这篇文章,但是只有针对vSphere 5.x的解决方案,死马当作活马医。

//还有VMware KB最好阅读英文版,中文版丢三落四的

 

  • 开启ESXi主机的SSH功能,并且以root身份登入

 

  • 检测磁盘

输入以下命令,一行

# offset="128 2048"; for dev in `esxcfg-scsidevs -l | grep "Console Device:" | awk {'print $3'}`; do disk=$dev; echo $disk; partedUtil getptbl $disk; { for i in `echo $offset`; do echo "Checking offset found at $i:"; hexdump -n4 -s $((0x100000+(512*$i))) $disk; hexdump -n4 -s $((0x1300000+(512*$i))) $disk; hexdump -C -n 128 -s $((0x130001d + (512*$i))) $disk; done; } | grep -B 1 -A 5 d00d; echo "---------------------"; done

 

所见的输出应该类似:

/vmfs/devices/disks/naa.60060160455025009839a9ed4cfee011
msdos
78325 255 63 1258291200
1 128 1258291124 251 0
Checking offset found at 128:
0110000 d00d c001
0110004
1310000 f15e 2fab
1310004
0131001d 46 43 5f 53 68 61 72 65 64 00 45 76 65 72 5f 47 |old_VMFS3…….|
0131002d 65 74 74 69 6e 67 5f 55 70 00 00 00 00 00 00 00 |…………….|
———————
/vmfs/devices/disks/naa.6006016045502500c20a2b3ccecfe011
gpt
52216 255 63 838860800
Checking offset found at 2048:
0200000 d00d c001
0200004
1400000 f15e 2fab
1400004
0140001d 4a 55 50 48 41 4d 5f 53 52 4d 35 00 00 00 00 00 |new_VMFS5…….|
0140002d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |…………….|
———————

**注意ESXi和普通的Linux系统不一样,普通的Linux系统的硬盘在/dev下,ESXi则是在/vmfs/devices/disks下,一般来讲naa.xxxxxxxxxxxxxxxx是本地磁盘。

你需要在Web UI中或者vSphere Client中找到目标硬盘,并记下他的名称,比如说我这里是t10.945xxxxxxxxxxxxxxxxxxx,然后在上面的输出找

如果你能看到你原来数据存储的名称,那么表明数据还没丢失,如果在这里看不到原数据存储名称的话,那么基本就和数据说拜拜了

我这里就能直接找到了,名称为Musashi0,但是分区表为Unknown。

**Checking Offset的位置,如果显示128则为vSphere 5之前创建的(不包括vSphere 5),2048则为5以后版本创建的

 

  • 设置分区表格式为GPT

**如果在上一步中能看到目标磁盘的分区格式为gpt或者msdos分区表格式,即Partition Format不为Unknown,即可跳过这一步

**在这里我使用的是GPT,如果你使用的MBR(MSDOS)请正确设置

**fdisk无论是在部分Linux发行版中还是在新版本ESXi中都被标记为”DEPRECATED”,请不要使用fdisk,如果要在ESXi主机上对硬盘进行操作请使用partedUtil

执行

partedUtil mklabel /vmfs/devices/disks/t10.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx gpt

再执行一次上面的命令就可以看到分区表格式变成gpt了

  • 获取分区的最后一个block位置

执行

partedUtil getUsableSectors /vmfs/devices/disks/t10.xxxxxxxxxxxxxxxxxxxxxxxxx

可以看到类似输出:

34 838860766

红色部分表示结束block

可以自己算一下看看大小对不对。

 

一般来讲,根据VMware KB,如果能看到正确的输出,执行vmkfstools -V

就能看到正常的硬盘了,如果没有,请继续往下

  • 创建一个临时分区

partedUtil setptbl /vmfs/devices/disks/t10.xxxxxxxxxxxxxxxxxxxxxxxxx gpt "1 2048 4123456 AA31E02A400F11DB9590000C2911D1B8 0"

  • 再次读取分区大小

partedUtil getUsableSectors /vmfs/devices/disks/t10.xxxxxxxxxxxxxxxxxxxxxxxxx

这次应该能得出正确的数值

  • 还原分区

partedUtil setptbl /vmfs/devices/disks/t10.xxxxxxxxx gpt "1 2048 838860766 AA31E02A400F11DB9590000C2911D1B8 0"

*** !红色部分必须要替换为你环境中的数值! ***

再次执行vmkfstools -V应该就能看到分区了

如果还不可以,而且的确能看到原有的vmfs分区名称

可以尝试

https://kb.vmware.com/selfservice/search.do?cmd=displayKC&docType=kc&docTypeID=DT_KB_1_1&externalId=2046610

最后第四部分的方法

 

#########################################################
知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
#########################################################

2 Responses to “[Virtualization] VMware ESXi 6.0 iSCSI硬盘分区表丢失

  • 至今还没遇到过 ESXi 掉电或 SAN 掉电导致丢分区表的情况

    • 掉电丢了还好理解,我这种情况是很恶心的,全都正常关机就没了2333333
      只不过找回来了就好