iovxw

Linux 下配置关机同时关闭移动硬盘

是 HDD 需要注意的

距离上篇博文又是一年,不太妙

我是不是只有每年 4 月才能想起来要写点什么?

嗯这次提前一个月,有进步

那么正文开始


起因

我的台式机只有 M2。

这很奇怪。

但作为一个体积只有 20cm * 20cm * 8cm 的 ITX 来讲,没有硬盘位就很正常了

总之我的 3.5 寸仓库盘是以移动硬盘形式存在的

这倒也没什么

问题是为了更低的纹波,硬盘盒的 5V 12V 都是独立供电

甚至还焊了个 LC 滤波器(效果不错,内圈寻道时间显著降低)

然后关机:它不停


问题

如果是内置硬盘,或没有独立的 5V 供电——关机即断电,这个问题都不会那么容易被发现

我是应该反思一下自己这扭曲的需求了

不过比起不停转,更大的问题是对于普通使用 USB 供电的移动硬盘,如果关机不会关闭移动硬盘(像 Windows 上的“安全移除设备”),而直接断电,那磁头的位置在哪?

很幸运现代的机械硬盘都是有复位装置的,断电之后磁头会被拉回去,一般不会划伤盘片

但总不能依靠这个,数据无价,并且 SMART 里的 Power-Off_Retract_Count 会爆涨


方案

开始以为是硬盘盒固件问题,于是寻找 ASM 1153E 的固件

(这里感谢绿联,慷慨地把最新的、印着 "Do not release to customer" 的固件以及工具分享出来

没啥用,除了可以设置休眠时间来达到“自动关闭”

且通过 udisksctl power-off 是能正常关闭硬盘的,排除

还是乖乖找文档

Serial ATA (SATA) shutdown info

简而言之由于可能被多个设备共享,内核在关机时是不管 SCSI 设备的

但 2.6.21 之后,因为 libata 使用 SCSI 作为上层驱动,就加了自动管理,可惜移动硬盘不在此列(可能因为是 SAT?)

里面还提到 /sys/class/scsi_disk/h:c:i:l/manage_start_stop 这个属性

linux/include/scsi/scsi_device.h

unsigned manage_start_stop:1;	/* Let HLD (sd) manage start/stop */

是我们要找的了,设为 1 就会管理起停

然后 https://bugzilla.kernel.org/show_bug.cgi?id=205107 中提到,可以建一个 udev rule 自动化

/etc/udev/rules.d/01-manage_start_stop.rules

ACTION=="add|change", DRIVERS=="usb-storage", SUBSYSTEM=="scsi_disk", RUN+="/bin/sh -c 'echo 1 >/sys/class/scsi_disk/%k/manage_start_stop'"

不过它不管 UAS 设备,对于支持 UAS 的硬盘盒需要加一下

ACTION=="add|change", DRIVERS=="usb-storage|uas", SUBSYSTEM=="scsi_disk", RUN+="/bin/sh -c 'echo 1 > /sys/class/scsi_disk/%k/manage_start_stop'"

顺便吐槽一下 GNOME 官方的 Removable drive menu 插件,虽然是给 removable drive 用的,却只能 unmount,要安全移除的话还得进 nautilus 点菜单

TODO 里再加个插件计划吧,不知道 GNOME 40 API 又会变多少