Surface Neo 拿不到,但是 Windows 10X 可以先玩玩——实体机上安装 Windows 10X 的不完全指北一文里面记录了详细的安装过程,不过内容基本和 osg.wiki 的文章相同,而且几个重点大坑都没有讲到。本文以理论和实践并重的方式来告诉大家应该怎么装,更重要的是,为什么要这么装。
准备设备
目标机
目标机是你准备运行 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 位替代品的工作就留给读者作为练习了)
系统盘
- 存储空间大于 128GiB(注意,128GB 是不行的)
- 上面的数据可以全部丢弃,过会儿我们会抹掉这块盘
diskpart
的 clean
命令把盘清空了。分支选择
目标机是否支持 Secure Boot 或 TPM?
SecureBootPlatformID
,传统 Windows 10 开机的时候看到这个变量就会拒绝启动。另外,Windows 10X 还会往 TPM 里面写一些东西。如果你的设备完全不支持 UEFI 变量的保存并且没有 TPM,你大可放心往上装。(这就是为啥最开始我们都用的 MacBook,MacBook 固件没有这些功能。)如果你的设备支持 UEFI 变量保存(大多数电脑都支持),那么在用完 Windows 10X 以后记得删除SecureBootPlatformID
这个变量。TPM 在折腾过程中可能会出问题,所以如果固件提供了禁用 TPM 功能,直接禁用就是了,以免夜长梦多。系统盘的扇区大小
- 这个 VHDX 暂时没有办法被非微软官方支持的工具读写(无论是开源的 qemu-img 还是 DiskGenius 等商业软件),因此我们必须用 Windows 设备作为工作机
- 如果你的系统盘是 512bn,那么把 4kn 的 VHDX 内容写入系统盘以后,分区表上的分区位置之类数据全部是错的,需要乘上 8
获取Windows 10X镜像
Flash.vhdx
文件。安装须知
如何查看磁盘编号
方法一:使用磁盘管理。
开始菜单右键->磁盘管理,或者运行diskmgmt.msc
打开磁盘管理。如果磁盘管理打开时弹出“初始化硬盘”的对话框,立即取消,不要点击确定。
一般硬盘(例如你的系统盘在没有写入 Windows 10X 的状态下)会在磁盘管理的下部窗格显示成一行,你只需要找到这一行左上角的磁盘编号数字即可,如图所示:
保存 Windows 10X 的硬盘(那个 VHDX 以及系统盘已经完成写入的状态)因为启用了存储空间功能,比较特殊,在磁盘管理中下部窗格会显示很多行:
在这种情况下,找到写着OSPool的一行,左上角的磁盘编号才是真正的磁盘编号。
磁盘管理这东西在遇到启用了存储空间的盘被插入或拔出的时候可能停止响应,不用慌,关掉重新开一个即可。
方法二:使用diskpart
diskpart
没方法一这么直观,推断磁盘编号的思路是一样的,仅供参考。
安装
安装过程简单地分为三个步骤:
- 把 VHDX 镜像里面的内容转移到系统盘上去
- 给系统打上你目标机需要的驱动程序
- 把系统盘转移到目标机上,启动
其中 1 和 2 顺序可以互换。你既可以直接在 VHDX 上打驱动,也可以先写系统盘,然后在系统盘上打驱动。现有教程全部是先做步骤 2 再做步骤 1 的,那我演示一下先做步骤 1 再做步骤 2 好了。
把 VHDX 镜像里面的内容转移到系统盘上去
- 从GPT fdisk下载一个Windows版本,获得一个
gdisk64.exe
从chrysocome.net下载一个
ddrelease64.exe
挂载VHDX
首先挂载 VHDX。这一步很简单,直接双击 Flash.vhdx
就可以了。系统会弹出来一个无法挂载的报错,那个是假的,点击确定即可。
挂载完成以后,我们用gdisk记录一下这个VHDX的分区表,接下来可能会用到。找到 VHDX 的磁盘编号(见上),下文记为数字 M。打开一个管理员权限的PowerShell,运行:
.\gdisk64.exe M:
如果你输入的数字正确,gdisk会显示
Command (? for help):
输入p
回车。把分区表复制或者截图保存一下。完成以后输入q
回车退出gdisk。
复制硬盘
接下来把 VHDX 的内容一模一样复制到系统盘。系统盘插到工作机上,然后分别找到 VHDX 和系统盘的磁盘编号(见上),下文分别记为数字 M 和数字 N。复制过程很简单,打开一个管理员权限的PowerShell:
.\ddrelease64.exe if=\\?\Device\HarddiskM\Partition0 of=\\?\Device\HarddiskN\Partition0 bs=8M --progress
记得把M
和N
替换成对应的数字,顺序不要搞错(if
是源盘,of
是目标盘)。等到下面进度跑到131,072M
以后会报错退出,不用管错误,这一步就完成了。如果没到 131,072M
就退出了,那么要么你磁盘编号写错了,要么目标盘小于 128GiB。
复制完成以后,立即卸载 VHDX,接下来我们都不会用到它了。在磁盘管理找到那个蓝色的VHDX硬盘,右键->分离 VHD。
警告:接下来的步骤当中千万不要再双击 VHDX 或者用其他任何方式挂载它。如果 VHDX 和现在已经写入了系统的系统盘同时挂载到了同一台电脑上,这两块盘会被自动组建成 RAID1,两块盘里的数据可能全部报销。勿谓言之不预也。
修复硬盘分区表
还记得刚才提到的硬盘扇区大小问题吗?如果你的硬盘是 512bn 盘,那么写入完成以后分区表里面的所有偏移量都是错的,所以你什么数据都读不出来。如果你的硬盘是 4kn 盘,那么你很幸运,请直接跳过本小节内容。
用 gdisk 打开系统盘:
.\gdisk64.exe N:
会报一堆错误,因为分区表整个都不对,全部同意即可。等到Command (? for help):
出现以后,依次输入x
和z
来清除当前分区表,完成后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 系统工具(OneDrive 下载,tmp.link 下载)
- 目标机所需的硬件驱动程序(可以从厂商或者 OEM 官网下载,或者从现有系统提取)
WCOS 系统工具是 Gustave Monce 提供的。同类文章里面有一些如何从系统盘里面提取相同工具的操作,不过它们的做法在我这都不能用(运行时报ERROR_MOD_NOT_FOUND
),有兴趣的读者可以自行尝试。
硬件驱动程序呢,我个人建议只装显卡、声卡、网卡的就好了,而且只装 DCH 驱动,因为非 DCH 驱动有很大可能性不能在 Windows 10X 上正常使用。如果驱动导致 Windows 10X 启动出现问题,关机,把系统盘插回工作机,然后按下文方法删除驱动即可。
假设驱动都下载好了,首先我们要拆每个驱动的包找到里面的安装定义文件(一般是一个.inf
扩展名的文件),在这个文件里面我们需要[Version]
一节下的Provider
字段的值和DriverVer
字段逗号后面的版本号。如果值里面出现%变量名%
的标记,我们还要去下面[Strings]
一节找到相应的变量对应的字符串。以 Intel 显卡驱动为例:
如图所示,DriverVer
后面半段直接是我们要的版本号26.20.100.7755
,Provider
字段则是一个变量引用,在文件末尾我们会找到这个变量的值:
那么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 启动了。开机转圈的时候老设备可能会卡住几次,不用慌,耐心等待即可。
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 一文。