質問: システム起動時にinitのランレベルを変えることでセーフモードにしたりCUIログインにしたりという使い方があるのは分かったのですが、 1initのシステム停止や再起動はなんのために使われるのですか?単にシャットダウンコマンド等ではダメなのですか? 2他のサービス(httpdなど)のランレベルを設定する必要性がいまいちわかりません。これも同様に、シャットダウンや再起動を設定する必要はあるのですか? Webサイトなどを運営したりするときなど具体的な使い方(実際の使われ方)がイメージできません。実はそんなに関係がなかったりするのでしょうか。 システム管理系に詳しい方、どうかよろしくお願いいたします。m(_ _)m ちなみに今はCentOS7を勉強しているのでランレベルはあまり関係ないみたいですが、もやもやしています。
回答: > > 1initのシステム停止や再起動はなんのために使われるのですか?単にシャットダウンコマンド等ではダメなのですか? > > > 通常の`shutdown`コマンドはinitへランレベルの変更を命令しているだけにすぎません。`-n`オプションでinitを使用せずに停止させることもできますが、危険なため非推奨です。なお、Linuxでの`reboot`や`halt`は内部で`shutdown`を呼び出しているだけですので、動作は同じです。 停止を行うランレベル0や再起動を行うランレベル6には、各サービスの終了処理が登録されています。例えばデータベースではメモリ上のデータをファイルに全て書き込んでから終了するようになっているでしょう。それらのサービスの終了処理が完了してから、OS自身の停止や再起動を行っています。もし、そのような終了処理を行わず、強制的にプロセスを停止させた場合、ファイルに保存されていないデータが損失することになります。initを経由しない停止が危険であるとされるのは、こういった理由があるからです。 > > 2他のサービス(httpdなど)のランレベルを設定する必要性がいまいちわかりません。これも同様に、シャットダウンや再起動を設定する必要はあるのですか? > > > initを採用しているLinuxは通常ランレベル3またはランレベル5で起動します。これらのランレベルに起動処理を登録してなかった場合、そのサービスはOS起動時に起動することはありません。パッケージで入れている場合は、ランレベル0やランレベル6には必要に応じて自動的に停止処理が登録されます。ユーザーが追加で登録する必要はありません。また、CentOS等のRedHat系では`chkconfig`を使ってランレベル3やランレベル5に起動処理を簡単に登録できるようになっています。 パッケージを用いず、独自でファイルを用意してサービスを作る場合は、initスクリプトの作成やランレベルへの登録を手動で行う必要があります。httpdをソースコンパイルして独自で入れるにしても、httpdのパッケージを参考にinitスクリプトの作成やランレベルへの登録を行うといいかと思います。 参考: Man page of INIT Man page of SHUTDOWN F.4. SysV Init ランレベル - Red Hat Customer Portal CentOS7からinitからsystemdに変更されました。上記はinitを使用していたCentOS6までしか通用しない事に注意してください(互換性のため、initの仕組みは一部残されています)。Ubuntuと言ったDebian系やArch Linux等の過去のバージョンではinitを採用していましたが、細部がCentOS等のRedHat系と全く同じという訳では無いと言うことにも注意してください。 いずれにしても、initは過去のもになりますので、これからはsystemdを学んでいった方がいいかと思います。