最近发现家里的All in one小主机上有几个服务运行异常,尝试ssh到虚拟机内进行修复,结果发现即使是使用`cat`命令查看文件也显示Input/output error,多敲了几个回车之后shell被服务端终止,同时登录到PVE平台查看虚拟机被异常停止,无法重启,心想可能坏事了,随之对服务器进行了全面的检查。
经过排查,发现主机上的硬盘出现故障,S.M.A.R.T运行状态为Failed,详细信息显示硬盘的备用空间已经耗尽。
关于这块硬盘的插曲
- 这块硬盘实际上使用只有一年半,但是Power On Hours显示我用了2.3年…经过与厂家一顿拉扯,最终给了我一个答复说是FW固件问题….好处是直接退货了,坏处是,厂家真耍流氓啊..
抢救数据
已知硬盘挂了且无法修复,接下来就是试图抢救数据,首先是将整个虚拟机下载到本地做备份:
尝试使用qemu-img对qcow2文件进行修复
尝试对这个qcow2文件进行修复,使用qemu-img info
命令查看文件状态:
使用qemu-img check -r all
进行修复。从结果可以看到修复是失败的,只能合理怀疑因为SSD的损坏导致写/读的数据块异常,且无法进行修复了。
尝试通过转换格式修复qcow2
尝试通过qemu-img convert
转换qcow2成为vmdk或者img格式对文件进行修复,修复失败。从错误信息中也可以看到报错出现了Input/output error。
使用qemu-nbd挂载镜像结合dd恢复文件(有效)
在各种常见方法均失效后,只剩使用qemu-nbd
的方式挂载qcow2进行数据抢救恢复这一条路了,具体操作如下:
- qemu-nbd -d /dev/nbd0 #创建一个nbd设备,部分时候你需要先应用nbd模块
- 挂载qcow2文件到/dev/nbd0
- 若需要恢复文件的虚拟机vgname和现运行的操作系统vgname相同,则需要修改其中一个,避免后续无法指定到正确的vg
挂载完成后对挂载的/dev/nbd0进行扫描,从而识别到对应的vg/lv
用只读的方式将需要恢复数据的qcow2挂载mount到虚拟机内:
挂载完成后,使用dd命令将mount的文件夹拷贝成一个虚拟磁盘镜像文件,需要注意的是,图中的命令是错误的:
bs=1M
的block太大,建议改成默认或者更小,否则会导致当碰到坏块时整个块的文件都没有了,在我的实际情况中碰到的是/var/lib的文件夹入口丢失,没办法直接找到文件。- status应该是
noerror,progress
,否则碰到错误就会停止执行
实际正确的执行完成截图:
完成dd后,我是使用了diskgenius对虚拟磁盘镜像打开,成功恢复了数据:
后记
还好当时发现的早并及时的同步了qcow2文件到本地,在下载文件的同时,PVE的web界面和ssh同时宕机,无法通过任何方式访问。若我没有及时下载,则数据的恢复难度将会更大或无法恢复…
发表回复