web-dev-qa-db-ja.com

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

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

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

私はこれを試しました:

[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

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

enter image description here

6
casper

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

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

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

6
casper

元のスクリプトに関しては、通常、halt.targetの前に実行されます(halt.targetの前に注文しなかったことに注意してください)。その時点でファイルシステムがroに再マウントされることはありません。 systemd-shutdown(最後にsystemd execが-halt.targetに到達した後)を停止し(おそらく、順序付けされていないスクリプトと一緒に=))、最終的なumount/swapoff/losetupを実行し、roを再マウントできないumountを実行し、system-shutdownディレクトリから並行して実行し、シャットダウンが存在する場合は/ run/initramsにpivot_root()を試行します(シャットダウンが存在しない場合、またはピボットが失敗した場合は、停止を続行します)。

1
Michal Soltys