pci=nomsi 和 pcie_aspm=off 詳解:Linux 下 SATA 擴展卡不認盤、掉盤、卡死時該怎麼排查

解釋 pci=nomsi 和 pcie_aspm=off 兩個 Linux 核心參數的作用、適用場景、副作用和 Ubuntu/Debian 下的永久配置方法,用於排查 JMB585、ASM1166 等 PCIe SATA 擴展卡不認盤、掉盤和系統卡死問題。

在 Linux / Ubuntu 上使用 PCIe SATA 擴展卡時,很多人會遇到不認盤、運行一段時間掉盤、系統卡死,或者開機階段卡在 PCIe 鏈路訓練的問題。常見對象包括 JMB585、ASM1166 等 SATA 擴展卡,尤其是在 NAS、小主機、工控機、魔改主板或廉價轉接卡環境裡更容易出現。

pci=nomsipcie_aspm=off 是排查這類問題時經常用到的兩個 Linux 核心參數。它們看起來都和 PCIe 有關,但解決的不是同一個問題:

  • pci=nomsi 主要處理 中斷訊號問題,也就是設備和 CPU 之間的「通知方式」不穩定。
  • pcie_aspm=off 主要處理 PCIe 電源管理問題,也就是鏈路進入省電狀態後喚醒失敗或訊號不穩。

如果把這兩個參數混在一起理解,很容易變成玄學調參。更合理的做法是先看現象,再判斷應該優先懷疑中斷、鏈路省電,還是硬體本身。

pci=nomsi:禁用消息信號中斷

pci=nomsi 可以拆開看:

  • PCI:外設部件互連相關設備。
  • no:禁用。
  • MSI:Message Signaled Interrupts,消息信號中斷。

它的意思是:讓 Linux 核心不要給 PCI 設備使用 MSI / MSI-X 中斷機制,而是退回傳統的 INTx 中斷方式。

MSI 是什麼

傳統硬體設備要通知 CPU「我有事要處理」,通常依賴物理中斷引腳,也就是傳統 IRQ。這個機制比較老,能用,但共享和擴展能力有限。

後來出現了 MSI / MSI-X。設備不再一定要拉物理中斷引腳,而是向特定記憶體地址寫入一條消息。CPU 收到這條消息後,就知道哪個設備觸發了中斷。對現代系統來說,MSI / MSI-X 通常更靈活,也更適合高併發設備。

問題在於,並不是每張 PCIe 擴展卡的韌體都把 MSI 做得足夠可靠。部分廉價擴展卡、二手拆機卡、橋接晶片方案,或者韌體品質一般的 SATA 控制器,在 Linux 驅動下可能出現 MSI 消息異常、中斷丟失或中斷風暴。

常見表現包括:

  • 開機檢測 PCIe 擴展卡時卡住。
  • SATA 擴展卡完全不認盤。
  • 系統隨機卡死。
  • dmesg 中出現類似 irq xx: nobody cared 的報錯。
  • 某張卡在 Windows 下看似正常,但 Linux 下很不穩定。

這類問題的核心不是硬碟本身,也不是檔案系統,而是設備和 CPU 之間的中斷通信方式不可靠。

加上 pci=nomsi 後會發生什麼

啟用:

1
pci=nomsi

等於告訴 Linux 核心:不要讓 PCI 設備使用進階的 MSI 消息中斷,統一退回傳統 INTx 中斷模式。

這可能帶來一點效能和併發效率損失,尤其是在高吞吐、高手動中斷頻率設備上。但對家用 NAS、SATA 擴展卡、普通機械硬碟陣列來說,實際影響通常不明顯。它的價值在於繞過某些設備韌體或橋接晶片的 MSI 相容性問題,讓系統能穩定識別設備並處理 I/O。

簡單說,pci=nomsi 處理的是「設備通知 CPU 的方式不可靠」。

pcie_aspm=off:禁用 PCIe 活動狀態電源管理

pcie_aspm=off 也可以拆開看:

  • PCIe:PCI Express,高速串行擴展總線。
  • ASPM:Active State Power Management,活動狀態電源管理。
  • off:關閉。

它的意思是:關閉 PCIe 鏈路的省電機制,讓 PCIe 鏈路不要進入低功耗狀態。

ASPM 是什麼

ASPM 是 PCIe 總線上的省電機制。當系統發現某條 PCIe 鏈路暫時沒有資料傳輸時,可以把鏈路切到低功耗狀態,例如 L0s 或 L1。等設備再次有資料讀寫時,再把鏈路喚醒回正常工作狀態。

在設計良好的硬體上,這套機制可以降低功耗,而且對使用者幾乎無感。但在一些消費級主板、小主機、工控機、廉價 SATA 擴展卡、轉接板或訊號品質一般的硬體上,問題會出在「睡下去以後醒不穩」。

典型情況是:JMB585、ASM1166 這類 PCIe SATA 擴展卡在空閒後進入低功耗狀態,下一次存取硬碟時鏈路需要從 L1 喚醒。如果控制器、主板、轉接線、供電或韌體品質不夠好,喚醒可能太慢,或者鏈路恢復時發生物理層抖動。Linux 核心就可能認為設備短暫失聯。

常見 dmesg 表現包括:

1
2
3
pcieport 0000:00:1c.0: PCIe Bus Error: severity=Corrected, type=Physical Layer
ata1: link is slow to respond, please be patient
ata1: COMRESET failed (errno=-16)

隨後可能出現:

  • 硬碟掉線。
  • 陣列降級。
  • 檔案系統變成唯讀。
  • NAS 服務異常。
  • 系統 I/O 卡死。
  • 重啟後硬碟又暫時恢復正常。

這類問題最麻煩的地方在於,它不一定開機就出現,往往是運行一段時間、空閒後喚醒,或高負載切換時突然發生。

加上 pcie_aspm=off 後會發生什麼

啟用:

1
pcie_aspm=off

等於告訴核心:關閉全系統 PCIe ASPM 省電功能。PCIe 鏈路不管空閒還是忙碌,都盡量保持在正常連接狀態,不要進入低功耗睡眠。

副作用是功耗可能略有上升。對桌機、NAS、小主機來說,通常只是幾百毫瓦到一兩瓦級別;對筆記型電腦來說,可能會影響續航。它換來的好處是減少因為 PCIe 鏈路睡眠和喚醒造成的掉盤、鏈路訓練錯誤和物理層報錯。

簡單說,pcie_aspm=off 處理的是「PCIe 鏈路睡著後醒不穩」。

兩個參數的區別

可以把它們理解成兩類不同問題:

參數 解決的核心問題 常見表現 主要副作用
pci=nomsi 中斷訊號衝突、MSI / MSI-X 相容性差 開機卡死、完全不認盤、irq xx: nobody cared、系統死機 極高併發下中斷效率可能下降
pcie_aspm=off PCIe 省電喚醒失敗、鏈路訊號不穩 剛開機正常,運行一會兒掉盤,PCIe Bus ErrorCOMRESET failed 功耗略升,筆電續航略降

所以它們不是互相替代關係。一個管中斷,一個管鏈路電源管理。

如果機器開機階段就卡死、設備完全不認,優先懷疑 pci=nomsi。如果開機正常、運行一段時間後掉盤,或者 dmesg 裡有 PCIe Physical Layer、COMRESET、link is slow to respond 之類資訊,優先懷疑 pcie_aspm=off

是否應該兩個一起加

很多 NAS 玩家會直接同時加:

1
pci=nomsi pcie_aspm=off

這確實是快速排查的辦法,尤其是在 JMB585、ASM1166、小主機、轉接卡、供電和線材都不太確定的環境裡。它可以同時繞開 MSI 相容性問題和 ASPM 喚醒問題。

但從排障角度,更推薦先記錄現象和日誌:

  • 如果是中斷報錯或啟動卡死,先試 pci=nomsi
  • 如果是運行後掉盤、PCIe Bus Error、COMRESET,先試 pcie_aspm=off
  • 如果問題嚴重且急著恢復穩定,可以兩個一起加,穩定後再拆開驗證。

這樣能知道到底是哪一類問題導致的,後續換卡、換槽、換主板或調整 BIOS 時更有依據。

Ubuntu / Debian 中如何永久生效

編輯 Grub 配置檔案:

1
sudo nano /etc/default/grub

找到這一行:

1
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"

在雙引號內追加參數,參數之間用空格隔開。例如:

1
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash pci=nomsi pcie_aspm=off"

保存並退出。如果使用 Nano,按 Ctrl+O 保存,回車確認,再按 Ctrl+X 退出。

更新 Grub 並重啟:

1
2
sudo update-grub
sudo reboot

重啟後,可以查看目前核心啟動參數是否已經生效:

1
cat /proc/cmdline

如果輸出裡能看到 pci=nomsipcie_aspm=off,說明參數已經進入目前核心啟動命令列。

還應該檢查哪些地方

這兩個參數很有用,但它們不是所有掉盤問題的萬能解法。排查 SATA 擴展卡和 NAS 掉盤時,也建議同時檢查:

  • SATA 資料線是否鬆動或品質太差。
  • 硬碟供電是否穩定,尤其是多盤同時啟動時。
  • PCIe 插槽是否接觸不良。
  • 擴展卡是否過熱。
  • 主板 BIOS 是否有 PCIe ASPM、Above 4G Decoding、PCIe speed 等相關選項。
  • SATA 擴展卡韌體是否有已知問題。
  • 系統日誌中是否有硬碟本體壞道、I/O error 或 SMART 告警。

如果硬碟 SMART 已經報錯,或者供電本身不穩,單靠核心參數無法真正解決問題。

小結

pci=nomsipcie_aspm=off 都常用於 Linux 下 PCIe SATA 擴展卡不穩定的排查,但它們解決的是兩條不同鏈路:

  • pci=nomsi:關閉 MSI / MSI-X,繞開中斷通信相容性問題。
  • pcie_aspm=off:關閉 PCIe ASPM,避免鏈路省電後喚醒失敗。

對 JMB585、ASM1166、NAS、小主機和廉價 PCIe 擴展卡來說,這兩個參數確實經常能救場。更穩妥的做法是先看 dmesg,判斷是中斷問題還是鏈路省電問題,再決定單獨使用還是一起使用。

它們是排障工具,不是硬體品質的替代品。如果加上參數後系統穩定了,說明問題大機率在中斷相容性或 PCIe 電源管理上;如果仍然掉盤,就要繼續檢查供電、線材、散熱、硬碟健康和擴展卡本身。

记录并分享
使用 Hugo 建立
主題 StackJimmy 設計