Surface Neo 拿不到,但是 Windows 10X 可以先玩玩——实体机上安装 Windows 10X 的不完全指北一文里面记录了详细的安装过程,不过内容基本和 osg.wiki 的文章相同,而且几个重点大坑都没有讲到。本文以理论和实践并重的方式来告诉大家应该怎么装,更重要的是,为什么要这么装。

准备设备

其他教程会告诉你说需要什么 U 盘啦,这些都不用的。本节所述是最低要求。

目标机

目标机是你准备运行 Windows 10X 的设备。它需要符合以下硬性要求:

  • amd64 指令集处理器,启用了虚拟化支持
  • 有 UEFI 支持,并且 Secure Boot 可以关闭或没有 Secure Boot,支持从外置存储设备启动
  • 不依赖外接屏幕(Windows 10X 对外接屏幕的支持还没做好)
  • 上面没有重要数据,没有用 TPM 保护的数据

如果你真的想要获得完整、流畅的 Windows 10X 体验,那么建议你的设备的主要硬件(核显、声卡、网卡等)有 DCH 驱动。Intel 核显的 DCH 驱动支持的最老硬件是 6 代 Core。我手头上只有 4 代 Core,图形界面没有硬件加速,性能非常糟糕。非 DCH 驱动可能能够被安装进 Windows 10X,但是很大概率会导致系统出问题,所以如果遇到进桌面黑屏什么的不要特别惊讶。

还没人试过在桌面设备或者有独立显卡的设备上安装 Windows 10X。如果各位有兴趣的话可以尝试一下。

工作机

完成大部分安装过程时候使用的设备。它需要符合以下硬性要求:

  • Windows 10 1909(18363)或更高(没人试过更低的版本,你有兴趣的话可以试一试)
  • 64 位系统(主要是因为下文用到的工具都是 64 位的,寻找这些工具的 32 位替代品的工作就留给读者作为练习了)
工作机上无关硬盘建议事先拔掉以免操作过程中眼花选错硬盘。

系统盘

系统盘就是用来存放 Windows 10X 的硬盘啦。它需要符合以下硬性要求:
  • 存储空间大于 128GiB(注意,128GB 是不行的)
  • 上面的数据可以全部丢弃,过会儿我们会抹掉这块盘
系统盘需要能方便地在工作机和目标机上插拔,所以我这边选择了一块 512GB SATA SSD 加 USB 硬盘盒。如果你不介意多次拆机插拔硬盘的话,其实用什么盘都无所谓啦。推荐在开始之前先用 diskpartclean命令把盘清空了。

分支选择

这些问题会影响后续的步骤。

目标机是否支持 Secure Boot 或 TPM?

Secure Boot 是必须关掉的,不然会给后续折腾带来麻烦。(测试设备要什么安全呢?)
在产品设计上,Windows 10X 和传统桌面 Windows 互斥。为了实现互斥,Windows 10X 每次启动的时候都会添加一个 UEFI 变量SecureBootPlatformID,传统 Windows 10 开机的时候看到这个变量就会拒绝启动。另外,Windows 10X 还会往 TPM 里面写一些东西。如果你的设备完全不支持 UEFI 变量的保存并且没有 TPM,你大可放心往上装。(这就是为啥最开始我们都用的 MacBook,MacBook 固件没有这些功能。)如果你的设备支持 UEFI 变量保存(大多数电脑都支持),那么在用完 Windows 10X 以后记得删除SecureBootPlatformID这个变量。TPM 在折腾过程中可能会出问题,所以如果固件提供了禁用 TPM 功能,直接禁用就是了,以免夜长梦多。

系统盘的扇区大小

大多数硬盘都是 512 字节为一个扇区的(以下简称 512bn),但是有一些比较新的硬盘支持 Advance Format,以 4KiB 为一个扇区(4k native,以下简称 4kn)。Windows 10X 模拟器的 VHDX 是 4kn 的,这导致了两个问题:
  • 这个 VHDX 暂时没有办法被非微软官方支持的工具读写(无论是开源的 qemu-img 还是 DiskGenius 等商业软件),因此我们必须用 Windows 设备作为工作机
  • 如果你的系统盘是 512bn,那么把 4kn 的 VHDX 内容写入系统盘以后,分区表上的分区位置之类数据全部是错的,需要乘上 8
怎么看你的盘的扇区大小呢?最准确的方法是查询厂家提供的 datasheet;如果厂家没提供datasheet 或者上面没写扇区大小,那么看你硬盘上的贴纸上有没有画着 AF 的 logo,有的话一般是 4kn,没有的话一般是 512bn 盘。

获取Windows 10X镜像

官方镜像需要你是Windows Insider(19500 以上版本)才能下载。如果你没有相应版本的系统,可以尝试一下隔壁文章提供的一个第三方的下载方式,或者从朋友那复制一个。最后你会得到一个大约 8GiB 的Flash.vhdx文件。

安装须知

这是安装之前你需要知道的知识。

如何查看磁盘编号

方法一:使用磁盘管理。

开始菜单右键->磁盘管理,或者运行diskmgmt.msc打开磁盘管理。如果磁盘管理打开时弹出“初始化硬盘”的对话框,立即取消,不要点击确定。

一般硬盘(例如你的系统盘在没有写入 Windows 10X 的状态下)会在磁盘管理的下部窗格显示成一行,你只需要找到这一行左上角的磁盘编号数字即可,如图所示:

一个典型的单分区GPT硬盘

保存 Windows 10X 的硬盘(那个 VHDX 以及系统盘已经完成写入的状态)因为启用了存储空间功能,比较特殊,在磁盘管理中下部窗格会显示很多行:

一个启用了存储空间的盘会显示成多个盘

在这种情况下,找到写着OSPool的一行,左上角的磁盘编号才是真正的磁盘编号。

磁盘管理这东西在遇到启用了存储空间的盘被插入或拔出的时候可能停止响应,不用慌,关掉重新开一个即可。

方法二:使用diskpart

使用 diskpart 查看磁盘编号

diskpart 没方法一这么直观,推断磁盘编号的思路是一样的,仅供参考。

安装

安装过程简单地分为三个步骤:

  1. 把 VHDX 镜像里面的内容转移到系统盘上去
  2. 给系统打上你目标机需要的驱动程序
  3. 把系统盘转移到目标机上,启动

其中 1 和 2 顺序可以互换。你既可以直接在 VHDX 上打驱动,也可以先写系统盘,然后在系统盘上打驱动。现有教程全部是先做步骤 2 再做步骤 1 的,那我演示一下先做步骤 1 再做步骤 2 好了。

把 VHDX 镜像里面的内容转移到系统盘上去

本节所需工具:

挂载VHDX

首先挂载 VHDX。这一步很简单,直接双击 Flash.vhdx 就可以了。系统会弹出来一个无法挂载的报错,那个是假的,点击确定即可。

挂载完成以后,我们用gdisk记录一下这个VHDX的分区表,接下来可能会用到。找到 VHDX 的磁盘编号(见上),下文记为数字 M。打开一个管理员权限的PowerShell,运行:

.\gdisk64.exe M:

如果你输入的数字正确,gdisk会显示

Command (? for help):

输入p回车。把分区表复制或者截图保存一下。完成以后输入q回车退出gdisk。

VHDX 的初始分区表

复制硬盘

接下来把 VHDX 的内容一模一样复制到系统盘。系统盘插到工作机上,然后分别找到 VHDX 和系统盘的磁盘编号(见上),下文分别记为数字 M 和数字 N。复制过程很简单,打开一个管理员权限的PowerShell:

.\ddrelease64.exe if=\\?\Device\HarddiskM\Partition0 of=\\?\Device\HarddiskN\Partition0 bs=8M --progress

记得把MN替换成对应的数字,顺序不要搞错(if是源盘,of是目标盘)。等到下面进度跑到131,072M以后会报错退出,不用管错误,这一步就完成了。如果没到 131,072M 就退出了,那么要么你磁盘编号写错了,要么目标盘小于 128GiB。

复制完成以后,立即卸载 VHDX,接下来我们都不会用到它了。在磁盘管理找到那个蓝色的VHDX硬盘,右键->分离 VHD。

分离 VHDX 过程

警告:接下来的步骤当中千万不要再双击 VHDX 或者用其他任何方式挂载它。如果 VHDX 和现在已经写入了系统的系统盘同时挂载到了同一台电脑上,这两块盘会被自动组建成 RAID1,两块盘里的数据可能全部报销。勿谓言之不预也。

修复硬盘分区表

还记得刚才提到的硬盘扇区大小问题吗?如果你的硬盘是 512bn 盘,那么写入完成以后分区表里面的所有偏移量都是错的,所以你什么数据都读不出来。如果你的硬盘是 4kn 盘,那么你很幸运,请直接跳过本小节内容。

用 gdisk 打开系统盘:

.\gdisk64.exe N:

会报一堆错误,因为分区表整个都不对,全部同意即可。等到Command (? for help):出现以后,依次输入xz来清除当前分区表,完成后gdisk会退出。

再次用 gdisk 打开系统盘,这时候系统盘的分区表已经是空的了。我们需要依次创建出两个分区并且设置上原来的分区名字。创建过程中,Start sector(起始扇区)和 End sector(结束扇区)这两个数字值分别是上面保存的 VHDX 分区表的八倍(4KiB = 512B * 8),其余保持一样即可。以下为gdisk 命令(不建议照抄,建议根据上面 VHDX 的分区表自己算):

# 创建第一个分区
n
1
4096
69624
EF00

c
1
BS_EFIESP

# 创建第二个分区
n
2
69632
268435408
4202

c
2
OSPool

# 保存
w

拔掉系统盘再重新插上,你可以在磁盘管理当中看到系统盘现在能认出两个分区,下面还出现了一堆存储空间的条目。

(如果你不想用 Windows 下的 gdisk,找个 Linux 也行;我就是在 Linux 下操作的。)

给系统打上你目标机需要的驱动程序

本节所需工具:

WCOS 系统工具是 Gustave Monce 提供的。同类文章里面有一些如何从系统盘里面提取相同工具的操作,不过它们的做法在我这都不能用(运行时报ERROR_MOD_NOT_FOUND),有兴趣的读者可以自行尝试。

硬件驱动程序呢,我个人建议只装显卡、声卡、网卡的就好了,而且只装 DCH 驱动,因为非 DCH 驱动有很大可能性不能在 Windows 10X 上正常使用。如果驱动导致 Windows 10X 启动出现问题,关机,把系统盘插回工作机,然后按下文方法删除驱动即可。

假设驱动都下载好了,首先我们要拆每个驱动的包找到里面的安装定义文件(一般是一个.inf扩展名的文件),在这个文件里面我们需要[Version]一节下的Provider字段的值和DriverVer字段逗号后面的版本号。如果值里面出现%变量名%的标记,我们还要去下面[Strings]一节找到相应的变量对应的字符串。以 Intel 显卡驱动为例:

如图所示,DriverVer后面半段直接是我们要的版本号26.20.100.7755Provider字段则是一个变量引用,在文件末尾我们会找到这个变量的值:

那么Provider字段真实的值就是Intel Corporation。有了这两个值,我们就可以去安装这个驱动了。在管理员权限的 PowerShell 下运行 Windows 10 Mobile 系统工具里面的updateapp.exe,完整命令行格式为:

.\updateapp.exe install "DriverPackage|inf文件路径|Provider-inf文件名~驱动架构(一般是amd64)~驱动版本号~bsp|0"

注意如果Provider字段的值里面有空格,需要把空格替换成下划线。同样以 Intel 显卡驱动为例:

.\updateapp.exe install "DriverPackage|X:\WCOS\drivers\display_dchu\Graphics\iigd_dch.inf|Intel_Corporation-iigd_dch.inf~amd64~25.20.100.7755~bsp|0"

这个程序还能用来删除已经装好的驱动。如果你不慎安装了错误的驱动,你可以用以下的方法来删除它:

.\updateapp.exe install "RemoveDriver|X:\WCOS\drivers\display_dchu\Graphics\iigd_dch.inf|Intel_Corporation-iigd_dch.inf~amd64~25.20.100.7755~bsp|0"

如果updateapp.exe报错c0880005,先检查一下你参数有没有打错。

把系统盘转移到目标机上,启动

这一步应该不用多讲了吧,把系统盘拔下来,插到目标机上,固件里面选择该系统盘,启动即可。如果一切正常,你过会儿就会看到 Windows 10X 启动了。开机转圈的时候老设备可能会卡住几次,不用慌,耐心等待即可。

7 年高龄的 MacBook Pro 13 寸(2013 年末款)也能成功运行 Windows 10X

FAQ

Windows 10X 默认在双屏模式里面,但是我的设备只有一个屏幕,很难用怎么办?

进系统以后连按三下 F1 显示调试菜单,把 State 设置成 SingleDisplayCompose 即可。

调试菜单,找不到更清晰的图了

启动过 Windows 10X 以后传统 Windows 拒绝启动了怎么办?

启动一个 EFI Shell,在里面执行

dmpstore -d SecureBootPlatformID

然后重启回传统 Windows 即可。

Windows 10X 开机后只显示鼠标,桌面黑屏是什么原因?

一般来说是显卡驱动炸了。找找你的显卡有没有 DCH 驱动吧。

如何查看驱动是否正确安装上?

测试版 Windows 10X 默认打开了 device portal 功能,开机以后打开浏览器,访问 http://localhost 就可以看到设备树了。


致谢

感谢 Ben Wang 提供的系统镜像和 Gustave Monce 提供的工具。

安装过程参考了 Installing Windows 10X (emulator image) on real hardware 一文。