我有一个连接到 USB 的 USB SATA2 驱动器,该驱动器安装为 /home。当我关闭计算机/笔记本电脑时,磁盘会发出一些高音调的声音,就好像电源关闭时磁盘仍在旋转并且磁头没有停止一样。
当我卸载分区并手动向磁盘发送睡眠信号时,不会产生此声音:
hdparm -Y /dev/sdb
但要做到这一点,我需要卸载 /home,因为磁盘的一个分区已通过 fstab 安装为 /home:
UUID=[long number] /home ext4 defaults 1 2
因此不可能卸载它,因为磁盘总是很忙。目前我可以转到运行级别 1,然后卸载它,然后发送睡眠信号:
systemctl isolate runlevel1.target
umount /home
umount /dev/sdb*
hdparm -Y /dev/sdb
(unplug the drive without the drive giving any sounds)
systemctl poweroff
因为每次我想关闭计算机/笔记本电脑时要做的事情有点多,所以我尝试向 rc0 添加一个脚本:
/etc/init.d 中有以下文件
-rwxr-xr-x 1 root root 547 Mar 3 07:57 sleep.usb
包含:
#! /bin/bash
#
# network Bring up/down networking
#
# chkconfig: - 10 1
# description: Unmount /home/harm/ssd, /home and send sleep signal
#
# See how we were called.
case "$1" in
start)
;;
stop)
somevar="$(mount|grep /home)";
if [ "$somevar" != "" ]; then
umount /home
fi
umount /dev/sdb*
hdparm -Y /dev/sdb
;;
*)
echo $"Usage: $0 {start|stop|status|restart|reload|force-reload}"
exit 2
esac
exit 0
安装它:
chkconfig --add sleep.usb
它显示在正确的目录中:
lrwxrwxrwx 1 root root 19 Mar 3 08:00 K01sleep.usb -> ../init.d/sleep.usb
然而;当我关闭计算机/笔记本电脑时,硬盘仍然发出声音并将其握在手中,我可以感觉到磁盘在旋转,直到电源关闭的那一刻。
答案1
初始解决方案
所以,你有systemd
作为你的 init.在这种情况下,我首先建议至少在您自己的代码中避免使用兼容层,而应使用 systemd 的本机工具。在这里,最好的选择是使用 systemd 运行任意文件的能力/usr/lib/systemd/system-shutdown
作为其关闭逻辑的一部分。
去引用systemd 关闭(8):
在执行实际系统halt/poweroff/reboot/kexec之前,systemd-shutdown将运行/usr/lib/systemd/system-shutdown/中的所有可执行文件,并向它们传递一个参数:“halt”、“poweroff”、“reboot” " 或 "kexec",具体取决于所选操作。
所以,你可以放置一个脚本来做只是hdparm -Y
进入该目录,它将在系统停止之前执行。请注意,它是很晚关闭:所有内容要么已卸载,要么以只读方式重新安装,进程被终止,网络已关闭,等等。因此,您不需要脚本中当前存在的任何辅助逻辑。
更新
正如您所说,仅仅告诉磁盘进入睡眠状态并没有帮助。那是因为你的脚本完成后它会再次被唤醒。它可能会因为systemd-shutdown
执行关闭的最后准备或其他原因而发生。
因此,我们需要在设备进入睡眠状态后将其从系统中删除。我想您的驱动器是 USB 大容量存储设备;以下所有内容仅适用于此类驱动器。
DRIVE=sdb # replace with whatever is needed
echo 1 > $(realpath /sys/block/$DRIVE/device)/../../../../remove
要了解发生了什么,需要了解(Linux 特定的)sysfs 层次结构的一些知识。
/sys/block/sdX
是代表(虚拟)块设备的目录device
是一个符号链接,指向代表物理 SCSI 设备的目录(在 Linux 中,USB 大容量存储设备显示为 SCSI 磁盘)- 首先
..
转到代表 SCSI 目标的父目录 - 第二个
..
转到代表 SCSI 主机的父目录 - 第三个
..
进入代表 USB“接口”的父目录 - 第四个
..
进入代表 USB“设备”的父目录——这就是我们所需要的。
最后,我们写入1
该remove
目录中的文件。这告诉 USB 驱动程序禁用该设备并将其从系统中删除。
希望这能起到作用。