systemd: ファイルシステムが読み取り専用でマウントされた後、シャットダウン時にスクリプトを実行する

systemd: ファイルシステムが読み取り専用でマウントされた後、シャットダウン時にスクリプトを実行する

ファイル システムを読み取り専用として再マウントした後、シャットダウン時にスクリプトを実行する方法はありますか?

私はワイヤレス ソケットに接続された Raspberry Pi を持っており、送信機とスクリプトを介してこれを制御できます。ファイル システムが読み取り専用でマウントされた後、シャットダウン時にそのソケットの電源をオフにします (Raspberry の電源をオフにします)。

私はこれを試しました:

[Unit]
Description=Test
DefaultDependencies=no
Requires=shutdown.target umount.target final.target
After=shutdown.target umount.target final.target

[Service]
Type=oneshot
ExecStart=/test
KillMode=none

[Install]
WantedBy=halt.target

スクリプト /test は現在のマウントを出力します。シャットダウン時に実行すると、ルート ファイル システムの読み取り/書き込みが示され、予想どおり読み取り専用は示されません。

編集:

/test の内容:

#!/bin/bash

echo -n 'Debug-Mount: ' > /dev/tty1
cat /proc/mounts | grep /dev/sda > /dev/tty1

シャットダウン時の画面出力:

ここに画像の説明を入力してください

答え1

信頼できる解決策を見つけました。スクリプトを /usr/lib/systemd/system-shutdown/ に置くだけです。

参照:https://www.freedesktop.org/software/systemd/man/systemd-halt.service.html

実際のシステム halt/poweroff/reboot/kexec を実行する直前に、systemd-shutdown は /usr/lib/systemd/system-shutdown/ 内のすべての実行可能ファイルを実行し、選択されたアクションに応じて「halt」、「poweroff」、「reboot」、または「kexec」のいずれかの引数をそれらに渡します。このディレクトリ内のすべての実行可能ファイルは並列に実行され、すべての実行可能ファイルが完了するまでアクションの実行は続行されません。

答え2

元のスクリプトについては、通常は halt.target の前に実行されます (halt.target の前に順序付けしていないことに注意してください)。また、その時点ではファイルシステムが再マウントされることはありません。systemd-shutdown (systemd は halt.target に到達した後、最後に実行します) は、内容を強制終了し (順序付けされていないスクリプトと一緒に実行される可能性もあります =) )、最終的な umount/swapoff/losetup を実行し、アンマウントできなかった内容を再マウントしてから、system-shutdown ディレクトリから並列で内容を実行し、shutdown が /run/initrams に存在する場合は pivot_root() を試行します (存在しないか pivot が失敗した場合は、halt に進みます)。

関連情報