跳到主要內容
節省工具箱Jason Tools
經驗分享

Proxmox VE USB over-current condition 訊息的問題排除

Jason Cheng 發布 瀏覽 3 次
Proxmox VE USB over-current condition 訊息的問題排除
本文目錄
  1. 徵狀
  2. 可能原因
  3. log 與實體埠的對應
  4. 查詢 USB 裝置的方法
  5. 問題排除步驟
  6. 暫時抑制洗版
  7. 結論
  8. 參考資料

某台 Proxmox VE 主機的 console 與 dmesg 一直被這樣的訊息洗版:

usb usb1-port11: over-current condition
usb usb2-port1: over-current condition

而且不是偶爾出現一筆,是以毫秒間隔反覆出現,每秒好幾十筆。這代表 USB 埠處在供電不穩、或反覆斷電復電的震盪狀態。這篇整理問題排除的方式,以及怎麼從 log 對應到實體的 USB 埠。

USB over-current 的原因、對應方式與問題排除
USB over-current 的原因、對應方式與問題排除

徵狀

  • dmesg 與系統記錄被大量過電流訊息灌爆
  • 可能同時出現多個埠,例如 usb1-port11 與 usb2-port1
  • 外接 USB 裝置時斷時續,無法穩定辨識
  • 有把 USB 裝置直通給 LXC 或 VM 的話,裝置會時有時無
  • 大量寫記錄造成額外的 CPU 與磁碟寫入負擔

可能原因

硬體問題(最常見)

  • USB 裝置耗電超過該埠的供電上限,例如外接硬碟、USB 風扇、無線網路卡
  • USB 線材或接頭短路、品質不良
  • 主機板 USB 埠故障,或機殼前置面板的 USB 排線(主機板上的 9-pin header)接反、鬆脫
  • 串接了沒有獨立供電的 USB Hub

感測誤報

  • 部分主機板的 USB 供電感測電路異常,即使沒有接任何裝置也會回報過電流
  • 判斷方式:拔光所有外接 USB 裝置後仍持續洗版,幾乎可以確定是主機板電路或前置面板接線的問題

log 與實體埠的對應

kernel 記錄裡的 usbN 直接對應 Bus N,sysfs 路徑則以 N- 開頭:

kernel 記錄Bussysfs 路徑
usb1-port11Bus 011-11
usb2-port1Bus 022-1

注意:lsusb 列出的 Device 編號(例如 Bus 001 Device 005)是動態流水號,每次插拔都會變,跟實體埠號無關。要對應實體埠,請用 lsusb -t 或 sysfs 的 bus-port 命名。

查詢 USB 裝置的方法

lsusb -t 樹狀結構

對應實體埠號最好用的工具:

lsusb -t

輸出範例:

/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/8p, 5000M
    |__ Port 1: Dev 2, If 0, Class=Mass Storage, Driver=usb-storage, 5000M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/16p, 480M
    |__ Port 11: Dev 4, If 0, Class=Hub, Driver=hub/4p, 480M

判讀方式:

  • 第一層 Bus 0X.Port 1 是該 bus 的 root hub
  • 縮排的 Port N 就是實體埠,對應 kernel 記錄的 portN
  • 同一行的 Class 顯示裝置類型,例如 Mass Storage、Hub、Human Interface Device

所以記錄出現 usb1-port11,就到 lsusb -t 找 Bus 01 底下的 Port 11,看掛的是什麼裝置。加上 -v 參數(lsusb -tv)還會顯示每個節點的 VID:PID,更容易對照。

從 sysfs 查詢指定埠

查 1-11 與 2-1 掛了什麼裝置:

cat /sys/bus/usb/devices/1-11/product 2>/dev/null
cat /sys/bus/usb/devices/1-11/idVendor /sys/bus/usb/devices/1-11/idProduct 2>/dev/null

cat /sys/bus/usb/devices/2-1/product 2>/dev/null
cat /sys/bus/usb/devices/2-1/idVendor /sys/bus/usb/devices/2-1/idProduct 2>/dev/null

檔案不存在的話,代表那個埠目前沒有裝置。過電流被斷電後常見這種情況,通常指向主機板電路或接線問題。

一次列出所有埠與裝置

for d in /sys/bus/usb/devices/*/; do
  if [ -f "$d/product" ]; then
    echo "埠: $(basename $d) | 裝置: $(cat $d/product 2>/dev/null) | VID:PID: $(cat $d/idVendor 2>/dev/null):$(cat $d/idProduct 2>/dev/null)"
  fi
done

即時監看震盪的埠

過電流常伴隨反覆斷線重連,可以即時觀察是哪個埠在動:

udevadm monitor --udev --subsystem-match=usb

震盪時會即時印出 /devices/.../usb1/1-11 這類路徑與裝置資訊。

問題排除步驟

  1. 拔掉所有外接 USB 裝置,觀察訊息是否停止
  2. 訊息停止的話,逐一插回,找出是哪個裝置造成的
  3. 檢查機殼前置 USB 排線是否接反或鬆脫,可以先拔掉排線測試
  4. 用 lsusb -t 與上面的對照方式,確認是哪個實體裝置或 Hub
  5. 換線、換埠測試,排除線材問題
  6. 拔光所有裝置仍持續洗版,就判定為主機板 USB 電路問題(感測誤報或實體損壞)

暫時抑制洗版

確認是感測誤報、或暫時找不到硬體原因時,可以先降低 console 的訊息等級,讓 console 不再被洗版:

dmesg -n 3

要持久生效,在 /etc/sysctl.d/ 新增設定檔,例如 /etc/sysctl.d/90-printk.conf:

kernel.printk = 3 4 1 3

再執行 sysctl --system 套用。

注意:這只是遮蔽症狀,訊息仍會寫進 kernel 記錄,也沒有解決根本原因。持續的真實過電流有燒毀 USB 埠或裝置的風險,務必先完成硬體檢查,確認不是真的有裝置過載,再考慮抑制訊息。

結論

USB 過電流訊息洗版,大多數是硬體問題:裝置耗電太大、線材不良,或機殼前置面板的排線沒接好。問題排除的關鍵是先拔光再逐一插回,搭配 lsusb -t 把記錄裡的 usbN-portM 對應到實體的埠。

真的找不到原因、確定是主機板感測誤報,再考慮降低 console 訊息等級。千萬不要一開始就把訊息遮掉了事。

參考資料

Jason Cheng

Jason Cheng

企業開源技術顧問,專注架構規劃與實務導入

關於作者 →

延伸閱讀