Linuxで「裸族の一戸建てUSB3.0 eSATAプラス (CRIS35EU3)」を使う

センチュリーの裸族の一戸建てUSB3.0 eSATAプラス (CRIS35EU3)は、言わずとしれた同社の裸族シリーズのHDD外付けボックスで、USB 3.0とeSATAのいずれかを使って、SerialATAのHDDを接続することができる製品だ。 このシリーズはよく売られているので、油断して買ったところ、Linux で使う場合には少し工夫が必要だった。

なお、公式ホームページには2011/07/08付のファームウェアアップデータ [century.co.jp] が公開されている。 この問題は、このファームウェアを適用したあとも発生していた。

発生した問題

USB3.0 で接続時、データ転送を頻繁に行っている状態になると、以下のようなログを出力し、停止してしまう。 この状態でケーブルの挿抜を行っても認識せず、HDDボックス側のコールドリスタートが必要。 なお、eSATA 接続時にはこの事象は発生しない。

2017-10-09T07:30:25+0000: sd 0:0:0:0: [sda] tag#0 FAILED Result: hostbyte=DID_ERROR driverbyte=DRIVER_SENSE
2017-10-09T07:30:25+0000: sd 0:0:0:0: [sda] tag#0 Sense Key : Hardware Error [current] 
2017-10-09T07:30:25+0000: sd 0:0:0:0: [sda] tag#0 Add. Sense: No additional sense information
2017-10-09T07:30:25+0000: sd 0:0:0:0: [sda] tag#0 CDB: Read(10) 28 00 9a 80 14 30 00 00 08 00
2017-10-09T07:30:25+0000: blk_update_request: I/O error, dev sda, sector 2592085040
2017-10-09T07:30:29+0000: sd 0:0:0:0: [sda] tag#0 FAILED Result: hostbyte=DID_ERROR driverbyte=DRIVER_SENSE
2017-10-09T07:30:29+0000: sd 0:0:0:0: [sda] tag#0 Sense Key : Hardware Error [current] 
2017-10-09T07:30:29+0000: sd 0:0:0:0: [sda] tag#0 Add. Sense: No additional sense information
2017-10-09T07:30:29+0000: sd 0:0:0:0: [sda] tag#0 CDB: Read(10) 28 00 4f 40 19 28 00 00 08 00
2017-10-09T07:30:29+0000: blk_update_request: I/O error, dev sda, sector 1329600808
2017-10-09T07:30:29+0000: sd 0:0:0:0: [sda] tag#0 FAILED Result: hostbyte=DID_ERROR driverbyte=DRIVER_SENSE
2017-10-09T07:30:29+0000: sd 0:0:0:0: [sda] tag#0 Sense Key : Hardware Error [current] 
2017-10-09T07:30:29+0000: sd 0:0:0:0: [sda] tag#0 Add. Sense: No additional sense information
2017-10-09T07:30:29+0000: sd 0:0:0:0: [sda] tag#0 CDB: Read(10) 28 00 4f 40 19 b8 00 00 78 00
2017-10-09T07:30:29+0000: blk_update_request: I/O error, dev sda, sector 1329600952
2017-10-09T07:30:29+0000: EXT4-fs error (device dm-0): __ext4_get_inode_loc:4344: inode #41554218: block 166199602: comm du: unable to read itable block
2017-10-09T07:30:30+0000: sd 0:0:0:0: [sda] tag#0 FAILED Result: hostbyte=DID_ERROR driverbyte=DRIVER_SENSE
2017-10-09T07:30:30+0000: sd 0:0:0:0: [sda] tag#0 Sense Key : Hardware Error [current] 
2017-10-09T07:30:30+0000: sd 0:0:0:0: [sda] tag#0 Add. Sense: No additional sense information
2017-10-09T07:30:30+0000: sd 0:0:0:0: [sda] tag#0 CDB: Read(10) 28 00 a2 40 30 38 00 00 f0 00
2017-10-09T07:30:30+0000: blk_update_request: I/O error, dev sda, sector 2722115640
2017-10-09T07:30:30+0000: sd 0:0:0:0: [sda] tag#0 FAILED Result: hostbyte=DID_ERROR driverbyte=DRIVER_SENSE
2017-10-09T07:30:30+0000: sd 0:0:0:0: [sda] tag#0 Sense Key : Hardware Error [current] 
2017-10-09T07:30:30+0000: sd 0:0:0:0: [sda] tag#0 Add. Sense: No additional sense information
2017-10-09T07:30:30+0000: sd 0:0:0:0: [sda] tag#0 CDB: Read(10) 28 00 a2 40 2d 38 00 00 60 00
2017-10-09T07:30:30+0000: blk_update_request: I/O error, dev sda, sector 2722114872
2017-10-09T07:30:30+0000: sd 0:0:0:0: [sda] tag#0 FAILED Result: hostbyte=DID_ERROR driverbyte=DRIVER_SENSE
2017-10-09T07:30:30+0000: sd 0:0:0:0: [sda] tag#0 Sense Key : Hardware Error [current] 
2017-10-09T07:30:30+0000: sd 0:0:0:0: [sda] tag#0 Add. Sense: No additional sense information
2017-10-09T07:30:30+0000: sd 0:0:0:0: [sda] tag#0 CDB: Read(10) 28 00 a2 40 2e 88 00 00 a8 00
2017-10-09T07:30:30+0000: blk_update_request: I/O error, dev sda, sector 2722115208
2017-10-09T07:30:30+0000: EXT4-fs error (device dm-0): __ext4_get_inode_loc:4344: inode #85080777: block 340263884: comm du: unable to read itable block
2017-10-09T07:30:31+0000: sd 0:0:0:0: [sda] tag#0 FAILED Result: hostbyte=DID_ERROR driverbyte=DRIVER_SENSE
2017-10-09T07:30:31+0000: sd 0:0:0:0: [sda] tag#0 Sense Key : Hardware Error [current] 
2017-10-09T07:30:31+0000: sd 0:0:0:0: [sda] tag#0 Add. Sense: No additional sense information
2017-10-09T07:30:31+0000: sd 0:0:0:0: [sda] tag#0 CDB: Read(10) 28 00 a3 80 12 c8 00 00 68 00
2017-10-09T07:30:31+0000: blk_update_request: I/O error, dev sda, sector 2743079624
2017-10-09T07:31:35+0000: usb 1-1.5: USB disconnect, device number 6
2017-10-09T07:31:40+0000: usb 1-1.5: new high-speed USB device number 7 using dwc2
2017-10-09T07:31:45+0000: usb 1-1.5: unable to get BOS descriptor
2017-10-09T07:31:45+0000: usb 1-1.5: unable to read config index 0 descriptor/start: -71
2017-10-09T07:31:45+0000: usb 1-1.5: can't read configurations, error -71
2017-10-09T07:31:45+0000: usb 1-1.5: new high-speed USB device number 8 using dwc2
2017-10-09T07:31:46+0000: usb 1-1.5: device descriptor read/64, error -71
2017-10-09T07:31:46+0000: usb 1-1.5: device descriptor read/64, error -71
2017-10-09T07:31:46+0000: usb 1-1.5: new high-speed USB device number 9 using dwc2
2017-10-09T07:31:46+0000: usb 1-1.5: device not accepting address 9, error -71
2017-10-09T07:31:46+0000: usb 1-1.5: new high-speed USB device number 10 using dwc2
2017-10-09T07:31:47+0000: usb 1-1.5: device not accepting address 10, error -71
2017-10-09T07:31:47+0000: usb 1-1-port5: unable to enumerate USB device

上記のように、事象が発生するとUSBの接続が切れて、enumerateできなくなってしまう。

HDD は日立とWDの 160 GB から2 TB までの複数、ホストはAMD/Intel/Raspberry Pi など複数種のチップセットの組み合わせで発生した。 WD の2 TBのときの認識時のログは以下。

2017-10-09T07:26:49+0000: usb 1-1.5: new high-speed USB device number 6 using dwc2
2017-10-09T07:26:49+0000: usb 1-1.5: New USB device found, idVendor=6795, idProduct=2756
2017-10-09T07:26:49+0000: usb 1-1.5: New USB device strings: Mfr=1, Product=2, SerialNumber=3
2017-10-09T07:26:49+0000: usb 1-1.5: Product: USB-SATA Bridge
2017-10-09T07:26:49+0000: usb 1-1.5: Manufacturer: Prolific Technology Inc.
2017-10-09T07:26:49+0000: usb 1-1.5: SerialNumber: SSI7612000000001
2017-10-09T07:26:49+0000: usb-storage 1-1.5:1.0: USB Mass Storage device detected
2017-10-09T07:26:49+0000: scsi host0: usb-storage 1-1.5:1.0
2017-10-09T07:26:49+0000: usbcore: registered new interface driver usb-storage
2017-10-09T07:26:49+0000: usbcore: registered new interface driver uas
2017-10-09T07:26:51+0000: scsi 0:0:0:0: Direct-Access     WDC WD20 EARX-00PASB0     51.0 PQ: 0 ANSI: 0
2017-10-09T07:26:51+0000: sd 0:0:0:0: Attached scsi generic sg0 type 0
2017-10-09T07:26:51+0000: sd 0:0:0:0: [sda] 3907029168 512-byte logical blocks: (2.00 TB/1.82 TiB)
2017-10-09T07:26:51+0000: sd 0:0:0:0: [sda] Write Protect is off
2017-10-09T07:26:51+0000: sd 0:0:0:0: [sda] Mode Sense: 03 00 00 00
2017-10-09T07:26:51+0000: sd 0:0:0:0: [sda] No Caching mode page found
2017-10-09T07:26:51+0000: sd 0:0:0:0: [sda] Assuming drive cache: write through
2017-10-09T07:26:51+0000:  sda: sda1
2017-10-09T07:26:51+0000: sd 0:0:0:0: [sda] Attached SCSI disk
2017-10-09T07:29:23+0000: EXT4-fs: Warning: mounting with data=journal disables delayed allocation and O_DIRECT support!
2017-10-09T07:29:24+0000: EXT4-fs (dm-0): mounted filesystem with journalled data mode. Opts: (null)
2017-10-09T07:30:00+0000: EXT4-fs (dm-0): mounted filesystem with journalled data mode. Opts: data=journal,journal_checksum

解決法

問題の原因は、/sys/block/sda/device/max_sectorsの値が大きすぎることだった。 Linux では初期値が240 で、Windows での64 よりも大きい。 これにデバイスが対応していないことで、ファームウェアが誤動作しているようだ。

一時的に変更するには、echo 64 > /sys/block/sda/device/max_sectors とすればよく、これで再現しなくなることを確認 (sdaの部分はlsblkコマンドで確認する)。

こういうちょっとおかしなデバイスは、やはりそれなりにあるようで、Linuxのマスストレージクラスのドライバusb-storageではquirksと呼ばれて対応する機能が組み込まれている。 Documentation/kernel-parameters.txt [elixir.free-electrons.com]を見ると、起動時のパラメータのusb-storage.quirks=vendor:product:mと指定すればMAX_SECTORS_64 フラグがつくことが分かる。 今回の場合、起動パラメータをいじらずに、/etc/modprobe.d/usb-quirks.conf に以下内容を書き込むことで対応可能だった。

options usb-storage quirks=6795:2756:mu

6795:2756 はベンダID/デバイスIDで、認識時のログを見るか、lsusbで確認する。 mMAX_SECTORS_64 で、uIGNORE_UAS でUSB Attached SCSI (UAS) のドライバを使わなくするオプション。 UAS は無効にしないと、まれに再発することがあった。 なお、modprobe.dをいじった後は、Debian系ならupdate-initramfs -u や SuSEならmkinitrd コマンドを発行する必要がある。