记SSD挂掉后ESXI及DSM虚拟机的数据拯救
更新日期:
情景
2018年3月22日(星期四) 晚上11:05,收到跑在ESXI上的DSM虚拟机ptbsare-nas发来的邮件通知如下:
1 | 亲爱的用户: |
紧接着又收到邮件通知:
1 | 亲爱的用户: |
当时虚拟机的硬件配置如下:
1 | CPU:INTEL J3455 (vt-d) |
ESXI
上的一块SANDISK SSD
做主存储池放置若干虚拟机的虚拟硬盘,机械硬盘全部通过PCIE
扩展直通连接DSM
虚拟机ptbsare-nas
。
拆下磁盘
由于虚拟机的RAID Group 2
是运行在ESXI
上的虚拟硬盘而并非实际做备份数据主存储的机械硬盘,因此大概知道是ESXI
的数据存储区介质SSD
出了问题。果不其然,使用Watchlist
登入ESXI
在EVENT
里面发现了这么一条:
1 | Device or filesystem with identifier device_ID has entered All Paths Down state. |
并且此时ESXI
反应异常的慢,过了一会儿,Watchlist
被迫退出;尝试ping
上面跑的虚拟机,完全ping
不通,ESXI
管理网络端口暂时还能ping
通,但网页端已经无法登入(Connection Refused
)。
无奈强制硬重启主机,启动后ESXI
网页端可以进入了,但是发现主储存区已经消失,系统没有存储区,上面的若干台虚拟机全部失效。SSH
进去也未发现该SSD
磁盘,那么此时只能断定SSD
是挂掉不认盘了,关机,关电源,点开机键放电后取下SSD
插到自己另一台PC主机上,开机进入PC主机的Manjaro
系统,好在还能看到该磁盘,赶紧使用dd
镜像下来:
1 | sudo dd if=/dev/sdd of=esxi_123.img bs=8M |
那么就得到了一个大小为120GB
的磁盘镜像esxi_123.img
。(咦,为何是120GB,该磁盘标称128GB,当时觉得奇怪,疑似假盘。)
然后就可以安心关机取下该硬盘放到一边了。
数据拯救
VMFS数据拯救
由于ESXI
的存储池使用的是专有文件系统VMFS
,在Linux
下无法通过mount
命令直接挂载:
1 | ~/下载 >>> fdisk -l -u esxi_123.img |
需要首先安装vmfs-tools
这个工具进行文件系统挂载,Archlinux
或Manjaro
下可以用如下命令安装:
1 | yaourt -S vmfs-tools |
安装后,首先计算该磁盘第一个VMFS
分区的起点偏移量,即拿单元字节512
乘以分区起点单元号128
:
1 | ~/下载 >>> expr 128 \* 512 |
然后可以使用losetup
进行虚拟设备挂载,使用-o
选项指定偏移量offset
:
1 | sudo losetup -o 65536 /dev/loop1 esxi_123.img |
然后挂载文件系统(同时注意vmfs-tools
只是vmfs
的一个开源实现,目前只能支持只读挂载,并不能写入VMFS
分区):
1 | sudo vmfs-fuse /dev/loop1 /mnt |
接着,我们以root
进入/mnt
就可以看到大量文件及虚拟机磁盘:
1 | ~/下载 >>> su [1] |
先将这些虚拟机目录及磁盘拷贝出来再做恢复吧。
虚拟磁盘数据拯救
打包服务器
由于拷贝出来的是若干个vmdk
文件,因此还是一样的思路,首先用fdisk
判断磁盘分区信息,然后计算偏移量挂载。这里以ptbsare-manjs
为例,该虚拟机是一个用来做Archlinux
编译打包服务器的虚拟机,主磁盘用的是ext4
文件系统
1 | sudo umount /mnt |
后来这个磁盘绝大多数数据都能拷贝出来,有几个无关紧要的系统文件提示丢失,算是万幸没有数据损失。
壁纸服务器BTRFS数据恢复
DSM的RAID一致性检查
另一个做SMB
共享的壁纸服务器就不妙了,里面有若干千张壁纸,使用的文件系统是BTRFS
,在拷贝的时候发现大量Input/Output Error
,遂停止拷贝,先行恢复文件系统。首先做好原vmdk
的备份,由于这个时候已经到货了一个新的固态硬盘,所以就新建虚拟机带着这个vmdk
使用Manjaro
的LiveCD
启动做恢复了。
倘若该BTRFS
分区是阵列的一部分(例如DSM
的默认行为),在系统启动后,倘若是比较新的内核可以用如下命令进行RAID
一致性检查并修复错误:
1 | sudo echo check > /sys/block/mdX/md/sync_action |
并且使用如下命令确定是否检查完毕:
1 | echo cat /sys/block/mdX/md/sync_completed |
BTRFS文件系统错误恢复
如果直接挂载成功那么可以下一步了。如果默认挂载不成功的话,我们首先尝试recovery挂载:
1 | sudo mount -t btrfs -o recovery,ro /dev/<device_name> /<mount_point> |
使用btrfs restore
先尝试恢复出来文件:
1 | sudo btrfs restore /dev/<device_name> ~/btrfs_data_restore |
在可写挂载后,可以尝试修复文件系统错误(直接写入磁盘,慎用,先做好备份):
1 | sudo btrfs check --repair /dev/<device_name> |
最后觉得修复效果并不理想,索性放弃,该卷最终永久损失了33
张壁纸。
题外后记
后经查证发现售卖损坏SSD
的淘宝店铺改为卖衣服的了,无任何售后,官网查证为假冒产品。
经验教训
- 重要数据不能放到
SSD
里面,因为SSD
在挂掉之前毫无征兆且挂掉之后很有可能即全盘皆丢失,难以恢复。放SSD
的数据即做好随时丢失的心理准备。重要数据必须放SSD
的觉得应该组建RAID1
以保证可靠性。 - 重要数据还是尽量不要用
BTRFS
文件系统,使用更成熟的ext4
,实测相比之下BTRFS
虽然有快照、子卷等花哨功能,但数据恢复难度极大,很容易丢数据,ext4
就好许多。 - 购买
SSD
还是要在官网真伪验证,购买联保品牌如SanDisk
、INTEL
等,店保一点不可靠。