センチュリーの裸族の一戸建て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
で確認する。
m
はMAX_SECTORS_64
で、u
はIGNORE_UAS
でUSB Attached SCSI (UAS) のドライバを使わなくするオプション。
UAS は無効にしないと、まれに再発することがあった。
なお、modprobe.d
をいじった後は、Debian系ならupdate-initramfs -u
や SuSEならmkinitrd
コマンドを発行する必要がある。