除了 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,两台设备需要分别满足以下条件。

宿主机:

  • 安装了 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:WCOSFlash.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:WCOSTools,包括:

M:WindowsServicing 目录中的

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

M:WindowsSystem32 目录中的

  • 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:WCOSTools),测试 UpdateApp.exe 是否正常工作:

.UpdateApp.exe getinstalledpackages

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

UpdateApp - Update Application for Windows Mobile[00:00:00] Loaded servicing stack from X:wcostools 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:wcostools 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, UpdateOSMicrosoft-OneCore-HyperV-Guest-UpdateOS-Package~31bf3856ad364e35~amd64~~10.0.19563.1000, UpdateOSMicrosoft-OneCore-ServicingStack-UpdateOS-Package~31bf3856ad364e35~amd64~~10.0.19563.1000, updateos[...]getinstalledpackages completed successfully
command took 6 seconds

用 Dism++ 导出 Intel 显卡驱动到 D:WCOSDriversGraphicsIntel 中(Dism++会创建一个子文件夹存放文件,自行移动到上层文件夹中),这时在 D:WCOSDriversGraphicsIntel 中应该存在一个 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:WCOSDHCUDriversGraphicsiigd_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:WCOSFlash.vhdx"

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

Step 4:制作启动盘

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

  • Windows 10 19559 AMD64 或者更高版本的镜像中获取 boot 文件夹EFI 文件夹sourcesboot.wim 文件bootmgr.efi 文件
  • 从 GPT fdisk 下载 gdisk64.exe
  • 从 dd for windows 官网 下载 Windows 版本的 ddrelease64.exe
  • 从 GitHub 下载 EFI Shell,重命名为 bootx64.efi,然后移动到 efiboot 中,并将 efiboot 中 原有的 bootx64.efi 重命名为 winx64.efi
  • 新建一个 startup.nsh 文件,内容为:
dmpstore -d SecureBootPlatformIDfs0:efibootwinx64.efifs1:efibootwinx64.efifs2:efibootwinx64.efifs3:efibootwinx64.efifs4:efibootwinx64.efifs5:efibootwinx64.efifs6:efibootwinx64.efifs7:efibootwinx64.efifs8:efibootwinx64.efifs9:efibootwinx64.efifsA:efibootwinx64.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│      [···]│└─resourcesbootres.dllZ:.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  Name1             512            8703   32.0 MiB    EF00  BS_EFIESP2            8704        33554426   128.0 GiB   4202  OSPool

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

E:gdisk64.exe .physicaldrive0
#接受任何警告
x
zE:gdisk64.exe .physicaldrive0
#接受任何警告
n
1
4096
69624
EF00n
2
69632
268435408
4202c
1
BS_EFIESPc
2
OSPoolp
#检查与刚刚记下来的数字分区等有没有对应
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 和湘江一桥提供的思路,拯救了翻车的我。

vb 获取设备音量_自制 Windows 10X 启动盘,提前体验微软折叠设备新系统相关推荐

  1. 原版98启动盘镜像.img_装机技巧系列(二):系统安装之Windows 10启动盘制作

    在第一期的<用U盘制作自己的PE工具箱>结束之后,原本第二节更新系统安装的几种方法,而将制作Windows 10启动盘作为其中一部分,但最终还是决定单独再写一期制作Windows 10启动 ...

  2. unity获取麦克风音量_深入探究Valve Index的耳机、麦克风设计过程

    查看引用/信息源请点击:映维网 本文来自于Valve音频工程师艾米莉·丽琪维 (映维网 2019年08月13日)继深入介绍了Index头显的视场之后,Valve日前撰文探究了设备耳机和麦克风方面的设计 ...

  3. vb获取数组长度_如何实现数组的二分查找

    二分查找是一种极其高效.简练的查找算法,它不仅简单,易用,而且还非常的高效.相对于顺序查找,二分查找在效率是呈现指数性提升,数据量越大,越能体现出二分查找法的优势. 二分查找的查找过程是:先确定待查找 ...

  4. 一步一步学linux操作系统: 32 输入与输出系统_ 块设备二_直接 I/O,缓存 I/O 与 块设备数据写入请求

    直接 I/O 与 缓存 I/O 可以参见 https://blog.csdn.net/leacock1991/article/details/108035136 对于 ext4 文件系统,最后调用的是 ...

  5. hcl启动设备失败_施耐德ATS48M10Q软启动器启动时报故障维修技术精湛

    施耐德ATS48M10Q软启动器启动时报故障维修技术精湛其行走电动机软启动器的起动和停止较频繁,传统起动方式机械.电气冲击大,容易造成斗轮的联轴器.高速轴.减速机等部位的损坏,设备故障率高,同时靠自由 ...

  6. windows重装 启动时找不到安装盘 装系统时有盘解决

    这情况无法进入桌面,安装系统也没反应,这时候我们要按照如下方法解决: 一.首先 :进入BIOS – Security – Secure Boot Control设为Disabled 然后 :进入BIO ...

  7. ios分屏_【资讯】前iOS设计师主刀?vivo手机新系统发布在即!

    今日,vivo官方微博宣布了vivo全新的系统Origin,官方宣称历时了一年的精心打磨,官方称之为OriginOS. 新系统具体在FuntouchOS上做了哪些升级,或者说这个全新的OnginOS系 ...

  8. 支持蓝牙的模拟器_仍需打磨:首款Windows 10X模拟器上手

    今天,微软发布了适用于Windows 10X的首款模拟器,以便于开发人员初步了解适用于双屏设备的操作系统调整. 微软希望在Surface Neo今年年底正式发售之前,让开发人员对应用程序进行优化.因此 ...

  9. 下一代 Windows 10X 操作系统要来了!

    点击"开发者技术前线",选择"星标????" 让一部分开发者看到未来 导读:据最新消息称,Windows 10X有望于春季结束前向OEM厂商推送. 起初微软希望 ...

  10. 有关Windows 10X,你需要知道的一些信息

    微软发布的新版Windows 10X ,很多用户对它的确切含义感到困惑,Microsoft已发布的信息也是让人一知半解,本文提供与新操作系统有关的信息.继续阅读有关即将推出的Windows 10变体所 ...

最新文章

  1. Linux下安装数据库
  2. mybatis创建oracle用户,搭建Mybatis+Oracle项目以及简单的增删改查语法
  3. ceph的数据存储之路(10) -----ceph对象存储的ls命令实现及思考
  4. 1.设计模式中监听模式(观察者模式)(Python实现)
  5. Android控制ScrollView滑动速度
  6. 2017云栖大会门票转让_「揭秘GP」云栖大会 | Greenplum 6.0 内核优化解读和7.0展望...
  7. PHP编译configure时常见错误(转)
  8. linux usb有线网卡驱动_Linux系统下安装USB无线网卡驱动方法
  9. prelu()的 tf 代码
  10. 小迪外卖小程序源码+后台_外卖cps 赚钱小程序源码
  11. FMCW激光雷达原理推导公式
  12. 锐炬显卡和独立显卡有什么不同?
  13. Ansiable批量管理工具
  14. 美狐美颜SDK开源代码浅析
  15. nginx软件安装部署
  16. CTFHub 工控组态分析 WP
  17. 初学者备战蓝桥杯历程(大学编程学习历程记录,题目思路献给需要备考蓝桥杯的同学)
  18. 数据分析,怎么做才能有前瞻性
  19. 姑苏寻古[小刚执笔]
  20. 计算机网络实验-交换机VLAN实验

热门文章

  1. SQL Server海量数据查询代码优化建议
  2. 【动弹有奖】——OSC登录并发送动弹分析(附python源码)
  3. [置顶]       webservice系列1---基于web工程上写一个基本数据类型的webservice
  4. Spring2.5注解事务配置
  5. WP7 页面事件触发顺序测试
  6. JSP 页面 嵌入 google API 地图
  7. samba配置问题一则及配置详解
  8. 用qt调用第三方库resolve
  9. 【狂神说Redis】1NoSQL概述 1-1为什么使用NoSQL
  10. avue 文字点击 弹窗_目前最好用的文字转语音、视频配音方法,一键合成,智能黑科技...