Matrix 精选

Matrix 是少数派的写作社区,我们主张分享真实的产品体验,有实用价值的经验与思考。我们会不定期挑选 Matrix 最优质的文章,展示来自用户的最真实的体验和观点。

文章代表作者个人观点,少数派仅对标题和排版略作修改。


除了 Surface Pro 系列和 Surface Laptop 3,去年 10 月的 微软新品发布会 还发布了两款令人眼前一亮的双屏设备:Surface Duo 与 Surface Neo。其中 Surface Duo 为搭载 Android 操作系统的双屏 Surface「手机」1,早些时候微软已经放出了预览版的 SDK 和模拟机系统,少数派也已经做过相关介绍。

关联阅读:年底才发售的微软折叠屏手机,现在你就可以用它来尝鲜

另一款折叠屏设备 Surface Neo 则搭载了一款以 Windows Core OS 为核心的全新操作系统 Windows 10X。就在最近,微软也发布了 Microsoft Emulator 和适用于模拟器的 Windows 10X 的镜像以供开发者使用、开发相关的软件。

和模拟机系统不太一样的是,Windows 10X 的镜像可以像普通 Windows 10 镜像那样安装到实体机上,除了 Surface Go,甚至还有人在 MacBook 上 成功安装。经过一天的折腾(也踩了一天的坑),我也终于把 Windows 10X 成功安装到了自己的设备上,写下踩坑的记录以供想折腾的朋友参考。

运行 Windows 10X 的 MacBook | 图:The Verge

注意:安装 Windows 10X 需要有一定基础知识和动手能力,有一定风险。

前期准备

如果你想借助现有的 Windows 电脑(宿主机)向另一台设备(目标机)安装 Windows 10X,两台设备需要分别满足以下条件。

宿主机:

  • 安装了 Hyper-V 的 Windows10 系统(推荐 21H1,理论上19H1版本也可以但未实测)
  • 一个 32GB 左右的 USB 存储设备(已经安装了 PE 系统而且存在 EFI 分区的也可以使用)

目标机:

  • 支持 Hyper-V 的 CPU
  • 有 DCH 驱动的显卡(可以使用 Microsoft Store 里的 Intel 显卡控制中心或者 NVIDIA 控制面板)
  • 主板有 UEFI 固件(关闭安全启动 Secure Boot)
  • 一个大于 128GB 的 SSD(根据理论似乎不需要 128G 也可以但是未实测)

当然,宿主机与目标也可以机是同一台电脑,确保条件满足即可。不过这里并不建议在你的主力设备上安装 Windows 10X,毕竟尝鲜有风险。最好的办法仍然是找一台不怎么用但符合「目标机」条件的设备。

安装步骤

Step 1:获取镜像

借助 这个网站 我们可以下载微软商店中的任意 appx 安装包,这里我们把 Windows 10X 模拟器镜像 的链接粘贴进去并进行下载 appx。

用 7zip 打开刚刚下载的 appx 包,在 content 文件夹里可以看到 Flash.vhdx,这就是我们需要的镜像了,将其解压到需要的路径中,本文以 D:\WCOS 为例。

Step 2:挂载镜像

首先我们通过 PowerShell 挂载刚刚从商店下载到的镜像:

Mount-VHD "D:\WCOS\Flash.vhdx"

然后检查是否有正确挂载:

Get-StoragePool -FriendlyName OSPool

如果显示如下内容则为挂载成功:

FriendlyName OperationalStatus HealthStatus IsPrimordial IsReadOnly     Size AllocatedSize
------------ ----------------- ------------ ------------ ----------     ---- -------------
OSPool       OK                Healthy      False        False      127.9 GB      21.81 GB

要安装镜像,我们还需要使用 diskpart 为挂载的镜像分配卷标

diskpart
lis vol
#选择标签为 MainOS 的卷
sel vol 15
#分配一个闲置的盘符(比如M)
assign letter=M 

Step 3:添加驱动

为了保证 Windows 10X 能过脱离虚拟机在我们需要的设备上正常运行,我们还需要为其添加一些必要的驱动文件。以显卡驱动为例:

从刚刚挂载的 MainOS 中复制以下文件到 D:\WCOS\Tools,包括:

M:\Windows\Servicing 目录中的

  • UpdateApp.exe
  • CbsApi.dll
  • CbsMsg.dll

M:\Windows\System32 目录中的

  • CbsCore.dll
  • DrvServicing.dll
  • IUSpaces.dll
  • IUSpaces_vb.dll (复制 IUSpaces.dll 为副本并重命名)
  • UpdateAPI.dll
  • cimfs.dll
  • cmiadapter.dll
  • cmiaisupport.dll
  • cmintegrator.dll
  • dpx.dll
  • drvstore.dll
  • msdelta.dll
  • mspatcha.dll
  • mspatchc.dll
  • turbostack.dll
  • wcp.dll
  • wdscore.dll

以上文件已打包上传至 OneDrive

随后我们以管理员身份运行 PowerShell 并定位至 Tools 文件夹(cd D:\WCOS\Tools),测试 UpdateApp.exe 是否正常工作:

.\UpdateApp.exe getinstalledpackages

正常工作的话会显示以下内容:

UpdateApp - Update Application for Windows Mobile

[00:00:00] Loaded servicing stack from X:\wcos\tools with session name IUPackageInfoSession_EFIESP
[00:00:00] External storage staging directory is: (null)
[00:00:00] Closing session IUPackageInfoSession_EFIESP
[00:00:00] Loaded servicing stack from X:\wcos\tools with session name IUPackageInfoSession_MainOS
[00:00:00] External storage staging directory is: (null)
[00:00:01] Closing session IUPackageInfoSession_MainOS
164 packages:
        Microsoft-OneCore-HyperV-Guest-UpdateOS-Package~31bf3856ad364e35~amd64~en-US~10.0.19563.1000, UpdateOS
        Microsoft-OneCore-HyperV-Guest-UpdateOS-Package~31bf3856ad364e35~amd64~~10.0.19563.1000, UpdateOS
        Microsoft-OneCore-ServicingStack-UpdateOS-Package~31bf3856ad364e35~amd64~~10.0.19563.1000, updateos

        [...]
        
getinstalledpackages completed successfully
command took 6 seconds

用 Dism++ 导出 Intel 显卡驱动到 D:\WCOS\Drivers\Graphics\Intel 中(Dism++会创建一个子文件夹存放文件,自行移动到上层文件夹中),这时在 D:\WCOS\Drivers\Graphics\Intel 中应该存在一个 iigd.inf 的文件,打开它记下 ProviderDriverVer 的值,比如我的是:

Provider=%Intel%
DriverVer=09/25/2019,26.20.100.7262

Provider 提供的是一个变量值,inf 里搜索可得:

Intel = “Intel Corporation”

然后使用我们刚刚获得的 UpdateApp.exe 为 Windows 10X 安装驱动到 bsp 分区:

.\UpdateApp.exe install "DriverPackage|D:\WCOS\DHCUDrivers\Graphics\iigd_dch.inf|Intel_Corporation-iigd_dch.inf~amd64~26.20.100.7262~bsp|0"

这里需要特别注意的是:

  • 双引号内的内容中若包含有空格,请用下划线 _ 代替所有空格
  • 文件名中也不得出现 - ,请修改文件名
  • 有些驱动的 Provider 的值比较奇怪,比如 DW1820A 网卡的 Provider 的值为 BROADCOM, NTamd64.6.1,保留 BROADCOM 即可。

推荐安装的驱动有网卡、显卡和蓝牙,其他的请自行斟酌添加。看到 install complete successfully 的提示才能确保安装成功,若不成功请检查上面的 ProviderDriverVer 的值

安装完驱动后用管理员 PowerShell 运行以下命令卸载镜像:

Dismount-VHD "D:\WCOS\Flash.vhdx"

添加完驱动后就可以准备制作启动盘了。

Step 4:制作启动盘

准备以下文件和文件夹到 D:\WCOS\Boot 中为制作启动盘做准备

  • Windows 10 19559 AMD64 或者更高版本的镜像中获取 boot 文件夹EFI 文件夹sources\boot.wim 文件bootmgr.efi 文件
  • GPT fdisk 下载 gdisk64.exe
  • dd for windows 官网 下载 Windows 版本的 ddrelease64.exe
  • GitHub 下载 EFI Shell,重命名为 bootx64.efi,然后移动到 efi\boot 中,并将 efi\boot 中 原有的 bootx64.efi 重命名为 winx64.efi
  • 新建一个 startup.nsh 文件,内容为:
  dmpstore -d SecureBootPlatformID
  fs0:\efi\boot\winx64.efi
  fs1:\efi\boot\winx64.efi
  fs2:\efi\boot\winx64.efi
  fs3:\efi\boot\winx64.efi
  fs4:\efi\boot\winx64.efi
  fs5:\efi\boot\winx64.efi
  fs6:\efi\boot\winx64.efi
  fs7:\efi\boot\winx64.efi
  fs8:\efi\boot\winx64.efi
  fs9:\efi\boot\winx64.efi
  fsA:\efi\boot\winx64.efi

这个脚本会从 nvram 中删除 SecureBootPlatformID 这个变量。因为 Windows 10X 会重新在 nvram 中写入安全启动的相关变量。

然后连接 USB 存储设备(这里我们制作的是 U 盘启动盘),管理员运行 PowerShell 执行 diskpart(请确保在以下步骤中选择正确的硬盘,否则您将丢失您的数据):

lis dis
#列出所有硬盘,然后选择 USB 存储设备,我这里是磁盘1
sel dis 1
#清除硬盘
clean
#转换成 gpt 格式
convert gpt
#创建一个 5000MB 的 FAT32 分区作为引导分区,并分配空盘符 Y
create part pri size=5000
format fs=fat32 quick
assign letter=Y
#剩余空间创建为 exFAT 分区作为存储分区,并分配空盘符 Z
create part pri
format fs=exfat quick
assign letter=Z

以上面的分区为例,我们需要把 Step 4 开头准备的文件和文件夹拷贝到 Y 盘中,Flash.vhdx 拷贝到 Z 盘中。

于是你获得了一个启动U盘了,它的目录结构如下:

Y:.

│ startup.nsh

│ ddrelease64.exe

│ gdisk64.exe

├─sources

│ boot.wim

├─boot

│ │ bcd

│ │ boot.sdi

│ │ bootfix.bin

│ │ bootsect.exe

│ │ etfsboot.com

│ │ memtest.exe

│ │

│ ├─en-us

│ │ bootsect.exe.mui

│ │

│ ├─fonts

│ │ chs_boot.ttf

│ │ cht_boot.ttf

│ │ jpn_boot.ttf

│ │ kor_boot.ttf

│ │ [···]

│ │

│ └─resources

│ bootres.dll

└─efi

├─boot

│ winx64.efi

│ bootx64.efi

└─microsoft

└─boot

│ bcd

│ cdboot.efi

│ cdboot_noprompt.efi

│ efisys.bin

│ efisys_noprompt.bin

│ memtest.efi

│ winsipolicy.p7b

├─fonts

│ chs_boot.ttf

│ cht_boot.ttf

│ jpn_boot.ttf

│ kor_boot.ttf

│ [···]

└─resources

bootres.dll

Z:.
Flash.vhdx

以上文件已打包上传至 OneDrive

Step 4:如何安装

在目标主机上从 USB 存储设备启动。开机时疯狂按 Esc 中断 startup.nsh 的执行,在 EFI Shell 中 输入以下命令备份 nvram:

dmpstore -all -s fs0:
#此处的 fs0 可以自由选择分区的,可以通过 fs<number>: 命令切换不同分区,并借助 ls 命令查看硬盘里的目录得知是什么硬盘的什么分区

然后输入 exit 再次重启电脑,这次不中断 startup.nsh 执行放任它自己启动即可进入 Windows 10X 安装环境,按键盘 Shift+F10 启动 cmd(或者和我一样进入自己的 Windows PE 系统运行 cmd),通过以下命令确定刚刚我们准备的工具和 Flash.vhdx 的所在分区(即上面提到的 Y 和 Z 分区,如果是 Windows PE 系统中可以直接打开文件管理器查看文件在哪)。

C:
dir
D:
dir
E:
dir
[···]

例如我的启动引导分区为 E,我的 Flash.vhdx 在 F 分区中,用 diskpart 挂载它:

diskpart
#启动 diskpart
sel vdisk file="F:\Flash.vhdx"
#选择 Flash.vhdx 文件
attach vdisk readonly
#挂载虚拟磁盘为只读
lis dis 
#确认是否挂载成功,如果有看到超过物理磁盘的数量则挂载成功

根据启动 cmd 的环境,分为两种情况(我这里为情况 2):

1. 如果是在 Windows 安装环境启动命令行的,则会看到一个 2048MB 的已联机的磁盘,把它的编号然后减去 1 ,然后记下来,比如:

  磁盘 ###  状态           大小     可用     Dyn  Gpt
  --------  -------------  -------  -------  ---  ---
  磁盘 4    联机              2048 MB    2048 MB        *

则记下为磁盘 3。

2. 如果在 Windows PE 系统中会看到一个 128G 的已联机的磁盘,因为这个 vhdx 是 128G 的动态扩展虚拟磁盘文件,记下磁盘编号,比如我的是磁盘 2

3. 在 diskpart 中选中要安装的磁盘并抹除

sel dis 0
#如上图我要安装的硬盘为磁盘 0,选中它
clean
#抹除
convert mbr
#转换为 mbr,和大佬讨论之后认为目的是彻底地破坏 gpt 分区结构
exit
#退出 diskpart

然后把 Windows 10X 镜像数据写入到物理硬盘中:

E:\ddrelease64.exe if=\\.\physicaldrive2 of=\\.\physicaldrive0 bs=8M --progress

注意:该命令中的 physicaldrive2physicaldrive0 是根据我自己的实际情况(磁盘 2)编写的,请读者自行替换。即将 2 替换为刚刚记下来的挂载的 vhdx 虚拟磁盘的磁盘号;将 0 替换为要安装系统的磁盘号,笔记本单硬盘的状况下一把就是 physicaldrive0 了。

例如,情况 1 中的例子是磁盘 3,此处则应该将 physicaldrive2 替换成 physicaldrive3 ,下文中所用的磁盘号均使用我实际情况中的磁盘号,即 0 和 2,也请读者自行同步替换。

另外,一定要加上 --progress 这个参数,不然会等得很着急。去休息一下,等待它达到 131072M 即可,出现错误 27 直接无视,已经写入成功了。

接着我们运行以下命令:

E:\gdisk64.exe -l \\.\physicaldrive2

出现如下结果然后拍照截图记下来:

[···]
Number  Start (sector)    End (sector)  Size       Code  Name
   1             512            8703   32.0 MiB    EF00  BS_EFIESP
   2            8704        33554426   128.0 GiB   4202  OSPool

然后手动重建 gpt 分区,运行以下命令(基本照搬即可):

E:\gdisk64.exe \\.\physicaldrive0
#接受任何警告
x
z

E:\gdisk64.exe \\.\physicaldrive0
#接受任何警告
n
1
4096
69624
EF00

n
2
69632
268435408
4202

c
1
BS_EFIESP

c
2
OSPool

p
#检查与刚刚记下来的数字分区等有没有对应
w
#确认执行即可

这时就可以退出 Windows PE 或者 Windows 安装环境,拔下 USB 存储设备,重启计算机,这时应该可以启动 Windows 10X 了,请尽情探索!

启动成功!

如何恢复启动原来的系统

如果你在一台本身安装了 Windows 10 的设备上安装 Windows 10X,Windows 10X 会在 nvram 中写入安全启动相关的信息,导致正常的 Windows 10 系统无法启动,这时候需要进入 EFI Shell 删除刚刚启动盘中的 startup.nsh 文件,方法如下。

从 U 盘启动进入 EFI Shell, 执行以下命令:

dmpstore -d -all

以上命令会清除 nvram ,可能会导致键盘大写灯无法亮起或者其他未知问题。重启选择正常 Windows 所在的硬盘启动,应该就可以正常启动原来正常的 Windows 10 系统了。

如果无法启动,可以尝试再次清除 nvram,步骤同上;如果出现键盘大写灯无法亮起或者其他未知问题,可以通过 EFI Shell 尝试恢复我们上面备份的 nvram:

dmpstore -all -l fs0:VarDump.txt

此教程送给各位想要折腾体验的朋友。至此这篇教程彻底结束,体验文我也不知道什么时候能写完……

此文感谢 @imbushuo 巨佬提供的 教程链接,感谢我的好友 Richard Yu 和湘江一桥提供的思路,拯救了翻车的我。

> 下载少数派 客户端、关注 少数派公众号,找到数字时代更好的生活方式 🎊

> 参与少数派 征文活动,瓜分五万元奖品 💃🏻