V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Changelog
acess
V2EX  ›  VirtualBox

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

  •  
  •   acess · 2018-08-20 07:05:05 +08:00 · 4167 次点击
    这是一个创建于 2047 天前的主题,其中的信息可能已经有所发展或是发生改变。
    具体折腾操作过程我自己也不记得了,再加上 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/
    13 条回复    2018-08-20 08:32:07 +08:00
    daigouspy
        1
    daigouspy  
       2018-08-20 07:07:56 +08:00 via Android
    浪费生命,你直接开个 smb 就能复制文件了嘛,费那劲干嘛
    acess
        2
    acess  
    OP
       2018-08-20 07:11:33 +08:00
    @daigouspy
    试过用网络复制文件,可能是因为没有虚拟网卡驱动的原因,速度很慢。
    另外,LZ 对 SMB 这种东西没有太多好感,因为我印象里这玩意经常出现“找不到网络路径”等玄学问题(好吧这个可能不是 SMB 本身的锅),还爆过漏洞……
    liangzi
        3
    liangzi  
       2018-08-20 07:19:05 +08:00 via Android
    复制文件 直接安装 增强功能 然后虚拟机里把光盘装上 设置一下共享路径就可以了
    acess
        4
    acess  
    OP
       2018-08-20 07:24:58 +08:00
    @daigouspy
    忘了说了…… VBoxHardenedLoader 安装指南里特别提到不能装虚拟网卡,所以我才没装——虽然我也不知道这背后有啥玄学因素……
    除此之外,我记得还有一个强迫症因素:这么折腾之后,宿主机 Win10 自带防火墙似乎不能完全阻止 VBox 进程访问网络(至于本机回环……额,貌似本地回环完全是无视掉自带防火墙的?),好像只能挡住 TCP 和 UDP,不能挡住其他协议,比如 ping 1.1.1.1 这个就是通的。

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

    我印象里,差分 VHD 里已经记录了父级 VHD 的信息,所以,一旦修改源(准确地说,应该是父级) VHD,HyperV 等虚拟机软件就会警告 /报错;而且,Windows 也支持直接挂载差分 VHD ……
    VBox 也从没因为我的这种挂载快照中差分 VHD 的操作直接给我报过错。
    难道 VBox 自己还在某个地方保留了一个神秘的差分配置?或者说,VBox 读写差分 VHD 的方式和微软不一样?
    acess
        13
    acess  
    OP
       2018-08-20 08:32:07 +08:00
    @kokutou
    我猜 VHD 的数据结构里应该含有类似时间戳的字段,每次写入都更新一下。这样的话,把源 VHD 里记录的值和差分 VHD 里记录的值对比,就可以发现源 VHD 是否已经被修改了。
    总之……我觉得,应该不需要依赖外部的什么配置来维持差分 VHD 正常工作。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1051 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 19:10 · PVG 03:10 · LAX 12:10 · JFK 15:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.