症狀

當外接磁盤使用的是 USB 3.0 時, 磁盤會隨緣 freezes。

錯誤日誌如下 (這個問題是幾天前出現的,懶的去翻日誌, 所以直接複製的網上和我一樣的錯誤日誌)

[ +10.195770] sd 7:0:0:0: [sdc] tag#2 data cmplt err -71 uas-tag 3 inflight: CMD
[  +0.000007] sd 7:0:0:0: [sdc] tag#2 CDB: opcode=0x2a 2a 00 01 d1 83 e0 00 00 28 00
[ +24.981444] sd 7:0:0:0: [sdc] tag#1 uas_eh_abort_handler 0 uas-tag 2 inflight: CMD IN
[  +0.000008] sd 7:0:0:0: [sdc] tag#1 CDB: opcode=0x28 28 00 0a 08 85 90 00 01 00 00
[  +0.000103] sd 7:0:0:0: [sdc] tag#8 uas_eh_abort_handler 0 uas-tag 9 inflight: CMD IN
[  +0.000006] sd 7:0:0:0: [sdc] tag#8 CDB: opcode=0x28 28 00 09 f3 fe 00 00 01 00 00
[  +0.000061] sd 7:0:0:0: [sdc] tag#0 uas_eh_abort_handler 0 uas-tag 1 inflight: CMD IN
[  +0.000005] sd 7:0:0:0: [sdc] tag#0 CDB: opcode=0x28 28 00 09 f3 f5 d8 00 01 00 00
[  +0.000049] sd 7:0:0:0: [sdc] tag#7 uas_eh_abort_handler 0 uas-tag 8 inflight: CMD OUT
[  +0.000005] sd 7:0:0:0: [sdc] tag#7 CDB: opcode=0x2a 2a 00 01 d1 84 c8 00 00 08 00
[  +0.000047] sd 7:0:0:0: [sdc] tag#6 uas_eh_abort_handler 0 uas-tag 7 inflight: CMD OUT
[  +0.000004] sd 7:0:0:0: [sdc] tag#6 CDB: opcode=0x2a 2a 00 01 d1 84 b8 00 00 08 00
[  +0.003514] sd 7:0:0:0: [sdc] tag#5 uas_eh_abort_handler 0 uas-tag 6 inflight: CMD OUT
[  +0.000008] sd 7:0:0:0: [sdc] tag#5 CDB: opcode=0x2a 2a 00 01 d1 84 78 00 00 08 00
[  +0.003470] sd 7:0:0:0: [sdc] tag#4 uas_eh_abort_handler 0 uas-tag 5 inflight: CMD OUT
[  +0.000005] sd 7:0:0:0: [sdc] tag#4 CDB: opcode=0x2a 2a 00 01 d1 84 30 00 00 08 00
[  +0.003454] sd 7:0:0:0: [sdc] tag#3 uas_eh_abort_handler 0 uas-tag 4 inflight: CMD OUT
[  +0.000006] sd 7:0:0:0: [sdc] tag#3 CDB: opcode=0x2a 2a 00 01 d1 84 20 00 00 08 00
[  +0.003478] sd 7:0:0:0: [sdc] tag#2 uas_eh_abort_handler 0 uas-tag 3 inflight: CMD
[  +0.000004] sd 7:0:0:0: [sdc] tag#2 CDB: opcode=0x2a 2a 00 01 d1 83 e0 00 00 28 00
[  +0.055769] scsi host7: uas_eh_device_reset_handler start
[  +0.150438] usb 4-3: reset SuperSpeed USB device number 3 using xhci_hcd
[  +0.032045] scsi host7: uas_eh_device_reset_handler success

復現

大量的頻繁的 讀寫時可復現。

問題原因

UAS (USB Attached SCSI) 是 USB 3.0 的一種新的傳輸協議 (支持多線程,命令排隊等。我也不知道這是個啥,反正聽起來很厲害就是了)。

當然這麼厲害的東西也不是輕易就能使用的,得滿足以下條件。

  • 設備的硬件本身支持 UAS
  • 設備的固件支持 UAS
  • UAS support inside the driver stack of the USB (不知這個該如何翻譯)
  • System controller which is compatible with the UAS (這個也是)

四者缺一不可,否則就會出現上述的問題。

解決

通過添加一個內核參數禁用掉 UAS 來解決此問題。

使用內核命令行

usb-storage.quirks=Vendor_ID:Product_ID:u

使用 modprobe

options usb-storage quirks=Vendor_ID:Product_ID:u

方法來源:

uas problem in linux 3.15.1, need advice on the problem [SOLVED]

Connection problem with USB3 external storage on Linux (UAS driver problem)

題外

我需要用到的外接磁盤很多 (有時候還會使用他人的磁盤), 所以最開始是排斥這個方法的。

結果在網上搜索了一圈又一圈, 發現並沒有更好的解決方法。

爲防止又隨緣 freezes, 還是選擇把所有會用到的外接磁盤都 block 了 (寧可錯殺一千,也不放過一個), 不然又得陷入無休止的 fsck 中。