本文目錄
某台 Proxmox VE 主機的 console 與 dmesg 一直被這樣的訊息洗版:
usb usb1-port11: over-current condition
usb usb2-port1: over-current condition
而且不是偶爾出現一筆,是以毫秒間隔反覆出現,每秒好幾十筆。這代表 USB 埠處在供電不穩、或反覆斷電復電的震盪狀態。這篇整理問題排除的方式,以及怎麼從 log 對應到實體的 USB 埠。

徵狀
- 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 記錄 | Bus | sysfs 路徑 |
|---|---|---|
usb1-port11 | Bus 01 | 1-11 |
usb2-port1 | Bus 02 | 2-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 這類路徑與裝置資訊。
問題排除步驟
- 拔掉所有外接 USB 裝置,觀察訊息是否停止
- 訊息停止的話,逐一插回,找出是哪個裝置造成的
- 檢查機殼前置 USB 排線是否接反或鬆脫,可以先拔掉排線測試
- 用
lsusb -t與上面的對照方式,確認是哪個實體裝置或 Hub - 換線、換埠測試,排除線材問題
- 拔光所有裝置仍持續洗版,就判定為主機板 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 訊息等級。千萬不要一開始就把訊息遮掉了事。
參考資料
- Linux kernel 文件:USB sysfs 說明
https://www.kernel.org/doc/html/latest/usb/index.html - Linux kernel 文件:printk 與 console 訊息等級
https://www.kernel.org/doc/html/latest/core-api/printk-basics.html - Proxmox VE 官方文件:USB Passthrough
https://pve.proxmox.com/wiki/USB_Physical_Port_Mapping



