[Windows] 從命令列啟用/停用 Hyper-V

※ 2020/12/29 update:
這篇文章原本是因為 Android 模擬器和 Hyper-V 會相衝
為了簡化切換步驟 (啟用 / 停用 Hyper-V)
而記錄了相關步驟的 script

目前 BlueStacks 已推出較穩定的 Hyper-V 版本模擬器:
BlueStacks 4.250 版本日誌

所以不再需要這個切換動作囉
也期望其他模擬器廠牌能跟進,有競爭才有進步,使用者就有更多更好的選擇!
 

環境:
Win10 專業版 1909
docker desktop community 2.4.0.0 (48506) stable


在 Win10 執行 docker for windows 時,會需要啟用 Hyper-V 功能

如果 Hyper-V 未啟用,執行時錯誤提示導向的官方文件也有說明如何解決

基本上在安裝過程中,也會有選項詢問你是不是要順便啟用 Hyper-V

或是在安裝完成後,也可以手動到【控制台】-【Windows 功能】來啟用 (需要重啟系統)

OK 好,一切安裝完程執行順利了,歲月靜好

那為什麼又要關閉 Hyper-V 呢

 

如果和我一樣有需求安裝 Android 模擬器 (例如:Nox夜神BlueStacks) 來 打手遊 測試 App

在安裝完 docker for windows 後,很可能會發現 Android 模擬器打不開了

輕則彈出錯誤提示,要求關閉 Hyper-V

糟糕一點的,則是直接進入藍白畫面 (BSOD) 當機給你看

在一些文章討論中指出,有不少 Android 模擬器都是基於 VirtualBox 開發

而 VirtualBox 會和 Hyper-V 產生衝突

 

所以在一些特定情況下,需要再把 Hyper-V 停用

這部分需要 2 個步驟:

1. 以管理者權限在命令提示字元,將 Windows 開機設定資料 (BCD) 的 hypervisorlaunchtype 改為 off
bcdedit /set hypervisorlaunchtype off

2. 手動到控制台 Windows 功能停用 Hyper-V,這部分也可以透過命令提示字元執行
dism /Online /Disable-Feature /FeatureName:Microsoft-Hyper-V-All

再按下 Y 就會自動重啟系統

這兩行指令可以寫在一起存成 .cmd 檔,分成停用、啟用 2 個指令檔以方便使用

HyperVDisable.cmd
bcdedit /set hypervisorlaunchtype off
dism /Online /Disable-Feature /FeatureName:Microsoft-Hyper-V-All

HyperVEnable.cmd
bcdedit /set hypervisorlaunchtype auto
dism /Online /Enable-Feature /FeatureName:Microsoft-Hyper-V-All

然後把檔案所在路徑加入環境變數 PATH 中,需要時就可以在命令提示字元直接執行

不用再跑去控制台開關功能

 

存成 .bat 檔也可以,細節差異可以參考這篇討論

大意是說 .bat 是早期 Win XP 之前 16 bit OS 的支援格式

後來 32 bit OS 的 .cmd 新增了更多功能,不過 cmd.exe 仍然相容可執行 .bat 檔

如果擔心有人不小心把新版的批次檔複製到 16 bit windows 用會壞掉

可以一律存成 .cmd (哪裡還有這種古董 OS?)

 

但是停用 Hyper-V 這個辦法的缺點也很明顯:需要重開機

所以在開發需要本機 docker 服務的時候,沒辦法很快地切換成可以執行 Android 模擬器的環境

可能手邊有開發工具、文件、通訊等一堆軟體要先存檔關閉

才能安心切換、重啟系統

 

在查詢 solution 的過程中,也有發現 BlueStacks 在 2020.07 有發佈支援 Hyper-V 的測試版本

但實際測試安裝,在啟動執行時就會閃退

因為 BlueStacks 也有說這個版本還在 Beta,我就沒有再深入去研究,等它穩定一點再來看看

 


番外篇 (1):Windows Feature 查詢、啟用、停用指令

- 查詢功能名稱 (因為可能和 Windows 功能 看到的顯示名稱不同)
dism /Online /Get-Features
dism /Online /Get-Features /Format:table  (以表格方式呈現,較好閱讀)

- 啟用
dism /Online /Enable-Feature /FeatureName:功能名稱

- 停用
dism /Online /Disable-Feature /FeatureName:功能名稱

## Powershell 版

- 查詢
Get-WindowsOptionalFeature

- 啟用
Enable-WindowsOptionalFeature -Online -FeatureName "功能名稱" -All
  加上 - All 參數可一併啟用關聯的 dependency feature

- 停用
Disable-WindowsOptionalFeature -Online -FeatureName "功能名稱"


番外篇 (2):Win10 家用版安裝 docker for windows

Win10 家用版預設沒有包含 Hyper-V 功能,到控制台會找不到功能可以啟用

可以依照這篇教學說明

1. 利用命令列安裝【Microsoft-Hyper-V-All】、【Containers】功能

2. 再修改註冊檔的產品名稱,「暫時假裝」系統是 Win10 專業版 (重啟系統會自動復原)

就可以安裝執行 docker for windows


參考文章:

docker docs: Logs and troubleshooting - Virtualization
https://docs.docker.com/docker-for-windows/troubleshoot/#virtualization

stackoverflow: Simple instructions needed for enabling and disabling Hyper V Docker
https://stackoverflow.com/questions/47081205/simple-instructions-needed-for-enabling-and-disabling-hyper-v-docker

microsoft docs: PowerShell - Reference - DISM 
https://docs.microsoft.com/en-us/powershell/module/dism/get-windowsoptionalfeature?view=win10-ps

microsoft docs: BCDEdit 命令列選項
https://docs.microsoft.com/zh-tw/windows-hardware/manufacture/desktop/bcdedit-command-line-options

挨踢攻城獅學習之路: Hyper-V與VMware共存問題
https://blog.cwlove.idv.tw/docker-work-with-vmware/

挨踢攻城獅學習之路: Windows 10 Home安裝Hyper-V及Docker
https://blog.cwlove.idv.tw/win10-home-install-hyper-v-docker/

軟體主廚的程式料理廚房: [廚餘回收] VirtualBox 與 Hyper-V 在 Windows 10 底下發生衝突的緩解辦法
https://dotblogs.com.tw/supershowwei/2016/04/06/170842

stackoverflow: Windows batch files: .bat vs .cmd?
https://stackoverflow.com/questions/148968/windows-batch-files-bat-vs-cmd

宥叡YuRui 的小天地: 不再衝突!BlueStacks 推出 Hyper-V 測試版!Windows 10 專業版的福音!
https://jay900604.pixnet.net/blog/post/359694019-bluestacks-hyperv-beta

NoxPlayer: Windows 10 出現 BSoD(藍屏死當)&關閉Hyper-V解決辦法
https://tw.bignox.com/blog/bsod/

BlueStacks: 如何在Windows中禁用Hyper-V?
https://support.bluestacks.com/hc/zh-tw/articles/115004254383

BlueStacks: 如何在啟用Hyper-V的情況下執行BlueStacks
https://support.bluestacks.com/hc/zh-tw/articles/360041390952