haltの挙動

Ubuntu 16.04 で halt を実行したときにPCの電源が切れなくて焦った。明らかにシステムは止まってるんだけど。

運悪くも Ubuntu 16.04 には停止時のバグが「ある」もしくは「あった」らしく、調べるとむしろそっちに関するトピックが盛り上がっていて混乱した。その流れでsystemctl start debug-shellなんてのを覚えたが、今回はデバッグするまでもなく、そのデバッグ用のシェルも停止する。「どうも本当にシステム停止には成功しているような……」みたいな気持ちになり、トラブルシューティングの仕方を見直した。

で、冷静に調べてみると halt コマンドは電源を停止するコマンドではない「ことがある」という事実を初めて知ってビビった。あくまでシステムを停止するまでがhaltの両分であって、電源を停止するかどうかは実装に依る。さらに言えば、haltコマンドの本来の意図は「緊急停止」という説明すら読んだ。ゾッ……

自分はだいぶ昔にhaltを使うように教え込まれたか勘違いしたかで、ずっと使っていたのだが、間違いだ。明白に間違いだ。

正解は、むしろベーシックな解説ではもっとよく見る shutdown -h now、あるいはpoweroffというコマンドがあればそれ。普通にLinux入門とか呼んでいれば多分そっちで覚えるはず。

ただ……これまでは halt でも電源断してくれるLinux環境の方が多かった気がするし、緊急停止もなにも普通にシャットダウンシーケンスに突入していた気がする。むしろ使っていたLinux環境はそっちばかりだ。何故、今頃になってこんなベーシックそうなコマンドに変化が?

正確な歴史は調べていないし調べるつもりもないけど、ネット上の断片から推測した内容は以下の通り。正しい歴史 (Linux以外も含む) はもっと詳しいUnix歴史家に任せたい。
  • 本来のhaltは緊急停止に近い意味合いで、電源も切るのは管理者の役割だった
  • sysvinitの(それなりに新しい)実装ではrunlevelを0 (停止) か6 (再起動)にするコマンドとして実装され、この際にはshutdownやpoweroffと動作が同じになった
  • 今はsystemdの採用が進んでいる。systemdが採用されている場合、halt, poweroff, shutdownはすべてsystemctlへのエイリアスとなり、実装は根本的に変わることとなった (少なくともそのように見える)
  • systemdのhalt実装ではhaltは「CPUを停止する」が「ACPI経由で電源を停止する」ことまでしないようだ。haltで電源停止まで支持したければ、-pオプションをつける必要がある。
  • Ubuntu 16.04はsystemdを採用しているので、haltを -p オプションなしで使うとそれまで (sysvinit系とか) と異なる挙動になる
他のUnixを使っていれば、違いにすぐに気づいたはずだ。例えばAIXのhaltの説明等を読むだけで全く違う。

POSIXには規定はなさそう (単に出てこなかった)。Linuxの新ディストロ含めて、自分が知らないUnix系OSで電源停止まで含めたコマンドを使うときは必ずmanを参照したほうが良さそうだ。


このブログの人気の投稿

WiiUのコントローラが通信不良に陥った話

LibreOfficeで表紙、目次、本体でフッターのページ番号のスタイルを変える

技術書典2 あ-03 『もわねっとのPythonの本』