此文适用于正常关机/重启/掉电后,ESXi 6.0主机能够重新连接到正确的iSCSI Target,但是硬盘分区表丢失的情况。
*** !注意! 本文中出现的t10.xxxxxxx以及分区开始和结尾block为示例,请按照自己的实际情况操作,本人不负任何责任 ***
*** 数据无价,请谨慎操作 ***
//实际上适用于所有ESXi硬盘分区表丢失的情况,只不过步骤不大一样
在我的实践中,ESXi主机正常关机后,再开机,连接上iSCSI Target,但却没有分区表,分区表格式为Unknown。如下图所示
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分区名称
可以尝试
最后第四部分的方法
#########################################################
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
#########################################################
Comments
2 responses to “[Virtualization] VMware ESXi 6.0 iSCSI硬盘分区表丢失”
至今还没遇到过 ESXi 掉电或 SAN 掉电导致丢分区表的情况
掉电丢了还好理解,我这种情况是很恶心的,全都正常关机就没了2333333
只不过找回来了就好