정전 처리가 끝나면 스크립트를 실행하도록 systemd를 어떻게 구성합니까(20여년 전에는 이를 "정전 실행 수준"이라고 함)? 이 스크립트는 컴퓨터가 종료되기 전에 마지막으로 실행되어야 합니다. 이상적으로는 시스템을 재부팅할 경우 이 스크립트를 실행하면 안 됩니다.
시도했지만 Before=shutdown.target
이로 인해 종료가 시작될 때 스크립트가 실행됩니다.
전원을 끄기 전 마지막 지점에서 시스템이 거의 종료되기 직전이어서 사실상 사용할 수 없다는 것을 알고 있습니다. 더 이상 마운트된 파일 시스템도 없고, 네트워크도 없고, 다른 서비스도 없습니다.
커널이 회전하는 하드 드라이브를 종료하는 데 문제가 있는 것 같습니다. 시스템의 전원이 꺼지면 디스크 헤드가 들어가는 소리가 들립니다(안전하지 않은 전원 손실). SMART "전원 끄기 철회 횟수" 속성이 증가하고 있습니다. 해결책이 있다는 것을 알고 있지만 아직 게시되지 않았습니다. 그래서 이 hdparm -Y /dev/sda
명령을 해결 방법으로 사용하고 싶습니다 .
따라서 루트 파일 시스템을 마운트 해제하기 전, 다른 모든 디스크 I/O 활동(동기화 포함)이 완료된 후에 스크립트를 실행해야 할 것 같습니다.
답변1
따라서 루트 파일 시스템을 마운트 해제하기 전, 다른 모든 디스크 I/O 활동(동기화 포함)이 완료된 후에 스크립트를 실행해야 할 것 같습니다.
동기화된 파일 시스템이라 할지라도 파일 시스템을 마운트 해제하면 여전히 I/O가 발생하고 디스크가 다시 깨어나기 때문에 이는 아마도 작동하지 않을 것입니다. (systemd가 별도의 동기화를 수행하는지 확실하지 않습니다. umount는 항상 전체 동기화/새로 고침을 의미하므로 umount 호출이 이를 처리하도록 허용한다고 생각합니다.)
systemd를 사용하면 이 시점에서 사용자 정의 스크립트를 스크립트에 넣어 실행할 수 있습니다 /usr/lib/systemd/system-shutdown/
(예:시스템 종료(8)), 그러나 동일한 디스크에서 실행되는 한 원하는 효과를 얻지 못할 가능성이 높습니다.
systemd가 "shutdown initramfs"라고 부르는 것을 사용하는 것이 더 나을 수도 있습니다. 종료하기 전에 디렉토리를 준비하는
경우 (예: shutdown.target의 일부인 서비스 사용) systemd는 /run 파일 시스템을 메모리에 반환합니다. /run/initramfs
이전 루트 파일 시스템을 완전히 마운트 해제할 수 있으며,그 다음에실제 정전이 발생하기 전에 HDD에 회전을 중지하도록 요청할 수 있습니다.
(Arch Linux의 mkinitcpio에는 mkinitcpio-generate-shutdown-ramfs.service
예제로 사용할 수 있는 것이 있습니다. 현재 Dracut도 이를 지원한다고 생각합니다.)