Linux

來自顯示器的 USB 連接檢測為儲存設備

  • May 5, 2022

我有一個 MSI Optix MAG245R 23.8" 顯示器。它具有 USB 連接。

當我啟動基於 Debian 的機器 (BunsenLabs) 時,我收到警告說:

May  4 19:41:51 localname kernel: [  240.573980] sd 9:0:0:0: [sdc] Unaligned partial completion (resid=4060, sector_sz=512)
May  4 19:41:51 localname kernel: [  240.573986] sd 9:0:0:0: [sdc] tag#0 FAILED Result: hostbyte=DID_ERROR driverbyte=DRIVER_OK
May  4 19:41:51 localname kernel: [  240.573988] sd 9:0:0:0: [sdc] tag#0 CDB: Read(10) 28 00 00 00 00 00 00 00 08 00
May  4 19:41:51 localname kernel: [  240.573990] print_req_error: I/O error, dev sdc, sector 0
May  4 19:41:51 localname kernel: [  240.673838] sd 9:0:0:0: [sdc] Unaligned partial completion (resid=2012, sector_sz=512)
May  4 19:41:51 localname kernel: [  240.673846] sd 9:0:0:0: [sdc] tag#0 FAILED Result: hostbyte=DID_ERROR driverbyte=DRIVER_OK
May  4 19:41:51 localname kernel: [  240.673850] sd 9:0:0:0: [sdc] tag#0 CDB: Read(10) 28 00 00 00 00 00 00 00 04 00
May  4 19:41:51 localname kernel: [  240.673852] print_req_error: I/O error, dev sdc, sector 0
May  4 19:41:51 localname kernel: [  240.673859] Buffer I/O error on dev sdc, logical block 0, async page read
May  4 19:41:51 localname kernel: [  240.860367] Buffer I/O error on dev sdc, logical block 1, async page read
May  4 19:41:52 localname kernel: [  241.500663] sd 9:0:0:0: [sdc] Unaligned partial completion (resid=4060, sector_sz=512)
May  4 19:41:52 localname kernel: [  241.612517] sd 9:0:0:0: [sdc] Unaligned partial completion (resid=4060, sector_sz=512)
May  4 19:41:52 localname kernel: [  241.697840] sd 9:0:0:0: [sdc] Unaligned partial completion (resid=2012, sector_sz=512)
May  4 19:41:52 localname kernel: [  241.785872] sd 9:0:0:0: [sdc] Unaligned partial completion (resid=2012, sector_sz=512)
May  4 19:41:52 localname kernel: [  241.818899] sd 9:0:0:0: [sdc] Unaligned partial completion (resid=16348, sector_sz=512)
May  4 19:41:52 localname kernel: [  241.909838] sd 9:0:0:0: [sdc] Unaligned partial completion (resid=2012, sector_sz=512)
May  4 19:41:52 localname kernel: [  241.993839] sd 9:0:0:0: [sdc] Unaligned partial completion (resid=2012, sector_sz=512)
May  4 19:41:55 localname kernel: [  244.842973] sd 9:0:0:0: [sdc] Unaligned partial completion (resid=16348, sector_sz=512)
May  4 19:41:55 localname kernel: [  244.942219] sd 9:0:0:0: [sdc] Unaligned partial completion (resid=2012, sector_sz=512)
May  4 19:41:55 localname kernel: [  245.034140] sd 9:0:0:0: [sdc] Unaligned partial completion (resid=2012, sector_sz=512)
May  4 19:41:56 localname kernel: [  245.473992] sd 9:0:0:0: [sdc] Unaligned partial completion (resid=2012, sector_sz=512)
May  4 19:41:56 localname kernel: [  245.557874] sd 9:0:0:0: [sdc] Unaligned partial completion (resid=2012, sector_sz=512)
May  4 19:41:57 localname kernel: [  246.425872] sd 9:0:0:0: [sdc] Unaligned partial completion (resid=2012, sector_sz=512)
May  4 19:41:57 localname kernel: [  246.425881] sd 9:0:0:0: [sdc] tag#0 FAILED Result: hostbyte=DID_ERROR driverbyte=DRIVER_OK
May  4 19:41:57 localname kernel: [  246.425884] sd 9:0:0:0: [sdc] tag#0 CDB: Read(10) 28 00 00 00 00 00 00 00 04 00

然後,我繼續啟動 GParted 來檢查我的儲存卷。我知道什麼/dev/sda/dev/sdb是什麼;這些正是我所期望的。因此,我很驚訝為什麼/dev/sdc會檢測到 a 。

在此處輸入圖像描述

在那裡,設備資訊說它是一個 MSI Optix 驅動程序。我嘗試僅隔離顯示器的 USB 連接(沒有鍵盤連接、加密狗等),這被檢測為/dev/sdc.

我能做些什麼來擺脫這些錯誤?我的非專家想法是想辦法告訴我的機器這個帶有 UUID0123456789 的設備不是儲存設備,所以不要費心將它作為儲存設備進行測試。我怎麼做?

還是有什麼其他方式?

感謝@telcoM 提供線索。我已經解決了這個問題。

tl;博士

udev使用規則取消對有問題的 USB 設備的授權。

怎麼做

  1. dmesg以跟隨模式執行:
$ dmesg -w
  1. 斷開並重新連接顯示器的 USB 電纜。
  2. 在 的輸出中dmesg,記下要禁用的設備的匯流排號(黃色覆蓋)

在此處輸入圖像描述

  1. dmesg使用 CTRL+C退出。
  2. 現在執行以下命令來獲取設備屬性。xxxusbxxx用你得到的巴士號碼代替dmesg
$ udevadm info -a -p /sys/bus/usb/devices/xxxusbxxx
  1. 這是輸出的第一部分,也是您關心的部分。注意下面的屬性和紅框中覆蓋的路徑。
DRIVER=="usb-storage"
ATTR{bInterfaceClass}=="aa"
ATTR{bInterfaceNumber}=="bb"
ATTR{bInterfaceProtocol}=="cc"
ATTR{bInterfaceSubClass}=="dd"

在此處輸入圖像描述

  1. 現在創建一個新文件/etc/udev/rules.d/10-disable-MSI-optix-storage.rules。數字10表示該規則在其他編號較大的規則之前執行。保留.rules副檔名。文件名的其餘部分無關緊要。這些應該是文件的內容。相應地替換字元串。

在此處輸入圖像描述

  1. 重新啟動您的電腦,並看到讀取錯誤消息不再出現。

這實際上做了什麼

udev當檢測到與規則文件中指定的屬性匹配的 USB 設備時,其authorized標誌立即設置為0並且不能再使用。

顯示器似乎是雙模式設備,預設模式是包含適用於該設備的 Windows 和/或 Mac 驅動程序的儲存設備。如今,越來越多需要驅動程序的 USB 設備似乎都在這樣做。

如果你執行ls -l /sys/block/sdc,你會看到它是一個符號連結,指向類似的路徑

../devices/<PCI device path for the USB controller>/usb#/<USB device path>/host#/target#:#:#/#:#:#:#/block/sdc

… 其中 # 是取決於您的確切硬體配置的數字,在這裡並不重要。

您需要移動到host#元件之前的目錄:

cd /sys/devices/<PCI device path for the USB controller>/usb#/<USB device path>/

…然後查看目錄是否包含名為bNumConfigurationsand的文件bConfigurationValue。如果不是,請上一級 ( cd ..) 並再次檢查。

找到正確的目錄後,cat bNumConfigurations會告訴您 USB 設備有多少種可能的配置(模式)。提供自己的驅動程序的 USB 設備很可能至少有兩種模式,因此該命令可能會輸出2.

cat bConfigurationValue將告訴您引用目前配置的數字。儲存設備配置很可能是第一個,1.

要將 USB 設備切換到第二個配置,請執行:

echo 2 | sudo tee bConfigurationValue

(或者如果您以 root 身份執行,只需echo 2 > bConfigurationValue. 注意 和 之間的空格2>因為2>對於許多 shell 具有特殊含義。)

這應該會導致“USB 儲存設備”消失並替換為相關 USB 設備的實際功能。

為了自動化這個過程,大多數現代發行版都有一個usb-modeswitch組件/實用程序。它尚未切換您的設備這一事實意味著您需要將有關設備的資訊添加到其配置中。一旦您知道所需的配置編號,您可以創建一個文本文件,/etc/usb_modeswitch.d/XXXX:YYYY其中 XXXX:YYYY 是需要切換的 USB 設備的供應商:產品 ID。該文件的內容應該是標識您想要的配置的行。例如,如果您發現配置 2 提供了設備的實際功能,您可以編寫如下程式碼:

Configuration=2

就是這樣。(您實際上可能希望將文件副本發送給 usb-modeswitch 開發人員,以便他們可以將資訊添加到該實用程序的未來版本中。)

某些設備可能使用不同的切換方法,這更難以弄清楚。如果 sysfs 文件bNumConfigurations表明存在問題的 USB 設備只有一種配置,則您需要建構一個 Windows VM,將 USB 設備提供給它,安裝設備提供的驅動程序,然後監聽 USB 流量,而VM正在啟動以擷取Windows驅動程序發送給設備的USB消息以觸發配置切換。該usb-modeswitch實用程序可以配置為自動發送此類消息,其數據文件將包含此類案例的許多現有範例。

通常,顯示器的 Windows“驅動程序”可能只包含一個*.icc顏色校準配置文件,它也可以在 Linux 中使用。如果顯示器針對高刷新率進行了優化(= 遊戲顯示器)或由於某些其他原因具有奇怪的色彩再現字元,您可以通過在 Windows 驅動程序包中找到顏色校準配置文件來改善顯示器的色彩再現,並告訴您的桌面環境將其與您的顯示器一起使用。

引用自:https://unix.stackexchange.com/questions/701431