大概是没法重现的问题: VBox 折腾 VHD 时出现数据损坏和虚拟机启动时崩溃问题

2018-08-20 07:05:05 +08:00
 acess
具体折腾操作过程我自己也不记得了,再加上 LZ 用了比较不正常的东西……所以问题很可能是重现不了了。

宿主 Win10 x64 1803,VirtualBox 5.2.16 。
(还用了 VBoxHardenedLoader 来避免虚拟机检测,为了这个,宿主机还用 UPGDSED 关掉了 DSE 和 PatchGuard )
虚拟机用的是 Win7 x64,虚拟磁盘用的是微软的 VHD 格式,而不是 VBox 原生的 VDI 格式。
因为没装虚拟机附加组件,不方便拷文件,就用了一种蛋疼的办法:
首先让虚拟机正常关机,然后在宿主机上双击挂载 Snapshots 里的 VHD,挂载完就可以执行拷进 /拷出文件,以及其他操作(比如先用 sdelete 把虚拟盘的可用空间清零,再把 VHD 压缩)。操作完后右键卸载 VHD,就可以再启动虚拟机了(如果不卸载也不能启动虚拟机,提示文件被占用)。

来来回回这么折腾几次后,似乎就开始出问题了:宿主机拷进 VHD 的文件,在虚拟机启动后,似乎是损坏的。

而且,有的时候(我记得好像是刚刚新建快照的时候),VBox 新建的差分 VHD 在宿主机是不能双击挂载的,会报错;只有正常启动过一次虚拟机、再关机,那个 VHD 才能正常在宿主机双击挂载。

光是这个可能还不算什么……有一次,虚拟机刚开始启动时,居然直接弹出“老人坐禅”的报错窗口,崩溃掉了……
我当时那个懵逼啊……虚拟机里各种折腾,比如 bootsect /nt60 sys /mbr,没用……最后发现问题好像是在 100MB 的那个“系统保留”分区上——这个分区是活动分区,存放的是 bootmgr、BCD 等引导文件——我把它格式化一次(非快速格式化),再重新 bcdboot,貌似就好了。

总之……我猜,要么是因为我在宿主机双击挂载 VHD 这个动作触发了 VBox 的 Bug ;要么就是 UPGDSED、VBoxHardenedLoader 的魔改导致了问题。

发到这里的意义可能也不是很大,大概只是想问问有没有别人也试过宿主机双击挂载 VHD 这种骚操作,然后碰到问题的……
此外,出现这个情况有点让我担心 VBox 的可靠性,因为我曾在一位大佬的博客上看到过疑似 VBox 出问题导致数据损坏的案例: https://ring0.me/2015/05/recover-code-from-corrupt-git-repo/
4204 次点击
所在节点    VirtualBox
13 条回复
daigouspy
2018-08-20 07:07:56 +08:00
浪费生命,你直接开个 smb 就能复制文件了嘛,费那劲干嘛
acess
2018-08-20 07:11:33 +08:00
@daigouspy
试过用网络复制文件,可能是因为没有虚拟网卡驱动的原因,速度很慢。
另外,LZ 对 SMB 这种东西没有太多好感,因为我印象里这玩意经常出现“找不到网络路径”等玄学问题(好吧这个可能不是 SMB 本身的锅),还爆过漏洞……
liangzi
2018-08-20 07:19:05 +08:00
复制文件 直接安装 增强功能 然后虚拟机里把光盘装上 设置一下共享路径就可以了
acess
2018-08-20 07:24:58 +08:00
@daigouspy
忘了说了…… VBoxHardenedLoader 安装指南里特别提到不能装虚拟网卡,所以我才没装——虽然我也不知道这背后有啥玄学因素……
除此之外,我记得还有一个强迫症因素:这么折腾之后,宿主机 Win10 自带防火墙似乎不能完全阻止 VBox 进程访问网络(至于本机回环……额,貌似本地回环完全是无视掉自带防火墙的?),好像只能挡住 TCP 和 UDP,不能挡住其他协议,比如 ping 1.1.1.1 这个就是通的。

@liangzi
折腾 VBoxHardenedLoader 就是为了避开虚拟机检测,据 VBoxHardenedLoader 的安装指南,宿主机是不能装增强功能的,否则就会有 N 种办法来检测虚拟机,使得之前的各种反检测折腾前功尽弃……
acess
2018-08-20 07:26:18 +08:00
@liangzi 打错了,是虚拟机不能安装增强功能,不是宿主机不能装😂
kokutou
2018-08-20 07:45:53 +08:00
Snapshots 是
kokutou
2018-08-20 07:46:47 +08:00
@kokutou
Snapshots 是不能拷文件的,差分备份不是基于文件的。。。拷了肯定坏。。。。
acess
2018-08-20 07:51:20 +08:00
@kokutou
不能么?
我加载的不是源 VHD,是差分 VHD。
我看每创建一个快照,Snapshots 里就会多一个差分 VHD,然后虚拟机启动后修改的也是这个 VHD 啊……既然虚拟机能改这个 VHD,宿主机为什么就不行呢?
Osk
2018-08-20 07:52:22 +08:00
我用的 hyper-v,也是直接挂载 avhd/avhdx 拷贝文件,没有遇到过问题。。。
kokutou
2018-08-20 07:56:42 +08:00
@acess
改的方法不一样。。。
一旦用了 snapshots,源和差分都不能改,改了就挂。
kokutou
2018-08-20 07:59:27 +08:00
@acess
别想当然式地应用一些操作,网上可能会说能挂载 VHD 添加修改文件,可是没说可以挂载差分 VHD 修改文件。
acess
2018-08-20 08:16:01 +08:00
@kokutou
我还是觉得“源和差分都不能随便改”这个说法似乎有点玄乎……
请问有官方文档之类的参考资料链接么?

我印象里,差分 VHD 里已经记录了父级 VHD 的信息,所以,一旦修改源(准确地说,应该是父级) VHD,HyperV 等虚拟机软件就会警告 /报错;而且,Windows 也支持直接挂载差分 VHD ……
VBox 也从没因为我的这种挂载快照中差分 VHD 的操作直接给我报过错。
难道 VBox 自己还在某个地方保留了一个神秘的差分配置?或者说,VBox 读写差分 VHD 的方式和微软不一样?
acess
2018-08-20 08:32:07 +08:00
@kokutou
我猜 VHD 的数据结构里应该含有类似时间戳的字段,每次写入都更新一下。这样的话,把源 VHD 里记录的值和差分 VHD 里记录的值对比,就可以发现源 VHD 是否已经被修改了。
总之……我觉得,应该不需要依赖外部的什么配置来维持差分 VHD 正常工作。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/481285

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX