目錄表
Ubuntu筆記
隨手紀錄一下使用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 以後的驅動,硬體也無法識別只會有黑畫面或是根本不載入使用只以內顯運行。
除了驅動程式外,當用到較新視窗系統及系統內核時也會造成奇怪的衝突。這邊遇到的情況如下:
- 睡眠喚醒後呈現黑畫面無法操作,
- Google 地圖街景觀看時,CPU 及記憶體使用率飆升致使系統崩潰無回應。
- 觀看平面地圖不一定有問題,但觀看街景使用率馬上飆升。
- 瀏覽器使用 Firefox 及 Vivaldi 4)有相同情況。
- 關閉硬體加速後可以延遲崩潰的時間。
最後總結起來,問題徵節點如下:
- Ubuntu 核心動作太快:
- 當喚醒電腦時,現代的 Linux 核心(如 5.15+)是用現今硬體的速度在跑。它一發出喚醒訊號,就預期 PCIe 裝置要在幾毫秒(ms)內立刻從 D3cold(完全斷電)恢復到 D0(全速運作)狀態。
- GTX 660 動作太慢:GTX 660 是一張 2012 年設計的老顯示卡,電路架構和硬體電容在接收到主機板重新供電的訊號後,硬體晶片本身的「冷啟動與初始化」需要比較長的反應時間。
- 判定失敗,直接死鎖:當 Ubuntu 核心發出指令後,在極短的時間內沒有收到 GTX 660 回傳的「我醒來了」訊號,核心就會認為這個 PCIe 裝置已經壞掉或遺失,隨即噴出 D3cold to D0 failed 的錯誤,並直接放棄與這張顯卡的通訊。此時顯示卡雖然風扇在轉,但因為核心已經拒絕與它溝通,螢幕就徹底黑掉,再也點不亮。
解決方案
嘗試列出有使用過的解決方式,並會註明是否有效。
前置作業
- 注意 Linux 核心(Kernel)升級
- Ubuntu 22.04 預設會透過 HWE5) 自動升級 Linux 核心。
- 太新的核心有時會與 470 驅動產生衝突(導致開機變黑畫面)。
- 為了避免影響可在開機時進入 Advanced options for Ubuntu 改選舊版核心開機。
- 確認可升級至 6.x 版內核,目前已將內核降回 Ubuntu 22.04 預設的 5.15.0-186-generic 版本。
- 並且為了避免再次被更新,故直接鎖住不讓系統更新,語法如下:
# 執行以下指令,將 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*
- Wayland 換成 X11
- 核心問題
- GTX 660 在 Wayland 上的相容性不佳,基本上運作不太穩定。
- 這張顯示卡使用的如 390 或 470 等舊版驅動,不支援 Wayland 且缺少 Explicit Sync6) 功能。
- 強行在 Wayland 環境下啟動通常會遇到嚴重卡頓、畫面破碎或直接無法進入桌面。
- 解決方案
- 使用傳統的 X11/Xorg 視窗系統,GTX 660 在該環境下才有穩定的驅動支援。
- 升級至支援現代 555+ 驅動或 AMD 的顯示卡。
- 登入輸入密碼畫面,點擊使用者名稱,畫面右下角會出現一個「齒輪」圖示。點擊齒輪,選擇可選擇不同的視窗系統,如找不到齒輪可參閱下一步。
- 完全停用 Wayland(強迫系統只用 X11)
- 從底層直接關閉 Wayland,修改 GDM7) 的設定檔
# 編輯設定檔 # 在某些發行版如 Fedora 或 Arch,路徑可能是 /etc/gdm/custom.conf sudo nano /etc/gdm3/custom.conf
- 在檔案中找到以下這行字並將前方的 # 給去掉
# WaylandEnable=false
- 儲存檔案並重啟電腦
- 檢查是否成功切換
# 如果畫面回傳 x11,就代表您已經成功 echo $XDG_SESSION_TYPE
- 修正 Linux 內核引導參數(PCIe 省電控制)
- 可以透過修改核心參數,阻止 PCIe 進入深省電模式 (ASPM)。
# 編輯 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
- 過大的日誌會拖慢系統卡死時的處理速度,將其限制在 500MB 以內:
# 清理過期的日誌,只保留最近的 500M sudo journalctl --vacuum-size=500M # 限制日誌最大體積 sudo sed -i 's/#SystemMaxUse=/SystemMaxUse=500M/' /etc/systemd/journald.conf sudo systemctl restart systemd-journald
欺騙 ACPI(進階組態與電源介面)
嘗試解決黑畫面查看 log 的過程中注意到了「can't change power state from D3cold to D0」這一段,改關閉核心的 PCIe 動態電源控制,避免卡死在 D3cold。
其餘依錯誤訊息總結問題點如下:
- B85M 主機板(Haswell 架構,約 2013-2015 年產物)搭配 GTX 660(Kepler 架構)發生 D3cold to D0 錯誤,主因是舊版主機板 BIOS 的 ACPI 規範與新版 Linux 核心衝突。
- B85M 誕生時還是 Windows 7 ,當時的主機板 BIOS 根本沒有現代完善的 PCIe 動態深度睡眠(D3cold)規範,但現在的 Linux 核心預設會用 Windows 10/11 的 ACPI 規範去命令硬體。當核心發送現代的深度省電指令,會導致硬體直接在開機初始化時死鎖。
- 核心的 Runtime PM(動態電源管理)會強制將沒在運作的 GTX 660 推入 D3cold 深度睡眠,但舊卡硬體無法正確回應喚醒訊號。
- NVIDIA 的電源優化服務,這些服務對新卡(RTX 系列)有用,但會直接停死 GTX 660。
- 顯示卡音效轉接器死鎖與畫面擁有權衝突:
- GTX 660 晶片上自帶的「NVIDIA High Definition Audio Controller」(HDMI/DP 音效輸出)在喚醒時被系統優先載入,佔用了 PCIe 通道。
- 當系統喚醒時,Ubuntu 的圖形桌面視窗管理員( GDM )佔據通道,導致 NVIDIA 驅動程式無法接管螢幕的控制權(Modeset Ownership)。結果就是顯示卡雖然醒了,但驅動程式沒辦法把畫面送進螢幕,導致一片漆黑。
下列過程一樣是在 470 版本驅動下執行,由 GRUB 直接對主機板和顯示卡下「禁用 PCIe 動態電源管理」指令。目前觀察下來似乎是解決了睡眠喚醒黑畫面的問題。操作流程如下:
- 步驟一:檢查 BIOS 中的「安全啟動」與「省電」功能。
- 進階模式 (F7) → 啟動 (Boot) / 安全項目:
- CSM (相容性支援模組):內部的「啟動裝置控制」或「來自儲存裝置的優化」,如果可以選,請確保它是開在 Legacy Only 或 UEFI 與 Legacy 混合。因為純 UEFI 模式在老主機板上會強制啟動不相容的現代電源管理。
- Fast Boot(快速啟動),改為 Disabled。
- Secure Boot(安全啟動),改為 Disabled 或 Other OS。
- NVIDIA 470 驅動在 Secure Boot 開啟時,會因為沒有簽章而無法順利在核心載入,導致顯卡直接斷電崩潰。
- 進階模式 (F7) → 系統代理程式設定 (System Agent Configuration) → NB PCIe 設定:
- ASPM Support 改為 Disabled。
- 電源管理 (Power Management) 或 Advanced / APM:
- 防止主機板進入深度節能狀態切斷 PCIe 供電。
- ErP Ready(或 EUP Support),改為 Disabled。
- RC6 (Render Standby)(內顯省電),改為 Disabled。
- 步驟二:編輯 GRUB。
sudo nano /etc/default/grub
- 步驟三:將 GRUB_CMDLINE_LINUX_DEFAULT 修改為以下內容並儲存。
# 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
- 步驟五:拔除 Udev 與開機映像中的電源控制。
- 核心開機時會把一些有問題的規則包進暫存映像(initramfs)裡,導致您改了 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 專有的睡眠核心參數。
# 開啟終端機,建立一個 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
- 步驟八:關閉 NVIDIA 的 3 個中介睡眠服務。
# 停止並永久封鎖這三個中介睡眠服務。 # 停止、關閉、禁用。 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
自 NVIDIA 官方網站安裝驅動
由於 Ubuntu 22.04 官方軟體庫似乎移除了支援,無法透過 apt install 指令安裝 470 驅動,故需改用 NVIDIA 官方為 Linux 提供的獨立 NVIDIA-Linux-x86_64-470.256.02.run 安裝檔10),終端機的操作流程如下:
- 步驟一:
- 移除 NVIDIA 官方專有驅動與所有設定。
# 清空有 nvidia 字串的軟體,-y 是自動同意執行,可去掉。 sudo apt purge "*nvidia*" -y # 清空有關連性的部份。 sudo apt autoremove -y # 清除apt快取。 sudo apt clean -y
- 步驟二:
- 下載核心編譯所需的基礎工具,因為 .run 安裝檔需要把驅動編譯進核心中,系統必須具備基本的編譯器。
sudo apt update sudo apt install build-essential sudo apt install linux-headers-generic
- 步驟三:
- 透過終端機下載 NVIDIA 官方 2024 年 07 月最新版的安裝檔 NVIDIA-Linux-x86_64-470.256.02.run,未特別設定檔案會在家目錄下。
wget https://tw.download.nvidia.com/XFree86/Linux-x86_64/470.256.02/NVIDIA-Linux-x86_64-470.256.02.run
- 步驟四:
- 給予執行權限並執行安裝。
- 安裝過程中,終端機會跳出提示「The Nouveau kernel driver is currently in use…(偵測到會凍結的開源驅動正在運作)」選擇 OK,接著會問要不要封鎖它(Disable/Blacklist Nouveau),選擇 Yes。
# 赋予檔案執行權限,檔名有不一樣就自行變更。 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
- 步驟六:
- 重啟系統後此時開源 Nouveau 驅動已經被步驟四封鎖,系統處於使用預設顯示驅動的狀態。
- 再執行一次驅動安裝指令,有提示全部 Yes。
- 過程中如果跳出:「是否安裝 32-bit 相容庫?」選擇 Yes;「是否讓 NVIDIA 自動更新您的 Xorg 設定檔?」選擇 Yes。
# 若檔案放在其它位置則需修改路徑,這裡預設是家目錄下。 sudo ./NVIDIA-Linux-x86_64-470.256.02.run
- 步驟七:
- 停用不相容的 NVIDIA 睡眠管理服務並重啟系統。
- 470 等舊版驅動其 systemd 服務與 Ubuntu 22.04 內核有衝突,停用並刪除相關的休眠、喚醒服務可避免與 Ubuntu 自有的電源管理功能衝突。
- 找不到服務就重新安裝驅動即可,這些是每次安裝 NVIDIA 驅動時都會自動安裝的軟體。
- 反過來說每次安裝完驅動都要記得執行一次指令關掉系統服務。
# 可以只寫成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-SMI 470.256.02 字樣且有 GeForce GTX 660 的完整硬體狀態表格。
# 確認官方驅動是否被核心認可。 # 如果顯示命令不存在或找不到顯卡:代表系統重灌驅動後,內核在開機時依然跳過了 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 的標準錯誤重導向操作
它的功能是:「如果前面這條指令產生了任何錯誤訊息,請直接丟棄並隱藏,不要顯示在畫面上。」
這通常是為了避免腳本被不必要的警告干擾,或是保持終端機畫面乾淨
建立規則鎖定 470 驅動
- 結論:此方法無效。
- 禁止其它版本後因相依性而無法安裝。
- 施行步驟及結果如下:
- 建立規則,禁止 535、550、560、580 等新版本,但放行 470。
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 官方專有驅動與所有設定。
# 清空有 nvidia 字串的軟體。 sudo apt purge "*nvidia*" # 清空有關連性的部份。 sudo apt autoremove # 清除apt快取。 sudo apt clean sudo apt update
- 重新下載 470 驅動。
sudo apt install nvidia-driver-470
- 結果:因 470 已於 535 綁在一起而無法單獨安裝。
sudo apt install nvidia-driver-470 正在讀取套件清單... 完成 正在重建相依關係... 完成 正在讀取狀態資料... 完成 有些套件無法安裝。這可能意謂著您的要求難以解決,或是若您使用的是unstable 發行版,可能有些必要的套件尚未建立,或是被移出 Incoming 了。以下的資訊或許有助於解決當前的情況: 下列的套件有未滿足的相依關係: nvidia-driver-470 : 相依關係: nvidia-driver-535 但它卻無法安裝 E: 無法修正問題,您保留 (hold) 了損毀的套件。
指定 470 的核心模組,強迫 apt 繞過套件綑綁
- 結論:此方法無效。
- 就算直接指定要裝的版本,套件庫還是會把其它的一併打包給你。
- 施行步驟及結果如下:
- 刪除過去建立的規則檔案
sudo rm -f /etc/apt/preferences.d/nvidia-pin sudo apt update
- 直接繞過元套件,指定安裝 470 的核心模組
# 不透過 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 的磁碟空間。
切換至 Nouveau 開源驅動
- 結論:可成功使用 Nouveau 開源驅動,但不推薦。
- Nouveau 開源驅動的問題是會無預警凍結系統,比 Wayland + GTX660 + 內核6.x 版還不穩。
- 施行步驟及結果如下:
- 移除 NVIDIA 官方專有驅動與所有設定。
移除 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
- 讓 Nouveau 開源驅動在開機時重新接管。
# 更新系統核心引導映像檔,以確保設定有成功。 sudo update-initramfs -u #重新開機 sudo reboot
- 結果:如開頭所說的,可以使用,解析度等設定也正常,但就是會無預警凍結。
盲操重啟圖形介面
- 結論:使用後毫無反應,從未成功過
- 能按魔術鍵代表當時鍵盤其實還在運作,所以這理論上是最快恢復黑畫面的辦法。
- 施行步驟及結果如下:
- 直接在鍵盤上按下:
# 切換到文字 TTY 模式,成功的話能點亮螢幕看到黑底白字 Ctrl + Alt + F3
- 如果成功看到輸入提示,輸入帳號密碼登入,並執行以下指令:
# 強制踢掉卡死的 NVIDIA 驅動,重新初始化圖形介面。 sudo systemctl restart gdm3
- 結果:由於不論如何輸入畫面都無反應,不確定指令是否可用。
