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.