為什麼我的獨立於作業系統的 grub 分割區能夠使用較舊的核心版本正確地引導到 Ubuntu,但不能使用較新的核心版本?

為什麼我的獨立於作業系統的 grub 分割區能夠使用較舊的核心版本正確地引導到 Ubuntu,但不能使用較新的核心版本?

我有一個硬碟具有以下分區設定: 在此輸入影像描述

  • sda1&2是windows分區
  • sda4 是一個擴充分割區,包含邏輯分割區 sda5&6
  • sda5是ubuntu的交換分區
  • sda6 是 ubuntu 根分區(版本 20.04)
  • sda3 是一個僅包含 grub 檔案的分割區,電腦從這裡啟動,然後根據 grub 選單中選擇的內容連結載入 Windows 或 ubuntu 引導程式

基本上,我一直在嘗試使用 Grub 定制器來自訂我的 grub 選單,Grub 定制器是用於編輯 grub 設定檔並產生 grub.cfg 的 GUI。儘管成功地使用不同的超時時間和背景映像對其進行了自定義,但在選擇啟動到 Ubuntu 後,它最終會卡住,顯示以下“[ OK ]”日誌(我不知道如何調用它): 在此輸入影像描述

請注意,此時我仍然可以使用 ctrl+alt+f2 在沒有 gui 的情況下登入。

我使用 diff 命令來確認 Grub 定制器產生與 grub-mkconfig 命令相同的 grub.cfg(根據這次討論),這樣就可以將問題歸咎於 grub 配置本身。在使用kdiff3 並進行廣泛實驗後,我發現如果我按照以下方式手動更改grub.cfg 中的ubuntu 選單項目(當然是grub 分割區上的選單項目),問題就會消失,同時保留所需的自訂設定:

啟動故障:

### BEGIN /etc/grub.d/10_linux_proxy ###

function gfxmode {
    set gfxpayload="${1}"
    if [ "${1}" = "keep" ]; then
        set vt_handoff=vt.handoff=7
    else
        set vt_handoff=
    fi
}
if [ "${recordfail}" != 1 ]; then
  if [ -e ${prefix}/gfxblacklist.txt ]; then
    if hwmatch ${prefix}/gfxblacklist.txt 3; then
      if [ ${match} = 0 ]; then
        set linux_gfx_mode=keep
      else
        set linux_gfx_mode=text
      fi
    else
      set linux_gfx_mode=text
    fi
  else
    set linux_gfx_mode=keep
  fi
else
  set linux_gfx_mode=text
fi
export linux_gfx_mode



menuentry "Ubuntu" --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-c1cf0131-85a4-4147-b74c-38df34cd47cc' {
    recordfail
    savedefault
    load_video
    gfxmode $linux_gfx_mode
    insmod gzio
    if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
    insmod part_msdos
    insmod ext2
    set root='hd0,msdos6'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos6 --hint-efi=hd0,msdos6 --hint-baremetal=ahci0,msdos6 --hint='hd0,msdos6'  c1cf0131-85a4-4147-b74c-38df34cd47cc
    else
      search --no-floppy --fs-uuid --set=root c1cf0131-85a4-4147-b74c-38df34cd47cc
    fi
    linux   /boot/vmlinuz-5.4.0-45-generic root=UUID=c1cf0131-85a4-4147-b74c-38df34cd47cc ro acpi_sleep=nonvs quiet splash $vt_handoff
    initrd  /boot/initrd.img-5.4.0-45-generic
}
### END /etc/grub.d/10_linux_proxy ###

工作啟動:

...
    linux   /boot/vmlinuz-5.4.0-42-generic root=UUID=c1cf0131-85a4-4147-b74c-38df34cd47cc ro acpi_sleep=nonvs quiet splash $vt_handoff
    initrd  /boot/initrd.img-5.4.0-42-generic
}
### END /etc/grub.d/10_linux_proxy ###

(我只是將 vmlinuz-5.4.0-45-generic 和 initrd.img-5.4.0-45-generic 分別更改為 vmlinuz-5.4.0-42-generic 和 initrd.img-5.4.0-42-generic)

我想:

  1. 知道使用 5.4.0-42 影像而不是 5.4.0-45 影像有何不同
  2. 找到適用於「45」的正確 grub 設定選項,這樣我就不必每次想要自訂 grub.cfg 時都手動編輯它。

更新 11:31 UTC+2, 9/9/20:就在一個小時前,我下載了新的 linux 核心(5.4.0-47)並嘗試使用它來啟動,但出現了與 5.4.0-45 相同的問題。所以我將 grub.cfg 編輯回 5.4.0-42。所以現在我有 3 個不同的核心可供使用:5.4.0-{42,45,47}。只是一個想法,但考慮到 gnome 桌面似乎根據啟動“[OK]”日誌成功啟動(仍然不知道它的名字是什麼),這不是主要嫌疑人嗎?那和 nvidia 守護程序在日誌頂部附近失敗。

更新 13:14 UTC+2 9/9/20sudo systemctl status nvdia-persistenced.service:這是GUI 啟動失敗後的結果:

● nvidia-persistenced.service - NVIDIA Persistence Daemon
     Loaded: loaded (/lib/systemd/system/nvidia-persistenced.service; static; vendor preset: enabled)
     Active: failed (Result: exit-code) since Wed 2020-09-09 11:54:44 EEST; 1min 43s ago
    Process: 876 ExecStart=/usr/bin/nvidia-persistenced --user nvidia-persistenced --no-persistence-mode --verbose (code=exited, status=1/FAILURE)
    Process: 896 ExecStopPost=/bin/rm -rf /var/run/nvidia-persistenced (code=exited, status=0/SUCCESS)

Σεπ 09 11:54:43 george-Aspire-E5-571G nvidia-persistenced[882]: Failed to query NVIDIA devices. Please ensure that the NVIDIA device files (/dev/nvidia*) exist, and that user 126 has read and write permissions for those files.
Σεπ 09 11:54:43 george-Aspire-E5-571G nvidia-persistenced[882]: PID file unlocked.
Σεπ 09 11:54:43 george-Aspire-E5-571G nvidia-persistenced[882]: PID file closed.
Σεπ 09 11:54:43 george-Aspire-E5-571G nvidia-persistenced[882]: The daemon no longer has permission to remove its runtime data directory /var/run/nvidia-persistenced
Σεπ 09 11:54:43 george-Aspire-E5-571G nvidia-persistenced[876]: nvidia-persistenced failed to initialize. Check syslog for more details.
Σεπ 09 11:54:43 george-Aspire-E5-571G nvidia-persistenced[882]: Shutdown (882)
Σεπ 09 11:54:42 george-Aspire-E5-571G systemd[1]: Starting NVIDIA Persistence Daemon...
Σεπ 09 11:54:43 george-Aspire-E5-571G systemd[1]: nvidia-persistenced.service: Control process exited, code=exited, status=1/FAILURE
Σεπ 09 11:54:44 george-Aspire-E5-571G systemd[1]: nvidia-persistenced.service: Failed with result 'exit-code'.
Σεπ 09 11:54:44 george-Aspire-E5-571G systemd[1]: Failed to start NVIDIA Persistence Daemon.

答案1

結果我運行的是較舊的 nvidia 驅動程式版本,該版本與較新的核心不相容。刪除舊的 nvidia 驅動程式並從 ubuntu 儲存庫安裝最新的驅動程式就可以了。

假設 nvidia 驅動程式出現故障,我透過執行此腳本(對發現的腳本稍加修改的版本)執行了一項高風險、高回報的操作這裡)卸載所有 nvidia 驅動程式並從 ubuntu 儲存庫安裝最新驅動程式:

#!/bin/bash

sudo apt remove --purge '^nvidia-.*' -y
sudo apt install ubuntu-desktop -y
sudo apt --purge remove "*cublas*" "cuda*" -y
sudo apt --purge remove "*nvidia*" -y
sudo add-apt-repository --remove ppa:graphics-drivers/ppa -y
sudo trash /etc/X11/xorg.conf
sudo apt autoremove -y

sudo ubuntu-drivers devices
sudo ubuntu-drivers autoinstall
sudo reboot

安裝新的 nvidia 驅動程式後,我沒有修改 grub.cfg 以使用最新的核心(5.0.4-47)來查看舊核心(5.0.4-42)如何運作。這導致了與問題中描述的相同的錯誤。之後我將 grub.cfg 中的核心版本切換為 5.0.4-47,我終於可以正確啟動到 gnome 桌面了。

我的結論是,畢竟問題是linux核心和nvidia顯示卡驅動不相容造成的。如果您遇到類似的問題,我建議您保持 Linux 核心和顯示卡驅動程式為最新版本,必要時重新安裝 nvidia 驅動程式。

相關內容