配置 Linux 关机时停转移动硬盘
是 HDD 需要注意的
距离上篇博文又是一年,不太妙
我是不是只有每年 4 月才能想起来要写点什么?
嗯这次提前一个月,有进步
那么正文开始
起因
我的台式机上只有 M2
这很奇怪,但作为一个体积只有 20cm * 20cm * 8cm 的 ITX 来讲,没有硬盘位就很正常了
总之我的 3.5 寸仓库盘是以移动硬盘形式存在的
这倒也没什么
问题是为了更低的纹波,我给硬盘盒的 5V 12V 都搞的独立供电,甚至还焊了个 LC 滤波器(效果不错,内圈寻道时间显著降低)
结果关机:它不停
问题
如果是内置硬盘,或没有独立的 5V 供电——关机即断电,这个问题都不会那么容易被发现
是应该反思一下自己这扭曲的需求了
不过比起不停转,更大的问题是对于其他普通使用 USB 供电的移动硬盘,如果没弹出移动硬盘(像 Windows 上的“安全移除设备”),而是关机后被直接断电,那磁头的位置在哪?
很幸运现代机械硬盘都是有复位装置的,断电之后磁头会被拉回去,一般不会划伤盘片
但总不能依靠这个,数据无价,并且 SMART 里的 Power-Off_Retract_Count
会爆涨
方案
开始以为是硬盘盒固件问题,于是寻找 ASM 1153E 的固件
(比如这里)
——没啥用,除了可以设置休眠时间来达到“自动关闭”
且通过 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 又会变多少