szklany.xyz

Obejście problemu pamięci USB 3 UAS w systemie Linux

Laptop z podłączonym dyskiem USB

Niektóre chipsety USB-SATA/NVMe, zwłaszcza w tanich obudowach lub adapterach do dysków, obsługują standard UAS (USB Attached SCSI), ale działają nieprawidłowo pod sterownikiem uas. Objawia się to najczęściej losowymi błędami wejścia/wyjścia, restartami, rozłączeniami itp.

Najczęściej stosuje się opcję usb-storage quirk, aby urządzenie korzystało z klasycznego sterownika usb-storage zamiast uas.

Jak zidentyfikować VID i PID urządzenia USB

W pierwszej kolejności musisz zidentyfikować VID i PID swojego urządzenia, najszybciej zrobić to poniższym poleceniem.

sudo lsusb -tv
Bash

W wyniku otrzymasz listę urządzeń USB widzianych w twoim systemie. W moim przypadku wygląda to tak:

/:  Bus 001.Port 001: Dev 001, Class=root_hub, Driver=ehci-pci/2p, 480M
    ID 1d6b:0002 Linux Foundation 2.0 root hub
    |__ Port 001: Dev 002, If 0, Class=Hub, Driver=hub/4p, 480M
        ID 8087:8008 Intel Corp. Integrated Rate Matching Hub
/:  Bus 002.Port 001: Dev 001, Class=root_hub, Driver=ehci-pci/2p, 480M
    ID 1d6b:0002 Linux Foundation 2.0 root hub
    |__ Port 001: Dev 002, If 0, Class=Hub, Driver=hub/6p, 480M
        ID 8087:8000 Intel Corp. Integrated Rate Matching Hub
/:  Bus 003.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/10p, 480M
    ID 1d6b:0002 Linux Foundation 2.0 root hub
    |__ Port 010: Dev 004, If 0, Class=Human Interface Device, Driver=usbfs, 1.5M
        ID 0764:0501 Cyber Power System, Inc. CP1500 AVR UPS
/:  Bus 004.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/2p, 5000M
    ID 1d6b:0003 Linux Foundation 3.0 root hub
    |__ Port 001: Dev 006, If 0, Class=Mass Storage, Driver=uas, 5000M
        ID 13fd:3639 Initio Corporation 
    |__ Port 002: Dev 003, If 0, Class=Mass Storage, Driver=usb-storage, 5000M
        ID 0951:1666 Kingston Technology DataTraveler 100 G3/G4/SE9 G2/50 Kyson
Bash

Mój problem dotyczy budżetowej obudowy do dysku SATA, która identyfikuje się jako „Initio Corporation” i identyfikatorem 13fd:3639 (VID:PID). Jak widać, użyty sterownik to uas, a głównym problemem jest rozłączanie się dysku po kilku minutach od fizycznego podłączenia do portu USB.

Skoro już udało Ci się zidentyfikować urządzenie, możesz przejść do rozwiązania problemu.

Tymczasowe rozwiązanie problemu rozłączania dysku USB

Zacznę od opisania rozwiązania tymczasowego, które nie przetrwa restartu. Możesz się nim posłużyć do testów, aby zweryfikować, czy ta metoda rozwiąże twój problem.

Użyj edytora tekstu do otwarcia pliku /sys/module/usb_storage/parameters/quirks, np. za pomocą poniższego polecenia:

sudo nano /sys/module/usb_storage/parameters/quirks
Bash

Aby dodać swoje urządzenie, użyj formatu VID:PID:FLAGS, gdzie FLAGS są następujące:

  • u (IGNORE_UAS) – przekazuje do jądra systemu, aby unikał wiązania podanego urządzenia z wykorzystaniem sterownika uas, a zamiast tego stosował usb-storage.
  • m (MAX_SECTORS_64) – ogranicza rozmiar transferu do 64 sektorów (32 KB). Może to poprawić stabilność przy dużych transferach kosztem wydajności.

Flaga u jest tutaj kluczowa, natomiast m możesz pominąć, jeśli uznasz, że w danym przypadku nie jest potrzebna. Mój wpis wygląda następująco:

13fd:3639:mu
Plaintext

Jeśli chcesz dodać więcej niż jedno urządzenie, rozdziel je przecinkiem w następujący sposób:

13fd:3639:mu,0951:1666:u
Plaintext

Zapisz zmiany i zamknij edytor, a następnie odłącz i podłącz ponownie urządzenie do portu USB.

Zweryfikuj poleceniem lsusb, czy twoje urządzenie jest teraz obsługiwane za pomocą sterownika usb-storage.

sudo lsusb -tv
/:  Bus 001.Port 001: Dev 001, Class=root_hub, Driver=ehci-pci/2p, 480M
    ID 1d6b:0002 Linux Foundation 2.0 root hub
    |__ Port 001: Dev 002, If 0, Class=Hub, Driver=hub/4p, 480M
        ID 8087:8008 Intel Corp. Integrated Rate Matching Hub
/:  Bus 002.Port 001: Dev 001, Class=root_hub, Driver=ehci-pci/2p, 480M
    ID 1d6b:0002 Linux Foundation 2.0 root hub
    |__ Port 001: Dev 002, If 0, Class=Hub, Driver=hub/6p, 480M
        ID 8087:8000 Intel Corp. Integrated Rate Matching Hub
/:  Bus 003.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/10p, 480M
    ID 1d6b:0002 Linux Foundation 2.0 root hub
    |__ Port 010: Dev 004, If 0, Class=Human Interface Device, Driver=usbfs, 1.5M
        ID 0764:0501 Cyber Power System, Inc. CP1500 AVR UPS
/:  Bus 004.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/2p, 5000M
    ID 1d6b:0003 Linux Foundation 3.0 root hub
    |__ Port 001: Dev 006, If 0, Class=Mass Storage, Driver=usb-storage, 5000M
        ID 13fd:3639 Initio Corporation 
    |__ Port 002: Dev 003, If 0, Class=Mass Storage, Driver=usb-storage, 5000M
        ID 0951:1666 Kingston Technology DataTraveler 100 G3/G4/SE9 G2/50 Kyson
Bash

Jak widzisz, w tym przypadku sterownik został zmieniony na usb-storage.

Jak ustawić flagi quirk na stałe w modprobe.d

Jeśli użycie flag quirk rozwiązuje Twój problem, możesz je ustawić na stałe poprzez modprobe.d. Dzięki temu Twoje ustawienia przetrwają restart systemu.

Rozpocznij od utworzenia pliku /etc/modprobe.d/usb-storage-quirks.conf, np. poleceniem:

sudo nano /etc/modprobe.d/usb-storage-quirks.conf
Bash

Następnie dodaj poniższą opcję, używając swojego identyfikatora urządzenia.

options usb-storage quirks=13fd:3639:u
Plaintext

W tym przypadku również możesz wskazać wiele urządzeń, oddzielając je przecinkiem.

Zapisz plik i uruchom ponownie system. Większości przypadków to wystarczy, aby nowe ustawienia zostały wczytane podczas uruchamiania systemu.

Jeśli jednak uruchamiasz system lub używasz LUKS/LVM na urządzeniu, którego dotyczy problem, może się okazać, że ustawienia nie są wczytywane. W takim przypadku należy przebudować initramfs.

W przypadku systemów RHEL/CentOS/Rocky/Alma/Fedora:

sudo dracut -f
sudo reboot
Bash

Natomiast w przypadku systemów Debian/Ubuntu:

sudo update-initramfs -u
sudo reboot
Bash

Mimo przebudowy ⁣i ponownego uruchomienia systemu może być wymagane fizyczne rozłączenie i ponowne podłączenie urządzenia do portu USB.

Podsumowanie

W przypadku tanich urządzeń USB-SATA może się okazać, że nie działają one stabilnie, ponieważ system używa uas do ich obsługi.

Jednak jak pokazuje ten poradnik, zmiana sterownika na usb-storage jest dość prosta i szybka, a często rozwiązuje problem niestabilnej pracy.