隨手紀錄一下使用Ubuntu遇到的問題跟如何應對
……要說是否有解決問題倒不一定……
注意:以下內容都是基於下述相對舊型號的主機規格而寫的,新版的硬體不一定適用文中描述
這是目前(2026年08月)使用的主機規格,硬體購置組裝是在2012年12月左右。
2023年底才重灌系統自 Windows10專業版 轉到 Ubuntu 。
| 作業系統 | Ubuntu 22.04.5 LTS |
| 系統類型 | 64位元 |
| 內核版本 | Linux 5.15.0-186-generic |
| GNOME版本1) | GNOME Shell 42.9 |
| 視窗系統 | X11 |
| ————— | ——————————————————— |
| 硬體型號 | ASUS All Series |
| 主機板 | B85M-G |
| 處理器 | Intel® Core™ i5-4570 CPU @ 3.20GHz × 4 |
| 記憶體 | 8GiB DIMM DDR3 Synchronous 1600 MHz |
| 顯示卡 | NVIDIA Corporation GK106 [GeForce GTX 660] |
| 硬 碟 | 120GB INTEL SSDSC2BW12 |
| 1TB WDC WD10EZEX-00U | |
由於 NVIDIA GTX 660 使用舊的 Kepler 架構,這使得其與後續針對新的 Maxwell 架構 下開發的 535、550及580 驅動並不相容,而 470 驅動 NVIDIA 官方已於2024年07月停止維護,使得官方驅動無法再針對2022年後推出的 Linux 6.x 內核作調整。
附上可以使用 470 驅動顯示卡的 NVIDIA 官方資料:連結
就算想強制顯示卡使用 535 以後的驅動,硬體也無法識別只會有黑畫面或是根本不載入使用只以內顯運行。
除了驅動程式外,當用到較新視窗系統及系統內核時也會造成奇怪的衝突。這邊遇到的情況如下:
最後總結起來,問題徵節點如下:
嘗試列出有使用過的解決方式,並會註明是否有效。
# 執行以下指令,將 5.15 核心相關套件全部鎖定 # 執行後會顯示 linux-image-5.15.x-xx-generic set on hold. 等字樣 # 這代表未來系統更新時,會自動跳過核心升級。 # 未來如果想解除鎖定,將指令中的 hold 改為 unhold 即可。 sudo apt-mark hold linux-image-5.15* linux-headers-5.15* linux-modules-5.15*
# 編輯設定檔 # 在某些發行版如 Fedora 或 Arch,路徑可能是 /etc/gdm/custom.conf sudo nano /etc/gdm3/custom.conf
# WaylandEnable=false
# 如果畫面回傳 x11,就代表您已經成功 echo $XDG_SESSION_TYPE
# 編輯 Grub 設定檔: sudo nano /etc/default/grub # 找到 GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" 這行,加入指令並存檔: # pcie_aspm=off 關閉主動狀態電源管理 GRUB_CMDLINE_LINUX_DEFAULT="quiet splash pcie_aspm=off pcie_port_pm=off"
sudo update-grub sudo reboot
# 清理過期的日誌,只保留最近的 500M sudo journalctl --vacuum-size=500M # 限制日誌最大體積 sudo sed -i 's/#SystemMaxUse=/SystemMaxUse=500M/' /etc/systemd/journald.conf sudo systemctl restart systemd-journald
嘗試解決黑畫面查看 log 的過程中注意到了「can't change power state from D3cold to D0」這一段,改關閉核心的 PCIe 動態電源控制,避免卡死在 D3cold。
其餘依錯誤訊息總結問題點如下:
下列過程一樣是在 470 版本驅動下執行,由 GRUB 直接對主機板和顯示卡下「禁用 PCIe 動態電源管理」指令。目前觀察下來似乎是解決了睡眠喚醒黑畫面的問題。操作流程如下:
sudo nano /etc/default/grub
# pcie_aspm=off:關閉動態連結電源管理(ASPM),讓 PCIe 匯流排一直保持在 L0(全速/全開)狀態。 # pcie_port_pm=off:關閉整個 PCIe 連接埠的電源管理。 # acpi_osi=! acpi_osi=Windows 2009:模擬 Windows7 環境,避免發送錯誤的 D3 睡眠指令。 # pci=noaer:關閉 PCIe 錯誤回報,防止喚醒時被大量錯誤訊息卡死。 # nomodeset:強制 Ubuntu 在核心層級不要提早硬鎖畫面,把控制權完全留給重新開機或喚醒後的 NVIDIA 驅動。 GRUB_CMDLINE_LINUX_DEFAULT="quiet splash pcie_aspm=off pcie_port_pm=off acpi_osi=! acpi_osi=\"Windows 2009\" pci=noaer nomodeset"
sudo update-grub
# 刪除所有干擾電源的系統規則。 sudo rm -f /lib/udev/rules.d/*nvidia*pm* sudo rm -f /lib/udev/rules.d/80-nvidia-pm.rules sudo rm -f /etc/udev/rules.d/80-nvidia-pm.rules
# 開啟終端機,建立一個 NVIDIA 的設定檔。 sudo nano /etc/modprobe.d/nvidia-power-management.conf
# NVreg_Mobile=0:強制驅動以純桌機(Desktop)硬體邏輯運作,禁止任何變相的 PCIe 深度省電。 # PowerMizer...:將顯卡鎖定在高能效/不隨意降頻睡眠的狀態。 options nvidia NVreg_Mobile=0 options nvidia NVreg_RegistryDwords="PowerMizerEnable=0x1; PerfLevelSrc=0x2222; PowerMizerLevel=0x3; PowerMizerDefault=0x3; PowerMizerDefaultAC=0x3" options nvidia_drm modeset=0
# 停止並永久封鎖這三個中介睡眠服務。 # 停止、關閉、禁用。 sudo systemctl stop nvidia-suspend nvidia-hibernate nvidia-resume sudo systemctl disable --now nvidia-suspend.service nvidia-hibernate.service nvidia-resume.service sudo systemctl mask nvidia-suspend.service nvidia-hibernate.service nvidia-resume.service
# 強制更新系統核心映像) sudo update-initramfs -u -k all # 重新開機 sudo reboot
# 關鍵字搜尋,這會篩選出所有與 D3 或 NVIDIA 相關的核心警告。 sudo dmesg | grep -E -i "d3|d0|pcie|nvidia" | tail -n 20 # 只列出錯誤訊息。 sudo dmesg | grep -i error # 想在「點擊睡眠前」就開著視窗觀察,可以在睡眠前先打開一個終端機,輸入以下指令讓它保持即時動態更新: sudo dmesg -w
由於 Ubuntu 22.04 官方軟體庫似乎移除了支援,無法透過 apt install 指令安裝 470 驅動,故需改用 NVIDIA 官方為 Linux 提供的獨立 NVIDIA-Linux-x86_64-470.256.02.run 安裝檔10),終端機的操作流程如下:
# 清空有 nvidia 字串的軟體,-y 是自動同意執行,可去掉。 sudo apt purge "*nvidia*" -y # 清空有關連性的部份。 sudo apt autoremove -y # 清除apt快取。 sudo apt clean -y
sudo apt update sudo apt install build-essential sudo apt install linux-headers-generic
wget https://tw.download.nvidia.com/XFree86/Linux-x86_64/470.256.02/NVIDIA-Linux-x86_64-470.256.02.run
# 赋予檔案執行權限,檔名有不一樣就自行變更。 chmod +x NVIDIA-Linux-x86_64-470.256.02.run # 執行官方藍底白字安裝程序(加上參數防止與系統現有設定衝突)。 sudo ./NVIDIA-Linux-x86_64-470.256.02.run --no-questions --ui=none
sudo reboot
# 若檔案放在其它位置則需修改路徑,這裡預設是家目錄下。 sudo ./NVIDIA-Linux-x86_64-470.256.02.run
# 可以只寫成stop及disable各一行就好 sudo systemctl stop nvidia-suspend.service sudo systemctl stop nvidia-hibernate.service sudo systemctl stop nvidia-resume.service # disable 改成 enable 就可以重新啟用。 sudo systemctl disable nvidia-suspend.service sudo systemctl disable nvidia-hibernate.service sudo systemctl disable nvidia-resume.servicenull # 更新系統核心引導映像檔,以確保設定有成功。 sudo update-initramfs -u sudo reboot
# 確認官方驅動是否被核心認可。 # 如果顯示命令不存在或找不到顯卡:代表系統重灌驅動後,內核在開機時依然跳過了 NVIDIA 驅動。 nvidia-smi # 檢查顯示卡驅動核心模組狀態。 # 如果有跳出包含 nvidia_drm、nvidia_modeset 等多行結果,代表驅動確實活著。 lsmod | grep nvidia
# 建立安全性規則,告訴背景自動更新服務不執行帶有 nvidia 關鍵字的套件
sudo tee /etc/apt/apt.conf.d/51unattended-upgrades-nvidia-blacklist << 'EOF'
Unattended-Upgrade::Package-Blacklist {
"nvidia-";
"libnvidia-";
"xserver-xorg-video-nvidia-";
};
EOF
# 清理系統目前的 apt 升級暫存快取,確保沒有額外的驅動殘留
sudo apt-get clean
sudo apt update
指令最後面可加 2>/dev/null ,這是一個 Linux 的標準錯誤重導向操作
它的功能是:「如果前面這條指令產生了任何錯誤訊息,請直接丟棄並隱藏,不要顯示在畫面上。」
這通常是為了避免腳本被不必要的警告干擾,或是保持終端機畫面乾淨
sudo tee /etc/apt/preferences.d/nvidia-pin << 'EOF' Package: *nvidia*-535* *nvidia*-550* *nvidia*-560* *nvidia*-580* Pin: release * Pin-Priority: -1 Package: *nvidia*-470* Pin: release * Pin-Priority: 1001 EOF
# 清空有 nvidia 字串的軟體。 sudo apt purge "*nvidia*" # 清空有關連性的部份。 sudo apt autoremove # 清除apt快取。 sudo apt clean sudo apt update
sudo apt install nvidia-driver-470
sudo apt install nvidia-driver-470 正在讀取套件清單... 完成 正在重建相依關係... 完成 正在讀取狀態資料... 完成 有些套件無法安裝。這可能意謂著您的要求難以解決,或是若您使用的是unstable 發行版,可能有些必要的套件尚未建立,或是被移出 Incoming 了。以下的資訊或許有助於解決當前的情況: 下列的套件有未滿足的相依關係: nvidia-driver-470 : 相依關係: nvidia-driver-535 但它卻無法安裝 E: 無法修正問題,您保留 (hold) 了損毀的套件。
sudo rm -f /etc/apt/preferences.d/nvidia-pin sudo apt update
# 不透過 nvidia-driver-470 由系統判斷要下載那些, # 而是改成指定下載 470 的底層驅動、核心 Xorg 渲染器以及 DKMS 動態核心編譯模組。 sudo apt install nvidia-kernel-common-470 nvidia-kernel-source-470 xserver-xorg-video-nvidia-470 nvidia-dkms-470 nvidia-utils-470 libnvidia-gl-470
sudo apt install nvidia-kernel-common-470 nvidia-kernel-source-470 xserver-xorg-video-nvidia-470 nvidia-dkms-470 nvidia-utils-470 libnvidia-gl-470 正在讀取套件清單... 完成 正在重建相依關係... 完成 正在讀取狀態資料... 完成 下列的額外套件將被安裝: libnvidia-cfg1-580 libnvidia-common-580 libnvidia-compute-580 libnvidia-egl-wayland1 libnvidia-gl-535 libnvidia-gl-580 nvidia-dkms-535 nvidia-dkms-580 nvidia-firmware-580-580.173.02 nvidia-kernel-common-535 nvidia-kernel-common-580 nvidia-kernel-source-535 nvidia-kernel-source-580 nvidia-utils-535 nvidia-utils-580 xserver-xorg-video-nvidia-535 xserver-xorg-video-nvidia-580 建議套件: nvidia-driver-580下列【新】套件將會被安裝: libnvidia-cfg1-580 libnvidia-common-580 libnvidia-compute-580 libnvidia-egl-wayland1 libnvidia-gl-470 libnvidia-gl-535 libnvidia-gl-580 nvidia-dkms-470 nvidia-dkms-535 nvidia-dkms-580 nvidia-firmware-580-580.173.02 nvidia-kernel-common-470 nvidia-kernel-common-535 nvidia-kernel-common-580 nvidia-kernel-source-470 nvidia-kernel-source-535 nvidia-kernel-source-580 nvidia-utils-470 nvidia-utils-535 nvidia-utils-580 xserver-xorg-video-nvidia-470 xserver-xorg-video-nvidia-535 xserver-xorg-video-nvidia-580 升級 0 個,新安裝 23 個,移除 0 個,有 4 個未被升級。需要下載 126 kB/397 MB 的套件檔。此操作完成之後,會多佔用 1,128 MB 的磁碟空間。
移除 NVIDIA 官方專有驅動與所有設定 # 清空有 nvidia 字串的軟體。 sudo apt purge "*nvidia*" # 清空有關連性的部份。 sudo apt autoremove # 清除apt快取。 sudo apt clean
sudo rm -f /etc/modprobe.d/blacklist-nvidia-nouveau.conf sudo rm -f /lib/modprobe.d/blacklist-nvidia-nouveau.conf
# 更新系統核心引導映像檔,以確保設定有成功。 sudo update-initramfs -u #重新開機 sudo reboot
# 切換到文字 TTY 模式,成功的話能點亮螢幕看到黑底白字 Ctrl + Alt + F3
# 強制踢掉卡死的 NVIDIA 驅動,重新初始化圖形介面。 sudo systemctl restart gdm3