初始解决方案

初始解决方案

我有一个连接到 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”、“rebo​​ot” " 或 "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“设备”的父目录——这就是我们所需要的。

最后,我们写入1remove目录中的文件。这告诉 USB 驱动程序禁用该设备并将其从系统中删除。

希望这能起到作用。

相关内容