CentOS 7でinittabはどこへ消えた?

7bcda9562d38e63a547666c408dc2ae5_s

題名は「チーズはどこへ消えた」のオマージュなので、実際には/etc/inittabはCentOS 7でも存在します。

さて、CentOS 7(RHEL7)といえばsystemdへの移行が大きなトピックですな。「ふん。そんなもん気にしないで漢はだまってrc.localさ」というのもステキ! 濡れるッ! と思います。ちなみにCentOS 7でもrc.localはありますが、 It is highly advisable to use systemd… な上に、/etc/rc.d/rc.localの実行パーミッションが落とされているので、

してから使いましょう。お兄さんと約束だ。いや、そろそろ年貢の納め時だろ…。systemd覚えようね。たいしたことないから。ちなみに赤帽の方が書いてくださったわかりやすいスライドは以下にあります:

でもね…。ちょっとほっといたら強制的にGUIモードでインストールされたCentOS 7見て、お兄さん思ったんだけどね…。ぼくぁ、 ランレベル5=GUIでUNIX使わない人なんだよね…。ランレベル3=CUIを起動時デフォルトにしたい よ。

だからsystemd移行で重要なのはサービス管理方法じゃなくて、 ランレベルの変更方法 なんじゃないかな。などと勝手なことを思ったよ。で、勉強会とかではあんまり触れられてないのね。たぶん、みんなGUI好きだから?

systemdにはランレベルなんざねーよ

でも、initがなくなったので当然ランレベルなんてありません! あたかもホモが嫌いな女子なんていない真理がごとく。

といっても、互換性重視なのでこんなことはちゃんとできます:

いっぽうで、/etc/inittab を読むと

って書いてある。坊やだから? じゃあ起動時のランレベルはどう指定すんの!

代わりに「ターゲット」を使う

なので、完全にあきらめてsystemdの「ターゲット」の概念を今後は使いましょう。ターゲットが何かって言うと、

  • systemdのサービス設定ファイルの中で「WantedBy」として書かれていた「multi-user.target」みたいなやつ
  • ランレベルが単細胞生物だとしたらそれを多細胞生物ばりに進化させたような概念で、ランレベルより多くの状態を細かくつくれる

ものです。なんで「target」なのかは知らない。日本人としては「state」のほうがしっくりする気が。

どんなターゲットがあるかは/lib/systemd/system/*.targetとして定義されている。…ぼくの手元では56個もある。「サスペンドしたとき」「umountしたとき」「悲しいとき」などなど。で、懇切丁寧なことにこいつらの中に旧ランレベル相当のtarget設定が用意されている! なので「起動時はこのtargetの状態にしてね!」と指定すればOK!

ターゲットの一覧と設定方法

ということで、いにしえのランレベルに相当するターゲットをリストアップしてみる。

ランレベル ターゲット名(互換) systemdっぽいターゲット名
0 runlevel0.target poweroff.target
1 runlevel1.target rescue.target
2 runlevel2.target multi-user.target
3 runlevel3.target multi-user.target
4 runlevel4.target multi-user.target
5 runlevel5.target graphical.target
6 runlevel6.target reboot.target

ていねいなことにrunlevel[0-6]として互換ぽい名前のターゲットが用意されている。実態は右端のsytemdっぽいターゲットのsymlinkなんだけど、当面はわかりやすいようにrunlevel[0-6]を使っていきたい気がする。

で、具体的に「ノングラフィカルなマルチユーザーモードで起動させる方法」なんだけど、runlevel3.targetで起動するように指定してやればいい。コマンドラインから、

とするだけ。GUIで起動していた人は、/etc/systemd/system/default.targetが/lib/systemd/system/graphical.targetになっていたというカラクリだったんだね。

で、reboot してちゃんとCUIで起動したら成功! おつかれさまでした!