15.10 -> 16.04 LTS 升級後登入中斷,與 NVIDIA 驅動程式有關

15.10 -> 16.04 LTS 升級後登入中斷,與 NVIDIA 驅動程式有關

我剛剛通過 將我的系統從 15.10 更新到 16.04 sudo do-release-upgrade。在此過程中,它顯示了一個帶有以下訊息的畫面:

您的系統已啟用 UEFI 安全啟動。 UEFI 安全啟動與第三方驅動程式的使用不相容。

(...)Ubuntu 仍然能夠在您的系統上啟動,但這些第三方驅動程式將不可用於您的硬體。

停用 UEFI 安全啟動? (是|否)

由於我使用的唯一第三方驅動程式是 NVIDIA 顯示卡驅動程序,並且它們在 Ubuntu 15.10 和啟用安全啟動的情況下運行良好,因此我在這裡選擇了“否”選項。我不明白為什麼我應該無緣無故地停用它,我認為我可以在更新後透過系統設定 GUI 重新安裝第三方驅動程式。

唉,不。重新啟動後,我的登入畫面以非常低的解析度顯示。當嘗試登入時,它立即讓我返回登入畫面。

我已嘗試以下方法來解決此問題:

sudo apt-get purge nvidia*
sudo reboot

這會導致紫色螢幕,並且對 Ctrl-Alt-F1 沒有反應。透過 SSH 登錄,然後我做了:

sudo apt-get install nvidia-current
sudo reboot

這再次給我帶來了前一種情況,登入螢幕解析度非常低,並且無法登入。

這是一次相當糟糕的升級體驗。其他人有這個問題嗎? (同時保持 UEFI 安全啟動啟用)謝謝。

答案1

到了 Ubuntu 15.10,Ubuntu 對安全啟動的處理就停在了 GRUB——也就是說,Ubuntu 版本的 Shim 會啟動 Ubuntu 版本的 GRUB,後者會啟動任何Linux 內核,無論是否已簽署。這是對安全啟動的支援非常低的標準。相較之下,Fedora 的 GRUB 將僅啟動已簽署的 Linux 內核,而 Fedora 的內核在偵測到安全啟動處於活動狀態時,將僅載入已簽署的內核二進位。 Fedora 更強大的安全啟動支援的目的是保護系統免受「流氓」內核模組的侵害,理論上,這些模組可以在非常低的級別接管電腦。 Ubuntu 15.10 及更早版本缺乏此類保護。

從 16.04 開始,Ubuntu 遵循更嚴格的安全啟動模組,更像 Fedora 長期以來所做的事情。這有安全方面的好處,但正如您所看到的,它也有問題。如果第三方驅動程式未使用 Ubuntu 版本的 Linux 核心識別為有效的加密金鑰進行簽名,則不會載入該驅動程式。這主要影響閉源 Nvidia 和 AMD/ATI 視訊驅動程序,但還有其他驅動程式也會受到影響。

此問題有(或可能有)多種解決方法:

  • 停用安全啟動——這是最簡單的解決方案。您可以透過修改韌體設定或(我認為)調整墊片設定來做到這一點。 (我不確定如何透過調整 Shim 的設定來做到這一點,但我很確定這是可能的。)
  • 不要使用第三方核心模組-- 如果您限制自己使用 Ubuntu 標準 Linux 核心中包含的開源驅動程序,那麼應該沒問題,因為 Canonical 簽署了所有此類驅動程式 (AFAIK)。請注意,使用此類驅動程式應該有很好的 Nvidia 支援;您的系統可能會回退到次優驅動程序,因為它認為閉源驅動程式可用。我不知道如何立即從一種切換到另一種,但是這個問題是關於使用 AMD/ATI 驅動程式執行此操作,因此這可能是一個有用的起點。
  • 簽署相關模組-- 從理論上講,您自己簽署商業模組應該可以使其正常工作。不幸的是,我沒有關於如何執行此操作的說明,事實上我甚至不完全確定是否可以使用現有的 Ubuntu 核心來執行此操作;這樣的核心可能只支援使用 Canonical 金鑰簽署的模組,當然您並不擁有該金鑰。
  • 編譯自己的內核-- 如果您編譯自己的內核,則可以根據需要設定其選項,包括放寬載入未簽名模組的限制。然後,您需要使用自己的 EFI 金鑰對核心進行簽名,並將該金鑰的公共版本新增至您的 MOK 清單。這是有關編譯您自己的核心的問題和解答。
  • 切換到較舊的 GRUB-- 因為較舊的 GRUB 將啟動未簽署的內核,所以您可以安裝這樣的 GRUB(來自 Ubuntu 15.10 或之前的版本)並讓它啟動未簽署的內核。請注意,維護較舊的 GRUB 可能會很痛苦。
  • 切換到不支援安全啟動的啟動載入程序-- 如果您使用自己的金鑰對SYSLINUX 或ELILO 等引導程式進行簽名,並將該金鑰的公共版本添加到MOK 清單中,則該引導程式將忽略安全引導設置,就像舊版的GRUB 一樣。然後您可以啟動未簽名的核心。

請注意,我 100% 確定這些選項中唯一有效的兩個是停用安全啟動或避免使用第三方核心模組。我像瘟疫一樣避免使用第三方核心模組,因此我沒有在安全啟動環境中使用它們的個人經驗。除了禁用安全啟動之外,建立自己的核心可能是下一個最有可能起作用的方法,其次是使用較舊的 GRUB 或使用不支援安全啟動的啟動載入程式。建立自己的核心曾經很常見,但很少有人再這樣做了,而對於現代內核,學習如何配置內核的時間投入(更不用說實際這樣做)可能是巨大的。使用較舊的 GRUB 或其他引導程式可能會更容易,但您需要足夠的了解才能進行設定。更簡單的方法可能是使用第二個安裝的較舊的 Ubuntu 進行雙重開機 - 但請注意,Ubuntu 16.04 可能會在某個時候恢復其 GRUB,因此您需要重新安裝較舊的 Ubuntu 的 GRUB 。

相關內容