這是一個關於 RTX 4070 Ti Super、Proxmox VE、還有一條看起來很無辜的 PCIe 延長線的故事。更準確地說,這是一個關於「為什麼我的顯卡會在虛擬機裡憑空消失」的謎案。
故事開始於 9/11 的晚上。我在 Microsoft Flight Simulator 裡飛了大約一小時,按下 ESC 準備去倒杯水。回來的時候,螢幕黑了。不是當機那種黑,是那種「什麼都沒了」的黑。
我切到 Proxmox 宿主端,輸入 lspci -s 01:00.0。空白。什麼都沒有。一張價值兩萬八的顯卡,就這樣從 PCI 裝置樹上人間蒸發了。
這不是第一次了。從 9/11 開始,每次飛行超過六十分鐘,進入暫停選單後就會發生同樣的事。journalctl -k 裡只留下一行冰冷的訊息:
vfio-pci 0000:01:00.1: Unable to change power state from D3cold to D0, device inaccessible
D3cold。這個詞在接下來的日子裡會變成我的噩夢。它是 PCIe 裝置的最深層睡眠狀態,理論上應該能被喚醒。但我的顯卡顯然不這麼想。
我開始做功課。BIOS 裡關掉 ASPM,在 GRUB 加上 pcie_aspm=off pcie_port_pm=off,把 d3cold_allowed 設成 0,停用所有可能讓顯卡睡著的東西。測試。失敗。再測試。再失敗。
然後我注意到一個細節:在裸機 Windows 的時候,HDMI 偶爾會閃一下。當時我以為是螢幕問題,沒多想。現在回頭看,那是第一個線索。
我開始懷疑 PCIe Riser。Lian Li Q58 是個夾層結構的 ITX 機殼,顯卡必須透過一條 200mm 的延長線才能裝進去。這條線看起來很普通,就是隨機殼附送的那種。但 Gen4 訊號對線材品質要求很嚴格,會不會是它的問題?
我跑了 3DMark Time Spy Stress Test。Gen4 模式下,穩定度只有 88.7%。標準是 97%。
好吧,降到 Gen3 試試。93.2%。有改善,但還是不合格。
這時候理論開始成形:PCIe 訊號品質不足 → 長時間運作後累積錯誤 → 電源狀態切換時無法正常 re-training → VFIO 放棄治療 → 顯卡消失。
聽起來很合理對吧?我也這麼想。所以我開始研究要換哪條高品質的延長線,或者乾脆換個支援水平安裝顯卡的大機殼。
10/5,我帶著電腦去了光華商場。第一站是原價屋。他們花了半小時測試:裸機 Windows,舊的 Riser,跑 CS2。一切正常。這證明顯卡本體沒問題,但也讓謎團更深了。
我又去了另一家店,想測試一條 Lian Li 出的高階延長線 PW-PCI-520。店員拆開機殼,試著裝上去。「裝不進去,」他說,「角度不對。」
好吧,那就算了。我拿回電腦,回家。
到家後,按下電源鈕。沒反應。完全沒有過電的跡象。
這下糟了。
10/6 一早,我又回到原價屋。工程部的人打開機殼,檢查了不到五分鐘。
「你的電源開關在 OFF,」他說。
原來那家店在測試時把機殼內部的電源開關撥到了 OFF,還回去的時候忘了撥回來。虛驚一場,但也讓我對那家店的專業度打了個大問號。
不過意外的是,這次拆裝之後,問題似乎... 改善了?
10/6 晚上我測試了六十九分鐘,暫停兩次,都正常。這是從 9/11 以來第一次突破六十分鐘大關。我不敢太樂觀,畢竟之前也有過「以為好了結果又復發」的經驗。
今天,10/19,我飛了整整四個小時。
中間暫停過、恢復過、切換過視角、調整過設定。顯卡穩穩地待在 lspci 的輸出裡,沒有消失,沒有錯誤,沒有任何異常。
四個小時。比之前的記錄多了快四倍。
我終於明白發生了什麼:不是 Riser 壞了,不是訊號品質不足,不是需要降到 Gen3,也不是要換機殼。
只是接觸不良。
那條延長線在機殼裡躺了一段時間,金手指上可能累積了些微的氧化或灰塵。這些微小的污染在一般使用下沒問題,但在長時間高負載後,阻抗增加,訊號品質下降,再遇上電源狀態切換的關鍵時刻,就會失敗。
原價屋的測試、那家店的拆裝,意外地多次插拔了這條線。摩擦帶走了氧化層,清除了灰塵,接觸品質改善了。問題就這樣被「意外」解決了。
回顧 9/11 到 10/19 這一個多月的診斷過程,我學到了一些教訓:
首先,複雜的症狀不一定需要複雜的解決方案。當我看到 D3cold、vfio-pci reset、PCIe link retraining 這些技術細節時,很容易陷入「這一定是個深層的技術問題」的思維。但有時候,答案就是「擦乾淨重新插」這麼簡單。
其次,測試環境的差異很重要。10/5 在原價屋測試正常,但我家裡會失敗,這個線索我當時沒有深究。現在想想,測試時的拆裝就已經在改善接觸了,只是效果還不夠持久。
第三,保養比升級重要。與其花三千塊換新機殼或買高階延長線,不如每半年打開機殼,用氣罐吹個灰塵,重新插拔一次所有接頭。預防勝於治療。
最後,技術問題的解決有時候需要點運氣。如果 10/5 那天我沒去第二家店,沒有經歷那次「電源開關事件」,可能就不會有那麼多次的拆裝,接觸也不會改善,我可能還在跟這個問題搏鬥。
現在我的 Proxmox 設定檔裡還保留著那些核心參數:pcie_aspm=off、d3cold_allowed=0。它們可能沒什麼作用,但我決定留著。就當作是 9/11 到 10/19 這段搏鬥的紀念碑吧。
如果你也遇到類似的 GPU passthrough 問題,在深入研究 VFIO 驅動程式碼或考慮換硬體之前,試試這個最簡單的步驟:
把顯卡拔下來,用乾淨的橡皮擦輕輕擦拭金手指,用氣罐吹掉灰塵,然後重新插回去。
有時候,答案就是這麼簡單。
技術規格記錄(給需要的人):
- CPU: AMD Ryzen 9 9950X3D
- 主機板: ASUS ROG STRIX B650E-I GAMING WIFI
- 顯卡: NVIDIA GeForce RTX 4070 Ti SUPER
- 宿主: Proxmox VE 9 / Debian 13 (kernel 6.14.11)
- 機殼: Lian Li Q58 (搭配原廠 200mm PCIe Riser)
- VM: Windows 11 (UEFI/OVMF, Q35, vfio-pci)
最終有效的 GRUB 參數(雖然可能不是關鍵):
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt pcie_aspm=off pcie_port_pm=off"
真正的解決方案:重新插拔 PCIe Riser,改善接觸品質。成本:$0。
