Windows10のクライアントHyper-VでLinuxをいくつか稼働させています。
結構前に(2019年)気づいて下書きしていたのですが、今までまとめられてなかった内容を改めてご報告です。
Debianをシャットダウンするとき
サーバとして利用しているDebianをシャットダウンするとき、長年シャットダウンコマンドは
# shutdown -h now
リブートなら
# shutdown -r now
です。
ですがこれをやると、シャットダウンプロセスが「Reached target Shutdown」で停止してしまいます。一回気づかずに数日以上シャットダウンプロセスが停止した状態のままになっているという仮想ホスト(ゲストOS、これもDebianでした)もいました。
※幸いシャットダウンプロセスが停止していたゲストOSは副系のsambaサーバだったので、特に影響はなかったのですが正系の稼働サーバがこうなっていたらと思うとちょっとヒヤヒヤしました。
最近は「Reached target Shutdown」でシャットダウンのプロセスが止まる、(以下の画面)
これなんだろう、と思ったのが発端。
対象の環境
Hyper-V環境のゲストOSとしてDebian9以降がインストールされた環境が対象です。ベアメタルな実機PCではちゃんと見ていないのですが、こういうことは起きていないように思います。
Hyper-VはWindows10のクライアントHyper-Vです。
Debianに限らないかもしれませんが、手持ちの環境で対象となるのがDebianしかないので他のOSに該当するかどうかは未確認。
systemdをベースとしたOSは…
Debianの公式では、以下のような記載となっています。
https://www.debian.org/releases/stable/armel/ch08s01.html.ja
※この記事を記載した時点での昔の↑URL、現在は「システムをシャットダウンする」<https://www.debian.org/releases/buster/amd64/ch08s01.ja.html>に同等の記載があります。)
ここの記載では、「systemctl reboot」とか「systemctl poweroff」と「shutdown -h now」は同等のような記述なのですが、systemdが採用されたJessie以降から、電源周りのコマンドはsystemctlというのが定石になっている模様。(今更な話ですね。)
systemdの制御コマンドはsystemctlなので、電源を制御するにもsystemdの制御が要求されます。
つまり、systemdが採用されたLinuxディストリビューションでは
再起動=systemctl reboot
シャットダウンして電源OFF=systemctl poweroff
を使う必要がある、ということになります。
確かに"Reached target Shutdown"が表示された状態で停止するのは、shutdown -h nowコマンドでシャットダウンした場合でした。これしか使ってなかったから。
※でも、環境によってはshutdown -h nowコマンドでシャットダウンしても"Reached target Shutdown"で停止しないOS環境もある、しかもシンボリックリンクでshutdown -h nowコマンドと見せ掛けてsystemctl poweroffが実行される、ってこともあるので、一概にどのOSでもsystemctl 何某を使えばいいってもんじゃないよう。
※ちなみに、軽量Linuxではsystemdベースではないディストリビューションもあるので、当然ですが上記の方法は使えず、以前と同様のshutdownコマンドを使います。あくまでsystemdベースのOSの話。
これからのシャットダウンはshutdown -h nowじゃない?
手持ちの環境のなかで"Reached target Shutdown"で停止してしまうDebian(のゲストOS)が、コマンドで
systemctl poweroff
を使ってシャットダウンしたら電源Offまで正常に進むので、おそらくこの辺り関係しているんだろうな、ということでこの件は完了としました。