電源を切る前に、他のすべての作業が完了したらスクリプトを実行してください。

電源を切る前に、他のすべての作業が完了したらスクリプトを実行してください。

停電処理の終わりにスクリプトを実行するように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もこれをサポートしていると思います。)

関連情報