目前幾種主流的 Linux 版本,近年都已經可以正常在微軟 Hyper-V 中直接安裝及使用,不再像過去須特別新增「傳統網路介面卡」,或安裝整合元件 (Linux Integration Services, 後簡稱 LIS) 才能正常驅動 Hyper-V 專屬網卡。但為了能讓 Linux 更能緊密地在 Hyper-V 上完善運作,還是強烈建議將微軟不定期釋出的 LIS 版本做安裝及更新。

安裝 LIS 的方式現在很簡單,不在這裡贅述。主要分享這次在 CentOS 7.6 (1810) 安裝 LIS 4.3 後,所發生的開機失敗及修復過程。

環境: Windows Server 2016 及 Windows Server 2019 Hyper-V
虛擬機: Cent OS 7.6 1810 (啟用安全開機, Secure Boot)
LIS 版本: Linux Integration Services for Hyper-V 4.3.0

在一台全新以 Minimal Install 安裝 CentOS 7.6 (3.10.0-957.el7.x86_64) 的虛擬機器,無論這台虛擬機器是在 Server 2016 還是 Server 2019 的 Hyper-V,只要安裝了近期釋出的 LIS 4.3,重開後就無法正常啟動 (如上圖)。

特別先提的是,只要虛擬主機是 Windows Server 2016 Hyper-V 以上,及 CentOS 為 7.0 以上的版本,不再需要刻意去關安全開機,就能正常安裝及使用。但請務必確認選擇的範本為「Microsoft UEFI Certificate Authority」。

因此,我的 VM 預設有啟用安全開機,合理推斷加上在 GitHub 的討論,停用安全開機,應該就能正常啟動。果不其然 /=.=/

所以,似乎目前解決方向是:
停用安全開機」或「卸除 LIS 整合元件

只是,無論上述哪一種,對我都不是期望的選擇。

於是,開始思考是否有可能,啟用安全開機同時也完成安裝 LIS 整合元件? 在上班通勤途中,重新閱讀了 LIS 4.3 的 Release Note,發現在 Known Issues 的 RPM Versions Specific to Kernel Version 段落中提到:
The kernel modules packaged as RPMs are built against specific kernel versions and can cause a kernel panic if applied to incorrect kernels. RPM rules have been applied to prevent an installation that will fail to boot. 」

既然開機失敗了,在不想關閉安全開機,或者使用者無權更改安全開機選項的狀況下,勢必會嘗試用 Rescue Mode 救援模式進入 CentOS。

在這個模式下,的確可以正常開機進入,但我在這個模式,做的不是移除 LIS 整合元件。而是根據 Release Note 提到的 Kernel 版本對應狀況,執行下面指令做更新動作

yum update

發現確實有更新到 CentOS Kernel 套件: kernel.x86_64

接著重開,選單出現新的項目,Kernel 版本為 3.10.0-957.10.1.el7.x86_64

選擇後,終於恢復正常開機進入 CentOS。
達到我期望的,安全開機是啟用的狀態,LIS  也沒有被移除且相關服務運作正常 (灑花~~~)

不過...另一個問題來了,如果 CentOS 的 Kernel 已經先升級上去了怎辦?

於是,我建了 Lab 來回測試,同樣是全新安裝的 CentOS 7.6 (3.10.0-957.el7.x86_64),先執行「yum update」更新及升級 Kernel 到 3.10.0-957.10.1.el7.x86_64,然後再安裝 LIS 4.3。

最後重開...也發生啟動失敗 /:S/
沒想到,只是先升級 Kernel,再安裝 LIS 4.3 也會開機失敗,似乎又要回頭選擇停用安全開機或移 LIS 整合元件的老路,因為已經沒得更新?

我重新思考第一個狀況的處理過程: 先安裝了 LIS 4.3,再進行 Kernel 更新,恢復正常開機;再根據以前遇過微軟更新或 Hotfix 的安裝經驗,某些情況必須先裝 A 才能再裝 B,先裝 B 是不行的 (咦,唸起來哪裡怪怪的)。

所以,我大膽嘗試在 CentOS 的 Rescue Mode 救援模式中執行:
1. 移除已安裝的 LIS 4.3
2. 移除已更新的 Kernel 套件: kernel.x86_64

 yum list installed | grep kernel
yum remove kernel.x86_64

重點來了,注意順序 (經過反覆測試,前面動作無須刻意先重開)
3. 重新安裝 LIS 4.3
4. 重新安裝新版 Kernel 套件

yum update kernel.x86_64

5. 重開

然後...就真的修好了 /=.=/

安裝順序參考證明

結語
落落長寫一堆,以我這次在 Cent OS 7.6 上遇到的 LIS 安裝狀況,歸納重點就是,先安裝 LIS 4.3,再到救援模式裝新版 Kernel,才能讓啟用了安全開機 (Secure Boot) 的 VM 正常運作。

如果不想啟用安全開機,或許就不會踩到上述狀況。但,安全開機是一種保護電腦的安全機制,身為一個 IT 從業人員,我們都應該堅守那道資安防線。

後記
在撰寫本文及截圖過程發現,似乎是因為更新了 LIS 4.3 後,只要開機的 hv_vmbus 模組是 LIS 4.3 提供的版本,就會造成啟動失敗。透過上述動作能將 hv_vmbus 置換回 CentOS 系統所預載的,但 Hyper-V Daemon 相關服務則會是使用 LIS 4.3 的元件。

所以這個鍋看來應該有人要出來背了 /8-)/

或許,我再研究如何手動置換這個 hv_vmbus 模組,就不需要這麼繁雜的處理過程。

延伸閱讀
Dubai Security Blog - Diving into Secure Boot
Microsoft Docs - Supported Linux and FreeBSD virtual machines for Hyper-V on Windows
不自量力 の Weithenn - CentOS 7.4 基礎設定 (1) - 安裝整合服務並建立一般使用者帳號