使用vSphere Client冷迁移失败,没有显示具体原因。虚拟机启动之后,在虚拟机中收到磁盘错误。猜测是磁盘损坏导致的。
使用ssh命令登录到ESXi中,尝试对.vmdk文件复制,当复制到2/3时(虚拟机迁移也是大约在这时),产生I/O错误。因此更加怀疑存在坏区。
目前的情况是这样的:
(1)由于ESXi中没有badblock命令。 (2)虽然由smartd服务,但是我对smart并不是非常熟悉。 (3)另外,也不知道ESXi有没有提供相关的坏块检测功能。
在条件允许的情况下,我们决定脱机处理(从安装到USB的Debian启动,在非ESXi系统中维护)。
从USB启动,进入Linux系统,执行apt-get install vmfs-tools命令。(详细步骤略过)
将U盘插入物理机,启动U盘中的Linux系统,对磁盘运行badblocks(1)命令:
#!/bin/sh badblocks -v /dev/sda > /mnt/sda-bad-blocks.txt
然后,非常顺利的检测到四个坏块(使用smartmontools检测也显示存在坏块)。坏块被记录在/mnt/sda-bad-blocks.txt文件中。
既然磁盘存在坏块,那如何确定坏块影响了哪些文件呢?
#!/bin/sh # 获取文件系统块大小 debugvmfs /dev/sdb1 show # 输出中Block Size为1M大小 badblocks -b 1048576 -v /dev/sdb1 > /mnt/sda-bad-blocks.txt # 进入只读测试,并将坏块结果写入文件。
在运行结束之后,我们检测到一个坏块,621317。这与「检测到四个坏块」并不冲突,因为块大小不同(前者默认1024字节,后者指定1048576字节)。
接下来就是确定受该坏块影响的文件。
底层技术向来复杂……事情是这样的,坏块检测是文件系统无关的,而文件定位是文件系统相关的。所以,不同文件系统要使用不同处理工具(例如,在ext2/ext3/ext4中使用debugfs命令),而ESXi使用VMFS系统,需要使用vmfs-tools中的debugvmfs命令,但是该命令版本过旧,而且手册描述与实际功能不符合。所以,指望不上debugvmfs命令。
而在ESXi中,内置debugfs工具,该工具可以用于调试文件系统,但是我不会用,也没有找到相关手册。
TODO 关于VMFS文件系统的调试方法
如果文件损坏,单纯进行cp命令并不能成功,可能会返回I/O错误。可以尝试使用一些工具进行恢复:
#!/bin/sh # 使用ddrescue命令 # 但是这需要从Linux启动,然后访问存储 ddrescue --direct --retrim --max-retries=3 /dev/hda1 imagefile logfile
在Windows下,可以使用「HDD Raw Copy Tool」工具。
!!!不建议使用dd if=fileWithBadBlocks of=recoveredFile bs=4k conv=noerror,sync命令。因为使用noerror选项后,在读取失败时,会用NUL进行填充。
「VMware ESXi」- 虚拟机版本与主机“x.x.x.x”的版本不兼容
List bad blocks and affected files
Solved: Disk with bad sectors -- how to get data out?
How can I find out which files are lost through a ddrescue recovery atempt?
Recovering a file with bad blocks in the middle
open Stack及VM虚拟机和其他平台虚拟机迁移至 VMware vSphere(esxi)虚拟化平台骨灰级后台磁盘替换法迁移...
使用 VMware vCenter Server(vSphere Client)迁移 ESXi 虚拟机
使用 VMware vCenter Server(vSphere Client)迁移 ESXi 虚拟机
迁移 VMware ESXi 上的 Windows 虚拟机到 KVM
VMware ESXI磁盘下载虚拟机迁移到另一台VMware ESXI
服务器镜像还原虚拟机,ESXI-通过-flat.vmdk文件恢复VMware虚拟机映像文件vmdk