Systemd:実際にシャットダウンせずにシャットダウンする方法

Systemd:実際にシャットダウンせずにシャットダウンする方法

私はUPSの停電時に終了するようにDebian Jessieを実行する組み込みデバイスを設定しています。残念ながら、デバイスのブートローダはオペレーティングシステムがシャットダウンするたびに再起動するため、shutdown / haltコマンドは再起動と同じです。

私の主な関心事は、接続されたハードドライブのデータを保護することです。私の考えに最善の選択は、できるだけ多くのタスクを終了し、電源が切れるのを待つことです。systemctl isolate emergency.targetディスクがマウントされたままであることを除いて、私が望むものと非常によく似ています。final.targetデフォルトでは、実際のシャットダウン/停止コマンドなしでSystemdを有効にする方法はありますか?

答え1

systemctl halt成功することもできます。マニュアルから:

halt
    Shut down and halt the system. This is mostly equivalent to
    systemctl start halt.target --job-mode=replace-irreversibly
    --no-block, but also prints a wall message to all users. This
    command is asynchronous; it will return after the halt operation is
    enqueued, without waiting for it to complete. Note that this
    operation will simply halt the OS kernel after shutting down,
    leaving the hardware powered on. Use systemctl poweroff for
    powering off the system (see below).

答え2

これが一種の監視装置の問題ではないと仮定すると、kexecsystemdのターゲットをハイジャックしてみることができます。これは通常、メモリをダンプするためにkdumpカーネルをロードするために使用されますが、このターゲットを設定して事実上すべての操作を実行できます。

私はsystemdという単位を作ってkexec-sleep入れました。 (この // 行が正確に収まるかどうか/etc/systemd/system/kexec-sleep.serviceはわかりませんが、仮想マシンではうまく機能しました。)RequiresAfterBefore

[Unit]
Description=Sleep forever at kexec
DefaultDependencies=no
Requires=umount.target
After=umount.target
Before=final.target

[Service]
Type=oneshot
ExecStart=/sbin/kexec-sleep
KillMode=none

[Install]
WantedBy=kexec.target

/sbin/kexec-sleepこれによりシェルスクリプトが呼び出されます(下記参照)。ルートファイルシステムを読み取り専用で再マウントしようとするため、デバイスの電源が切れるまでクリーンなままにしてください。必要以上の情報がいくつかあり、sleep最後に電源コードを抜かずに再起動できるヒントがあります。

#!/bin/sh

stty sane < /dev/console       # enable automatic CRLF output on console
exec < /dev/console > /dev/console 2>&1  # redirect stdio to/from console
echo "Sleeping several seconds for processes to terminate..."
sleep 10
# kill some expected processes
killall dhclient
# sleep again...
sleep 5
echo "Processes still running:"
/bin/ps --ppid 2 -p 2 --deselect    # list non-kernel processes
echo "Attempting to remount root filesystem read-only..."
sync; sync; sync
mount -o remount,ro /
grep /dev/sda /proc/mounts
while true; do
    echo "System paused. Type 'reboot' to reboot"
    read -p '> ' entry
    if [ "$entry" = "reboot" ]; then
        /sbin/reboot -f
    fi
done

これらのファイルを作成してからchmod +x /sbin/kexec-sleep実行しますsystemctl enable kexec-sleep

通常のシャットダウンの代わりにこのタスクを実行するには、を実行しますsystemctl kexec

関連情報