Surface Neo 拿不到,但是 Windows 10X 可以先玩玩——实体机上安装 Windows 10X 的不完全指北
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 需要有一定基础知识和动手能力,有一定风险。
如果你想借助现有的 Windows 电脑(宿主机)向另一台设备(目标机)安装 Windows 10X,两台设备需要分别满足以下条件。
宿主机:
目标机:
当然,宿主机与目标及也可以是同一台电脑,确保条件满足即可。不过这里并不建议在你的主力设备上安装 Windows 10X,毕竟尝鲜有风险。最好的办法仍然是找一台不怎么用但符合「目标机」条件的设备。
借助 这个网站 我们可以下载微软商店中的任意 appx 安装包,这里我们把 Windows 10X 模拟器镜像 的链接粘贴进去并进行下载 appx。
用 7zip 打开刚刚下载的 appx 包,在 content 文件夹里可以看到 Flash.vhdx
,这就是我们需要的镜像了,将其解压到需要的路径中,本文以 D:\WCOS 为例。
首先我们通过 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
为了保证 Windows 10X 能过脱离虚拟机在我们需要的设备上正常运行,我们还需要为其添加一些必要的驱动文件。以显卡驱动为例:
从刚刚挂载的 MainOS 中复制以下文件到 D:\WCOS\Tools,包括:
M:\Windows\Servicing 目录中的
M:\Windows\System32 目录中的
以上文件已打包上传至 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
的文件,打开它记下 Provider
和 DriverVer
的值,比如我的是:
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
的提示才能确保安装成功,若不成功请检查上面的 Provider
和 DriverVer
的值
安装完驱动后用管理员 PowerShell 运行以下命令卸载镜像:
Dismount-VHD "D:\WCOS\Flash.vhdx"
添加完驱动后就可以准备制作启动盘了。
准备以下文件和文件夹到 D:\WCOS\Boot 中为制作启动盘做准备
gdisk64.exe
ddrelease64.exe
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
在目标主机上从 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
注意:该命令中的 physicaldrive2
和 physicaldrive0
是根据我自己的实际情况(磁盘 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 和湘江一桥提供的思路,拯救了翻车的我。
> 下载少数派 客户端、关注 少数派公众号,找到数字时代更好的生活方式 🎊
> 参与少数派 征文活动,瓜分五万元奖品 💃🏻