私は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
これが一種の監視装置の問題ではないと仮定すると、kexec
systemdのターゲットをハイジャックしてみることができます。これは通常、メモリをダンプするためにkdumpカーネルをロードするために使用されますが、このターゲットを設定して事実上すべての操作を実行できます。
私はsystemdという単位を作ってkexec-sleep
入れました。 (この // 行が正確に収まるかどうか/etc/systemd/system/kexec-sleep.service
はわかりませんが、仮想マシンではうまく機能しました。)Requires
After
Before
[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
。