/home으로 마운트된 USB SATA2 드라이브가 USB에 연결되어 있습니다. 컴퓨터/노트북을 끄면 마치 디스크가 여전히 회전하고 있고 전원을 꺼도 헤드가 멈추지 않는 것처럼 디스크에서 약간의 높은 소리가 납니다.
파티션을 마운트 해제하고 수동으로 디스크에 절전 신호를 보내면 다음 소리가 나지 않습니다.
hdparm -Y /dev/sdb
하지만 이렇게 하려면 디스크의 파티션 중 하나가 fstab을 통해 /home으로 마운트되어 있으므로 /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
이 경우에는 먼저 최소한 자체 코드에서 호환성 레이어를 사용하지 말고 대신 systemd의 기본 도구를 사용하는 것이 좋습니다. 여기서 가장 좋은 옵션은 /usr/lib/systemd/system-shutdown
종료 논리의 일부로 임의 파일을 실행하는 systemd의 기능을 사용하는 것입니다 .
견적으로 이동시스템 종료(8):
실제 시스템 quit/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 드라이버에게 장치를 비활성화하고 시스템에서 제거하도록 지시합니다.
이것이 효과가 있기를 바랍니다.