将一般Windows操作系统迁移到VHDX中并切换为WindowsToGo启动

对于一个在不同地方有N台工作电脑的人来说,电脑之间的同步很头疼。即使有了NAS做文件同步,也只是解决了一般的问题。比如一般没人会把整个VS工程目录丢到NAS,在一台电脑上装过的工具软件,换了一台电脑之后还是要重装。这个时候,只要你买得起大号固态移动硬盘,Windows To Go绝对是个神器级解决方案。微软已经撤掉了官方支持,但国内萝卜头论坛搞的Windows To Go 辅助工具已经把Windows To Go(简称WTG)搞得连它妈都认不出来了,比微软提供的原生机制好用多了。

最近有个得寸进尺的需求,就是由于某些原因有两三个月没有动WTG,里面装的系统跟现在电脑里用的系统已经差别很大,不想再重新配置一次,而是想把现有的系统直接复制一份,做为WTG启动。同时,最近发现VHDX模式的WTG用起来更符合我的审美,也就是整个系统在一个VHDX文件中,Win7以后貌似就原生支持从VHDX启动了。要备份系统,换个电脑把这个文件复制出去就行了。

思考几天,摸索一个下午后实现了,下面给出关键步骤。

如果搜“操作系统转VHDX”,95%的搜索结果指向微软自己的disk2vhd工具。但是这个东西有个问题,就是他其实是为Hyper-V准备的,复制出来的东西有两个问题:

  • 所有分区都会被重新建立起来,即使你没有选择,也会有一个空白分区放在VHDX里面,对强迫症来说比较难受;
  • 转换出来的文件与原来的分区具有相同的GUID,有时候会造成一些冲突

考虑这些问题,用了另外一种方法,经过验证是可以的:在磁盘管理里面新建一个VHDX,这时候可以随心所欲的给他分区,挂载上。然后,尽量退出所有前台程序,打开DiskGenius免费版,用分区克隆功能,把现有系统的C盘克隆到这个VHDX文件。直接选热备份就可以,应该是调用了VSS卷影复制功能,不需要重启到PE里面操作——当然,如果你的强迫症比我还严重,那么重启到PE操作也没关系。

之后可以用DISM++检查一下做出来VHDX的有没有问题。

由于WTG是要用U盘插到各种电脑里面去启动的,一些配置选项与常规的操作系统是不一样的,这也是主要需要摸索的地方。目前来看,需要手动修改的地方有三处,其中前两处影响启动,第三处影响使用。

如何在不启动系统的前提下修改注册表

这一段的推论很复杂,结论是这一步有可能不需要做,但做了也无妨……

简而言之,有些教程说需要修改HKEY_LOCAL_MACHINE\SYSTEM\HardwareConfig各个子项下面的BootDriverFlags改成0x14,修改HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ControlPortableOperatingSystem1

详细论述如下:

根据一些教程,这个迁移方法,要想正常启动,首先需要更改一处注册表,告诉系统要从USB设备启动。

但是这一步我的操作流程跟网上流程不一样,并且写这篇文章的时候,我有点恍惚刚才如何操作了,这里写上推论:

首先,网上写的是需要把HKEY_LOCAL_MACHINE\SYSTEM\HardwareConfig下面的BootDriverFlags改成0x14。但是,回头写文章的时候我发现HKEY_LOCAL_MACHINE\SYSTEM\HardwareConfig下面根本没有BootDriverFlags,有BootDriverFlags的地方是HKEY_LOCAL_MACHINE\SYSTEM\HardwareConfig下面若干个以GUID为名称的项目,也就是每一个磁盘分开设置。这个选项我当时确实改了并且没有疑惑,所以只能推断是需要把对于与系统盘的那个设备对应的BootDriverFlags改成0x14

事实上,把一切都做好之后,我发现HKEY_LOCAL_MACHINE\SYSTEM\HardwareConfig下面比来源系统多出几项,而他们的BootDriverFlags是系统自动给出的0x1c。同时我查到了

You have to edit the registry value BootDriverFlags to change it from 0x0 to 0x14 or 0x1C.
HKEY_LOCAL_MACHINE\SYSTEM\HardwareConfig\Current\BootDriverFlags
0x14 means USB 2 (0x4) or USB 3 (0x10)
0x1c (decimal 28) means USB 2, USB 3 or SD Card (0x8)

所以,合理推断是:由于USB启动的时候,启动分区(无论VHDX里面的新分区,还是如果你不喜欢VHDX而直接克隆到了真实分区)对于操作系统来说都是新的,所以系统会自动设置正确的BootDriverFlags标志。而网上这些教程,针对的是“把电脑的内置硬盘拆出来放到硬盘盒里面做WTG”这个做法。

但这样搞一下貌似也不多,我目前没兴趣回头测试不这样做会怎么样。

做完这一步之后,我就先按最后一步设置了启动项,然后把这个盘放在VMware虚拟机里面看能不能启动,结果是到了Windows徽标界面但永远转圈圈,硬盘灯略闪。考虑一些问题之后,我强制断电做了下面一步“删除原先的盘符-GUID对应关系”。

此外,网上说要修改HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ControlPortableOperatingSystem1,我没有照做。我的经验是启动项设置一下HAL检测(见最后一步)已经够了,事实上启动成功之后我发现这个东西被自动设置成1了。

在注册表HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices这里,放置了盘符与GUID的对应关系。显然,由于是克隆的磁盘,这里记录的C盘的GUID是来源机器的C盘的,而不是新的VHDX分区的。这应该在成了不断转圈圈的问题。幸好我是在虚拟机测试,如果是真机不换机器启动,没准把原来的物理C盘当系统盘给加载了,那时候有多混乱就很难想象了。

这里的处理方式倒是简单,直接全删掉就好。新盘出现的时候系统会自动重新分配的,亲测有效。

有可能会造成启动成功后一段时间内windows搜索服务疯狂索引。不用管它,索引完成就好了。

前提:用的是固态移动盘,也就是系统要识别为本地磁盘而非可移动磁盘。如果非要用U盘这样玩,那么只能去找其它教程彻底禁用虚拟内存。

做完上面两步之后,系统就应该可以正常启动了。先去保证把系统启动起来再搞这个,实际上也只能在启动起来之后再搞这个。

启动成功后,每次开机都会弹出“性能”对话框,原因是系统没有虚拟内存可以用了。VHDX上面不能设置虚拟内存(原因跟虚拟内存的性质有关,据看过windows源码的人说,虚拟内存的特殊之处在于,读写虚拟内存的时候,不能再有其他任何可能引起内存分配的动作,否则就无限递归了,所以文件驱动和虚拟内存这块儿用了特别多的dirty trick),虚拟内存只能设置在其他盘——由于是WTG,也不宜设置在机器内置硬盘,否则换个机器还是要出问题。在本例中,比较恰当的是设置到放VHDX文件的那个分区。

但是,我设置完了之后发现,重启之后还是弹窗,打开设置发现D盘的虚拟内存大小还是零。想起来刚才改过注册表,于是再去搜一下,发现虚拟内存设置应该是在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management ,打开一看发现这地方PagingFiles这一项很听话,写着我设置的d:\pagefile.sys,但另一项ExistingPageFiles的路径里面很多问号,估计是改HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices的问题,手动改成d:\pagefile.sys再重启就好了。

———– 以下为2022年1月23日更正 ————–

下文中说的“从其他机器复制EFI分区”的做法是不严谨的,大部分情况下没问题,但在需要bitlocker的时候很容易出问题。正确的方法应参考此文:使用BCD命令重建正确的EFI分区和BCD文件

———– 以上为2022年1月23日更正 ————–

这个不仅可以用于折腾WTG,平时系统启动不起来,也可以用这个办法修。

继续DiskGenius,选中源机器的EFI/ESP分区,克隆到USB盘的预留的EFI/ESP分区——别跟我说你忘记预留了,搞启动呢,严肃点。实际上随便去哪里拿一个正常的Windows EFI分区就好,大部分文件都是一毛一样的,每台机器只是BCD文件不太一样,下面编辑一下就可以用来启动WTG系统。

然后把新的EFI分区映射个盘符,比如X:\

然后,打开Windows To Go 辅助工具,工具菜单,“启动BOOTICE”。选择BCD编辑的Tab页,“其他BCD文件”,选中刚才映射的X盘的X:\EFI\Microsoft\Boot\BCD文件,智能编辑模式,仿照下图设置:

注意要对应到USB盘的各个分区。UEFI固件是不知道C盘D盘,只知道某个磁盘的第几个分区。注意检测硬件抽象层detecthal要手动勾选。

完了之后保存。此时这个盘应该可以作为WTG启动了。启动之后如果有每次开机弹“性能”窗的问题,回到上面去修改一下配置,确认注册表没有乱。

Windows/Office应该需要重新激活,由于硬件经常变化又不是微软官方的途径,首选KMS/AAct激活。其他软件需要重新激活的也应该有不少,但即使原生的WTG也有同样的问题,各自想办法吧。

  • 最后更改: 2023/02/24 16:47