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 -tvBashW 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 KysonBashMó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/quirksBashAby 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 sterownikauas, 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:muPlaintextJeśli chcesz dodać więcej niż jedno urządzenie, rozdziel je przecinkiem w następujący sposób:
13fd:3639:mu,0951:1666:uPlaintextZapisz 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 KysonBashJak 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.confBashNastępnie dodaj poniższą opcję, używając swojego identyfikatora urządzenia.
options usb-storage quirks=13fd:3639:uPlaintextW 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 rebootBashNatomiast w przypadku systemów Debian/Ubuntu:
sudo update-initramfs -u
sudo rebootBashMimo 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.
