UAS: uas_eh_device_reset_handler start

merevlemez illusztráció

Probléma: előfordulhat, hogy az UAS (USB Attached SCSI) modul normál üzemmódban nem teljesen kompatibilis egy adott gyártó USB <-> SATA vezérlőjével. Ez tipikusan akkor fordulhat elő, ha a gyártó nem, vagy nem megfelelően (bugosan) implementálta a kommunikációs protokollt.

Az UAS az USB Attached SCSI Protokoll (UASP) implementációja, mely célja hogy hatékonyabb legyen a rendszer és az USB-n keresztül csatlakoztatott adathordozó közti kommunikáció, amivel nagyobb adatátviteli sebességet és kisebb rendszerterhelést lehet elérni.

Ha ez a protokoll nincs megfelelően implementálva, akkor jobb esetben lassulást, rosszabb esetben akár adatvesztést és/vagy adatkorrupciót is átélhetünk. A mi esetünkben magát a BTRFS fájlrendszert sikerült csatolhatatlan állapotra hozni úgy, hogy egyik ajánlott/nem ajánlott helyreállítási módszer sem vált be. Még jó, hogy van rendszeres mentés.

Műkedvelőknek a BTRFS log:

júl 06 21:38:56 Narada-Jammy kernel: BTRFS error (device dm-0): open_ctree failed
júl 06 21:38:56 Narada-Jammy kernel: BTRFS warning (device dm-0): failed to read root (objectid=4): -5
júl 06 21:38:56 Narada-Jammy kernel: BTRFS error (device dm-0): bad tree block start, want 656244736 have 12271773390792321705
júl 06 21:38:56 Narada-Jammy kernel: BTRFS error (device dm-0): bad tree block start, want 656244736 have 11553080673597090602
júl 06 21:38:56 Narada-Jammy kernel: BTRFS info (device dm-0): has skinny extents
júl 06 21:38:56 Narada-Jammy kernel: BTRFS info (device dm-0): using free space tree
júl 06 21:38:56 Narada-Jammy kernel: BTRFS info (device dm-0): flagging fs with big metadata feature

A lényeg, hogyha ilyesmit látsz a logban, akkor az UAS és az USB - SATA vezelőchip nem jön ki egymással:

sd 13:0:0:0: [sdp] tag#0 CDB: Read(10) 28 00 63 e0 c4 d0 00 00 08 00
sd 13:0:0:0: [sdp] tag#0 uas_eh_abort_handler 0 uas-tag 2 inflight: CMD IN 
sd 13:0:0:0: [sdp] tag#2 CDB: Read(10) 28 00 3f f4 e7 10 00 00 10 00
sd 13:0:0:0: [sdp] tag#2 uas_eh_abort_handler 0 uas-tag 13 inflight: CMD IN 
sd 13:0:0:0: [sdp] tag#3 CDB: Read(10) 28 00 3f f4 f3 a8 00 00 08 00
sd 13:0:0:0: [sdp] tag#3 uas_eh_abort_handler 0 uas-tag 3 inflight: CMD IN 
sd 13:0:0:0: [sdp] tag#4 CDB: Read(10) 28 00 72 c5 dc 28 00 00 10 00
sd 13:0:0:0: [sdp] tag#4 uas_eh_abort_handler 0 uas-tag 1 inflight: CMD IN 
sd 13:0:0:0: [sdp] tag#5 CDB: Read(10) 28 00 3f f4 f0 f0 00 00 08 00
sd 13:0:0:0: [sdp] tag#5 uas_eh_abort_handler 0 uas-tag 5 inflight: CMD IN 
sd 13:0:0:0: [sdp] tag#6 CDB: Read(10) 28 00 3f f4 f1 90 00 00 10 00
sd 13:0:0:0: [sdp] tag#6 uas_eh_abort_handler 0 uas-tag 6 inflight: CMD IN 
sd 13:0:0:0: [sdp] tag#7 CDB: Read(10) 28 00 63 e0 e4 10 00 00 08 00
sd 13:0:0:0: [sdp] tag#7 uas_eh_abort_handler 0 uas-tag 7 inflight: CMD IN 
sd 13:0:0:0: [sdp] tag#8 CDB: Read(10) 28 00 3f d2 7e 60 00 00 08 00
sd 13:0:0:0: [sdp] tag#8 uas_eh_abort_handler 0 uas-tag 8 inflight: CMD IN 
sd 13:0:0:0: [sdp] tag#10 CDB: Read(10) 28 00 3f f4 f3 d8 00 00 08 00
sd 13:0:0:0: [sdp] tag#10 uas_eh_abort_handler 0 uas-tag 4 inflight: CMD IN 
sd 13:0:0:0: [sdp] tag#11 CDB: Read(10) 28 00 3f f4 ec 40 00 00 08 00
sd 13:0:0:0: [sdp] tag#11 uas_eh_abort_handler 0 uas-tag 10 inflight: CMD IN 
sd 13:0:0:0: [sdp] tag#12 CDB: Read(10) 28 00 3f d2 73 40 00 00 08 00
sd 13:0:0:0: [sdp] tag#12 uas_eh_abort_handler 0 uas-tag 11 inflight: CMD IN 
sd 13:0:0:0: [sdp] tag#13 CDB: Read(10) 28 00 63 81 01 d0 00 00 08 00
sd 13:0:0:0: [sdp] tag#13 uas_eh_abort_handler 0 uas-tag 12 inflight: CMD IN
[sdp] tag#0 FAILED Result: hostbyte=DID_ERROR driverbyte=DRIVER_OK cmd_age=10s
scsi host13: uas_eh_device_reset_handler start
usb 2-5: reset SuperSpeed USB device number 3 using xhci_hcd
usb 2-5: Disable of device-initiated U1 failed.
usb 2-5: Disable of device-initiated U2 failed.
blk_update_request: I/O error, dev sdp, sector 448968656 op 0x0:(READ) flags 0x80700 phys_seg 98 prio class 0

Megoldás:: Ilyenkor feketelistára kell tenni az adott vezérlőt, hogy az UAS helyett a lassabb BOT (Bulk-Only Transport) módot és az usb-storage illesztőprogramot használja, amit minden USB-s adattároló támogat.

1. lépés: keressük meg a rendetlen eszközt

Az lsusb parancs - paraméterek nélkül - kilistázza a gép USB portjaihoz csatlakoztatott összes eszközt. Ezek között keressük meg az adattárolónkat. Szerencsére írja az eszköz/vezérlő nevét is, így egyszerű megtalálni:

$ lsusb
Bus 001 Device 002: ID 8087:8001 Intel Corp. Integrated Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 005 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 002 Device 004: ID 0bda:8771 Realtek Semiconductor Corp. Bluetooth Radio
Bus 002 Device 003: ID 1bcf:0005 Sunplus Innovation Technology Inc. Optical Mouse
Bus 002 Device 002: ID 413c:2005 Dell Computer Corp. RT7D50 Keyboard
Bus 002 Device 006: ID 152d:0578 JMicron Technology Corp. / JMicron USA Technology Corp. JMS578 SATA 6Gb/s
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Az én célpontom a Bus 002 Device 006: ID 152d:0578 JMicron Technology Corp. / JMicron USA Technology Corp. JMS578 SATA 6Gb/s, ami egy külső USB dokkoló.

Ez a dokkoló a 2-es USB buszon lévő 6-os számú eszköz, mely azonosítója 152d:0578, melyből a 152d a gyártó JMicron-t, a 0578 pedig a vezérlőchippet azonosítja.

Most bizonyosodjunk meg arról, hogy ez az eszköz tényleg az uas modult használja, használjuk az lsusb -t parancsot:

$ lsusb -t
/:  Bus 05.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 5000M
/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 480M
/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/6p, 5000M
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/14p, 480M
    |__ Port 4: Dev 6, If 0, Class=Mass Storage, Driver=uas, 480M
    |__ Port 5: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
    |__ Port 6: Dev 3, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
    |__ Port 7: Dev 4, If 1, Class=Wireless, Driver=btusb, 12M
    |__ Port 7: Dev 4, If 0, Class=Wireless, Driver=btusb, 12M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/8p, 480M

Tehát 2-es busz, 6-os eszköz:

/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/14p, 480M
    |__ Port 4: Dev 6, If 0, Class=Mass Storage, Driver=uas, 480M

"Szuper", UAS-t használ.

2. lépés: feketelistázzuk az eszközt

Beállítások tesztelése

Ha szeretnéd/lehetőséged van rá, a végleges beállítások előtt kipróbálhatod, hogy jók-e a beállításaid. Ehhez el kell távolítani az usb-storage modult, majd újra be kell tölteni, a kívánt paraméterekkel.
$ sudo rmmod usb-storage
$ sudo modprobe usb-storage quirks=<gyártó_azonosító>:<vezérlőchip_azonosító>:u

Nálam pl.:
$ sudo modprobe usb-storage quirks=152d:0578:u

A teszteléshez húzd ki majd dugd vissza az adattárolódat. A dmesg ilyesmit kéne hogy mondjon:

usb-storage 2-5:1.0: USB Mass Storage device detected
usb-storage 2-5:1.0: Quirks match for vid 152d pid 2566: 1800000

Beállítások véglegesítése

A véglegesítéshez hozzunk létre - root/rendszergazda felhasználóként - egy új fájlt a /etc/modprobe.d könyvtárban. Legyen a neve blacklist-uas.conf

Tartalma pedig így nézzen ki:
options usb-storage quirks=<gyártó_azonosító>:<vezérlőchip_azonosító>:u

A saját példámnál maradva:
options usb-storage quirks=152d:0578:u

A :u a végén fontos, ugyanis az jelzi a kernelnek hogy ne használja az uas-t (azaz beállítja S_FL_IGNORE_UAS flag-et az eszközre).

Indítsd újra a gépet a beállítás érvényesítéséhez.

Amennyiben az újraindítás után továbbra is az uas illesztőprogram lenne használatban, úgy futtass le egy $ sudo update-initramfs -u parancsot és csinálj még egy újraindítást.

3. lépés: Tesztelés

Az lsusb -t paranccsal ellenőrizd, hogy immár az "usb-storage" driver van használva:

/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/14p, 480M
    |__ Port 4: Dev 6, If 0, Class=Mass Storage, Driver=usb-storage, 480M

A dmesg-ben is látnod kell, hogy az UAS helyett az usb-storage lesz használva:

[30344.083461] usb 2-4: new high-speed USB device number 6 using xhci_hcd
[30344.276407] usb 2-4: New USB device found, idVendor=152d, idProduct=0578, bcdDevice= 1.00
[30344.276412] usb 2-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[30344.276413] usb 2-4: Product: AXAGON USB3.0 HDD DOCK
[30344.276415] usb 2-4: Manufacturer: AXAGON
[30344.276416] usb 2-4: SerialNumber: 0000AB123456
[30344.277434] usb 2-4: UAS is ignored for this device, using usb-storage instead
[30344.277436] usb-storage 2-4:1.0: USB Mass Storage device detected
[30344.277640] usb-storage 2-4:1.0: Quirks match for vid 152d pid 0578: 1800000
[30344.277726] scsi host2: usb-storage 2-4:1.0
[30345.296247] scsi 2:0:0:0: Direct-Access     TOSHIBA  HDWD110          8101 PQ: 0 ANSI: 6
[30345.296978] sd 2:0:0:0: Attached scsi generic sg0 type 0
[30345.297335] sd 2:0:0:0: [sda] 1953525168 512-byte logical blocks: (1.00 TB/932 GiB)
[30345.297700] sd 2:0:0:0: [sda] Write Protect is off
[30345.297707] sd 2:0:0:0: [sda] Mode Sense: 47 00 00 08
[30345.298052] sd 2:0:0:0: [sda] Disabling FUA
[30345.298058] sd 2:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[30345.362187]  sda: sda1
[30345.363186] sd 2:0:0:0: [sda] Attached SCSI disk

Kész is vagy.

Ami pedig a BTRFS-t illeti: ilyen szintű fájlrendszer sérülést a btrfs rescoue parancsok egyikével sem sikerült helyrehozni. A testdisk felismeri a fájlrendszer típusát, de nem tud róla adatot menteni. A photorec végig tud menni a lemezen és helyre is tud állítani ezt - azt, de nyilvánvalóan se a struktúra nem marad meg, se a fájlnév, se semmi.

Ha ugyanez a sztori ext4 fájlrendszeren történik meg, akkor talán - de csak talán - jobb eséllyel futottam volna neki egy potenciális helyreállításnak. Azt még mindig több eszköz ismeri, amik közül lehetséges, hogy valami ki tudott volna hámozni valamit belőle.

Minden jó, ha jó a vége, adatvesztés nem történt (mentésből helyreállítottunk mindent) és új tapasztalatokkal lettem gazdagabb.