折腾一个硬盘盒

/ 5评 / 0

你说,为什么会有这种神奇的事情发生呢?

近些日子我为了一口醋包了一顿饺子——不是真吃,是因为一批计算设备终于服役期满,光荣退役。我一直很想给自己搞一个私有存储,但树莓派的驱动能力让我不是特别自信,随即下单了一部 J1900 工控主机打算利用换下来的硬盘做存储方案。

这个主机到了,我傻眼了:里面没预留任何硬盘盘位,连笔记本硬盘都塞不下。退货又不太舍得:毕竟是一个计算设备!那就只能借助硬盘盒了。前前后后花了小三百,终于硬件方面置办妥当。

这个硬盘盒有一个相当神奇的能力:其实是个 RAID 控制器。由于只有两个盘位,所以可选的只有 RAID-0 或者 RAID-1. 除此之外还可以选 JBOD 和 SPAN 两个模式。由于插入的两块硬盘容量并不统一,我就直接选择了 SPAN.

然后神奇的事情就发生了:这玩意插上去之后完全不能用。dd 备份读个开头就会死掉。这东西可花了我大一百块!但社恐的我实在是不想退货,所以,开始问题排查。

电源验证

首先考虑是不是电源驱动能力不行。拆掉一块硬盘测试,一样会死。换一个标定电流更低的,还是不行。插上额外的 DC 口,效果更差了,这回干脆连分区表都不读了。

硬盘验证

难道因为长时间没开机,硬盘已经不行了?立刻给旧设备上电,硬盘读写验证通过。所以这个问题也不应该是因为硬盘挂了导致的。

操作系统

会不会是有什么驱动要安装呢?翻了一下淘宝详情页,没有提到要装驱动。讽刺的是详情页上大图标画着「支持 Windows, Mac 和 Linux.」那么至少确定这是免驱硬盘盒。

考虑到这个硬盘盒有 RAID 能力,或许是它不支持硬盘现有的分区表需要磁盘重新分区?旧数据显然是得拷出来,于是打开台式机的 SSH, tar 打包需要复制的数据,再 scp 扔到台式机的冷备硬盘上,正好顺带测试了网速,旧设备 100MBps 带宽跑满得到 11MB/s 的传输速度——正好也是宽带下载的速度。

拷完了数据,顺手删掉了分区表,插回硬盘盒决定重新分区。这次居然成功了!fdisk 成功识别了硬盘盒并写入了分区表,也能挂载了!挺好,台式机弹出硬盘,插到工控上做进一步配置。

但我还没高兴一下,工控那边又出岔子。刚刚分区的硬盘 mount 无响应,直接挂死了。拔掉硬盘系统恢复正常。再把硬盘盒插回台式机,台式机一个核心直接满载,观察到是桌面负责探测和挂载存储设备的守护进程挂死。拔掉硬盘盒一切回归正常。

这太神奇了。

不死心的我开始翻淘宝评论区,或许有 dalao 遇到过这种奇怪问题。可惜毕竟用 Linux 的是小众,用这个硬盘盒的那就更少。翻了几页除了刷的好评或者只是单纯说好用的评价外没有其他东西。不过突然有一条评论写道:「这个东西卖家说只支持 Windows. 你们看着要不要买。」

只支持 Windows? 免驱的玩意怎么可能出现只支持 Windows 的情况呢?

于是我立刻就启动了 Windows. 插上硬盘盒,硬件被识别。打开磁盘管理,也确实出现了刚刚划的分区。但由于是 ext4 所以 Windows 没有识别。删掉分区表重新创建了 NTFS 分区,Windows 就识别了。写一个测试文件,然后弹出设备,再插进去,也正常识别了。

那正好,可以换上工控机了。正当我以为「切,不就是只支持 NTFS 嘛」的时候,工控机上又不能挂载分区了。台式机重新启动到 Linux 下,插上去,卷标都读出来了,但是也是硬生生挂载不上,又是一个核心满载。

震撼我妈。

但我可不想在 8G 的硬盘上塞一个 Windows 10 还当服务器使。我也不太清楚 Windows Server 的体量能不能屈尊于这么一个工控设备,而且 Windows Server 的授权估计也不好搞,所以换 Windows 是绝对不可接受的!Archlinux forever!

在 Windows 下查看设备属性,发现这是一个 SCSI 设备。会不会和 Linux 下的 SCSI 支持有关呢?

粗略查找了一番,Linux 关于 SCSI 的支持是在内核里的,感觉关系不大。通过 lsusb 看了一下设备的 ID:

Bus 002 Device 002: ID 13fd:3a40 Initio Corporation 3598US

陌生的名字。Google 一圈,无论是搜 Initio, 3598 还是 13fd:3a40, 都没有什么有用的结果。搜索 linux external hard drive hang, 也没有什么头绪。

日志捉凶

那么,看看系统日志吧。

$ sudo dmesg

然后我就看到了这么一条:

Optimal transfer size 33553920 bytes not a multiple of physical block size (4096 bytes).

33553920 刚好是 0xffff 乘以 512;紧接着又是这么一条:

ERROR Unknown event condition 34 for slot 13 ep 6 , HC probably busted

难道说 Linux 干了一些 Windows 没有去干的事情,然后硬盘盒不理解这些指令,就干脆自闭了?

顺着第二条日志信息,找到了这个帖子说用 USB 3.0 外置硬盘的时候读不了 SMART 信息。看了看回帖,其中有一个非常关键的操作:屏蔽 UAS 驱动。细细查了一下系统日志,发现这块硬盘插入之后确实由 UAS 接管了。那么干掉 UAS 或许就能解决现在的问题。

屏蔽 UAS

虽然说楼主并没能仅仅屏蔽 UAS 驱动解决他遇到的问题,但我总得先实验一下。屏蔽 UAS 驱动有两种手段,一种是直接屏蔽整个 UAS 内核模块;另一个是按需屏蔽。我不清楚 UAS 有什么特殊的作用,但是按需屏蔽还是稳妥一些。

按需屏蔽需要更改内核的启动参数。在 Archlinux 下,编辑引导配置就可以。我使用了相当传统的 GRUB, 所以编辑 /etc/default/grub, 给 GRUB_CMDLINE_LINUX_DEFAULT 追加这样一串神秘代码就行:

usb-storage.quirks=13fd:3a40:u

这里的 13fd:3a40 可能和你的硬盘盒不一样,它是从 lsusb 里获得的设备 ID, 你可以根据需要调整。

保存之后,通过 grub-mkconfig 生成新的配置文件,然后重启,终于工控机也能挂上分区了。

[ 5408.826742] usb 2-1: new SuperSpeed USB device number 3 using xhci_hcd
[ 5408.843859] usb 2-1: New USB device found, idVendor=13fd, idProduct=3a40, bcdDevice= 1.01
[ 5408.843866] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 5408.843870] usb 2-1: Product: 3598US
[ 5408.843873] usb 2-1: Manufacturer: ACASIS
[ 5408.843876] usb 2-1: SerialNumber: 3030303030303030303030303030303030303030
[ 5408.844875] usb 2-1: UAS is ignored for this device, using usb-storage instead
[ 5408.844884] usb-storage 2-1:1.0: USB Mass Storage device detected
[ 5408.845154] usb-storage 2-1:1.0: Quirks match for vid 13fd pid 3a40: 800000
[ 5408.845258] scsi host4: usb-storage 2-1:1.0
[ 5409.870971] scsi 4:0:0:0: Direct-Access     ACASIS   3598US           0101 PQ: 0 ANSI: 6
[ 5409.871926] sd 4:0:0:0: [sdb] 1601914752 512-byte logical blocks: (820 GB/764 GiB)
[ 5409.872211] sd 4:0:0:0: [sdb] Write Protect is off
[ 5409.872221] sd 4:0:0:0: [sdb] Mode Sense: 67 00 10 08
[ 5409.872498] sd 4:0:0:0: [sdb] Write cache: enabled, read cache: enabled, supports DPO and FUA
[ 5409.951191]  sdb: sdb1
[ 5409.952379] sd 4:0:0:0: [sdb] Attached SCSI disk

震撼我妈

正当我感觉这个玩意已经没有问题的时候,它又炸了。

[ 5449.233596] usb 2-1: reset SuperSpeed USB device number 3 using xhci_hcd
[ 5449.250779] sd 4:0:0:0: [sdb] tag#0 FAILED Result: hostbyte=DID_TIME_OUT driverbyte=DRIVER_OK cmd_age=30s
[ 5449.250787] sd 4:0:0:0: [sdb] tag#0 CDB: Read(10) 28 00 00 00 00 08 00 00 08 00
[ 5449.250791] I/O error, dev sdb, sector 8 op 0x0:(READ) flags 0x80700 phys_seg 1 prio class 0
[ 5557.377134] buffer_io_error: 3 callbacks suppressed
[ 5557.377137] Buffer I/O error on dev sdb, logical block 1, async page read

难道这玩意还真只能在 Windows 下用了?又进入 Windows, 插上硬盘仍然可以识别和读取。但这次我没有着急拔掉,而是静置了五分钟。果然,五分钟后再试,Windows 下也不能读写了。

好,光速退货,七天无理由,直接往快递点一扔走人。


后面就是掷重金购买正儿八经的硬盘阵列了。快递在路上,敬请期待。

  1. […] 继上回硬盘盒爆炸之后,不死心的我觉得还是得把这些硬盘利用起来。于是掷重金购置了一部四盘位的硬盘阵列。由于实在是囊中羞涩,所以这回就没有硬件级别的 RAID 能力了,不过这并不影响,我们仍然可以选择使用软件 RAID 来实现我们的需求。 […]

  2. 姜辰Jcs.Moe说道:

    哈哈哈哈,呢个,请问这“饺子”退货了后,还有别的滋味吗?

  3. 阿锋说道:

    退下来的东西,换一种方式继续服役,难得

  4. sunnywolf说道:

    哈哈,真厉害,还能分析这么深入。

发表评论

您的电子邮箱地址不会被公开。