除了 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 掛載剛剛從商店下載到的鏡像:
<code>Mount-VHD "D:\\WCOS\\Flash.vhdx"/<code>
然後檢查是否有正確掛載:
<code>Get-StoragePool -FriendlyName OSPool/<code>
如果顯示如下內容則為掛載成功:
<code>FriendlyName OperationalStatus HealthStatus IsPrimordial IsReadOnly Size AllocatedSize------------ ----------------- ------------ ------------ ---------- ---- -------------OSPool OK Healthy False False 127.9 GB 21.81 GB/<code>
要安裝鏡像,我們還需要使用 diskpart 為掛載的鏡像分配卷標:
<code>diskpartlis vol#選擇標籤為 MainOS 的卷sel vol 15#分配一個閒置的盤符(比如M)assign letter=M /<code>
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 是否正常工作:
<code>.\\UpdateApp.exe getinstalledpackages/<code>
正常工作的話會顯示以下內容:
<code>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_MainOS164 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 successfullycommand took 6 seconds/<code>
用 Dism++ 導出 Intel 顯卡驅動到 D:\\WCOS\\Drivers\\Graphics\\Intel 中(Dism++會創建一個子文件夾存放文件,自行移動到上層文件夾中),這時在 D:\\WCOS\\Drivers\\Graphics\\Intel 中應該存在一個 iigd.inf 的文件,打開它記下 Provider 和 DriverVer 的值,比如我的是:
<code>Provider=%Intel%DriverVer=09/25/2019,26.20.100.7262/<code>
Provider 提供的是一個變量值,inf 裡搜索可得:
<code>Intel = “Intel Corporation”/<code>
然後使用我們剛剛獲得的 UpdateApp.exe 為 Windows 10X 安裝驅動到 bsp 分區:
<code>.\\UpdateApp.exe install "DriverPackage|D:\\WCOS\\DHCUDrivers\\Graphics\\iigd_dch.inf|Intel_Corporation-iigd_dch.inf~amd64~26.20.100.7262~bsp|0"/<code>
這裡需要特別注意的是:
- 雙引號內的內容中若包含有空格,請用下劃線 _ 代替所有空格
- 文件名中也不得出現 - ,請修改文件名
- 有些驅動的 Provider 的值比較奇怪,比如 DW1820A 網卡的 Provider 的值為 BROADCOM, NTamd64.6.1,保留 BROADCOM 即可。
推薦安裝的驅動有網卡、顯卡和藍牙,其他的請自行斟酌添加。看到 install complete successfully 的提示才能確保安裝成功,若不成功請檢查上面的 Provider 和 DriverVer 的值
安裝完驅動後用管理員 PowerShell 運行以下命令卸載鏡像:
<code>Dismount-VHD "D:\\WCOS\\Flash.vhdx"/<code>
添加完驅動後就可以準備製作啟動盤了。
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 文件,內容為:
<code> 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/<code>
這個腳本會從 nvram 中刪除 SecureBootPlatformID 這個變量。因為 Windows 10X 會重新在 nvram 中寫入安全啟動的相關變量。
然後連接 USB 存儲設備(這裡我們製作的是 U 盤啟動盤),管理員運行 PowerShell 執行 diskpart(請確保在以下步驟中選擇正確的硬盤 ,否則您將丟失您的數據):
<code>lis dis#列出所有硬盤,然後選擇 USB 存儲設備,我這裡是磁盤1sel dis 1#清除硬盤clean#轉換成 gpt 格式convert gpt#創建一個 5000MB 的 FAT32 分區作為引導分區,並分配空盤符 Ycreate part pri size=5000format fs=fat32 quickassign letter=Y#剩餘空間創建為 exFAT 分區作為存儲分區,並分配空盤符 Zcreate part priformat fs=exfat quickassign letter=Z/<code>
以上面的分區為例,我們需要把 Step 4 開頭準備的文件和文件夾拷貝到 Y 盤中,Flash.vhdx 拷貝到 Z 盤中。
於是你獲得了一個啟動U盤了,它的目錄結構如下:
<code>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.dllZ:. Flash.vhdx/<code>
以上文件已打包上傳至 OneDrive
Step 4:如何安裝
在目標主機上從 USB 存儲設備啟動。開機時瘋狂按 Esc 中斷 startup.nsh 的執行,在 EFI Shell 中 輸入以下命令備份 nvram:
<code>dmpstore -all -s fs0:#此處的 fs0 可以自由選擇分區的,可以通過 fs<number>: 命令切換不同分區,並藉助 ls 命令查看硬盤裡的目錄得知是什麼硬盤的什麼分區/<number>/<code>
然後輸入 exit 再次重啟電腦,這次不中斷 startup.nsh 執行放任它自己啟動即可進入 Windows 10X 安裝環境,按鍵盤 Shift+F10 啟動 cmd(或者和我一樣進入自己的 Windows PE 系統運行 cmd),通過以下命令確定剛剛我們準備的工具和 Flash.vhdx 的所在分區(即上面提到的 Y 和 Z 分區,如果是 Windows PE 系統中可以直接打開文件管理器查看文件在哪)。
<code>C:dirD:dirE:dir[···]/<code>
例如我的啟動引導分區為 E,我的 Flash.vhdx 在 F 分區中,用 diskpart 掛載它:
<code>diskpart#啟動 diskpartsel vdisk file="F:\\Flash.vhdx"#選擇 Flash.vhdx 文件attach vdisk readonly#掛載虛擬磁盤為只讀lis dis #確認是否掛載成功,如果有看到超過物理磁盤的數量則掛載成功/<code>
根據啟動 cmd 的環境,分為兩種情況(我這裡為情況 2):
1. 如果是在 Windows 安裝環境啟動命令行的,則會看到一個 2048MB 的已聯機的磁盤,把它的編號然後減去 1 ,然後記下來,比如:
<code> 磁盤 ### 狀態 大小 可用 Dyn Gpt -------- ------------- ------- ------- --- --- 磁盤 4 聯機 2048 MB 2048 MB */<code>
則記下為磁盤 3。
2. 如果在 Windows PE 系統中會看到一個 128G 的已聯機的磁盤,因為這個 vhdx 是 128G 的動態擴展虛擬磁盤文件,記下磁盤編號,比如我的是磁盤 2
3. 在 diskpart 中選中要安裝的磁盤並抹除:
<code>sel dis 0#如上圖我要安裝的硬盤為磁盤 0,選中它clean#抹除convert mbr#轉換為 mbr,和大佬討論之後認為目的是徹底地破壞 gpt 分區結構exit#退出 diskpart/<code>
然後把 Windows 10X 鏡像數據寫入到物理硬盤中:
<code>E:\\ddrelease64.exe if=\\\\.\\physicaldrive2 of=\\\\.\\physicaldrive0 bs=8M --progress/<code>
注意:該命令中的 physicaldrive2 和 physicaldrive0 是根據我自己的實際情況(磁盤 2)編寫的,請讀者自行替換。即將 2 替換為剛剛記下來的掛載的 vhdx 虛擬磁盤的磁盤號;將 0 替換為要安裝系統的磁盤號,筆記本單硬盤的狀況下一把就是 physicaldrive0 了。
例如,情況 1 中的例子是磁盤 3,此處則應該將 physicaldrive2 替換成 physicaldrive3 ,下文中所用的磁盤號均使用我實際情況中的磁盤號,即 0 和 2,也請讀者自行同步替換。
另外,一定要加上 --progress 這個參數,不然會等得很著急。去休息一下,等待它達到 131072M 即可,出現錯誤 27 直接無視,已經寫入成功了。
接著我們運行以下命令:
<code>E:\\gdisk64.exe -l \\\\.\\physicaldrive2/<code>
出現如下結果然後拍照截圖記下來:
<code>[···]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/<code>
然後手動重建 gpt 分區,運行以下命令(基本照搬即可):
<code>E:\\gdisk64.exe \\\\.\\physicaldrive0#接受任何警告xzE:\\gdisk64.exe \\\\.\\physicaldrive0#接受任何警告n1409669624EF00n2696322684354084202c1BS_EFIESPc2OSPoolp#檢查與剛剛記下來的數字分區等有沒有對應w#確認執行即可/<code>
這時就可以退出 Windows PE 或者 Windows 安裝環境,拔下 USB 存儲設備,重啟計算機,這時應該可以啟動 Windows 10X 了,請盡情探索!
如何恢復啟動原來的系統
如果你在一臺本身安裝了 Windows 10 的設備上安裝 Windows 10X,Windows 10X 會在 nvram 中寫入安全啟動相關的信息,導致正常的 Windows 10 系統無法啟動,這時候需要進入 EFI Shell 刪除剛剛啟動盤中的 startup.nsh 文件,方法如下。
從 U 盤啟動進入 EFI Shell, 執行以下命令:
<code>dmpstore -d -all/<code>
以上命令會清除 nvram ,可能會導致鍵盤大寫燈無法亮起或者其他未知問題。重啟選擇正常 Windows 所在的硬盤啟動,應該就可以正常啟動原來正常的 Windows 10 系統了。
如果無法啟動,可以嘗試再次清除 nvram,步驟同上;如果出現鍵盤大寫燈無法亮起或者其他未知問題,可以通過 EFI Shell 嘗試恢復我們上面備份的 nvram:
<code>dmpstore -all -l fs0:VarDump.txt/<code>
此教程送給各位想要折騰體驗的朋友。至此這篇教程徹底結束,體驗文我也不知道什麼時候能寫完……
閱讀更多 少數派 的文章