ランレベルはどこへ行った?(Systemdになってランレベルはどうなったのか)

メモ:

SysVinit 等では、起動する状態に応じてランレベルというものがありました。例えば、ランレベル 1 のシングルユーザーモードで実行したい場合、起動時にrc.d/rc1.dのスクリプトが実行されます。SysVinit 等では、ランレベルに応じてスクリプトが用意されていたのですが Systemd は Unit という考えに代わっています。ランレベルがどのような扱いになったのか、またランレベルを変更するにはどうしたらよいのかを確認していきます。

ランレベルのおさらい

SysVinit 等では、/etc/inittabに設定されたデフォルトのランレベルを読み、対応するスクリプトを実行していました。

# Default runlevel. The runlevels used are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
#
id:3:initdefault:

上記例では、「id:3:initdefault:」の設定により、デフォルトのランレベルに「3」が指定されており/etc/rc.d/rc[0-6].dの各レベルに対応したディレクトリからランレベル3(rc3.d)にあるスクリプトが実行され指定した状態で起動します。

ランレベルには、次のような種類があります。

ランレベル 概要
0:システム停止 シャットダウンを実行します。ランレベルを0にすると電源が切られます。
1:シングルユーザーモード rootのみログイン出来る状態になります。ネットワークサービスも停止されます。
2:マルチユーザーモード(ネットワークなし) CUIを利用するときのモードになりますが、ネットワークに関するデーモンを起動しません。
3:マルチユーザーモード(ネットワークあり) CUIを利用するときのモードになります。
4:未使用 未使用
5:マルチユーザモード(グラフィカルログイン) GUI(X Window)で起動するモードになります。
6:システム再起動 再起動を実行します。

ランレベルとUnit(ターゲット)の対応

systemd では、Unit という考え方が採用されたため、ランレベル相当する機能はターゲットになりました。SysVinit のランレベルと systemd のターゲットの対応は次の通りとなります。ただし、systemd のmulti-userターゲットはランレベル2, 3, 4の区別がありませんので、ランレベル 2, 4は用意されなくなった事になります。(4 は未使用だったので微妙)

ランレベル(SysVinit) ターゲット(systemd)
0 poweroff
1 rescue
2, 3, 4 multi-user
5 graphical
6 reboot

systemd では、始めに /etc/systemd/system/default.target を読みに行くのですが、 /etc/systemd/system/default.target は /lib/systemd/system/multi-user.target 等へのシンボリックリンクになっています。multi-user.target へシンボリックリンクが貼られている場合、ランレベル 3 相当で起動されることになります。

では、/etc/inittab はどうなったのでしょうか? /etc/inittab を確認すると次のようになっていました。

# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
#
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
#
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
#
# To view current default target, run:
# systemctl get-default
#
# To set a default target, run:
# systemctl set-default TARGET.target

「inittab is no longer used when using systemd.」となっており、 inittab は使われなくなったことが確認できます。

現在のランレベルを確認する

現在のランレベルを確認する runlevel コマンドは、まだ使えるようで次のように確認できました。
※ runlevel コマンドは、現在のランレベルと、その前のランレベルを表示します。

# runlevel
N 3

デフォルトのターゲットを確認する

デフォルトで設定されているターゲットを確認するには、systemctlコマンドを使います。

# systemctl get-default
multi-user.target

一時的にターゲット(ランレベル)を変更する

systemctl コマンドで変更する

CentOS 6 では、telinitコマンドを使ってランレベルの変更が行えましたが、systemd では systemctl コマンドを使ってターゲットを変更することができます。

例えば、graphical.target(ランレベル 5)へ変更したい場合、次のように実行します。

# systemctl isolate graphical.target
# runlevel
3 5

一時的な変更のため、デフォルトのターゲットは変更されません。

# systemctl get-default
multi-user.target

/sbin/init コマンドで変更する

従来の /sbin/init コマンドもsystemdへのシンボリックリンクとして用意されていますので、これを利用してランレベルを変更することもできます。

# init 1

起動時(GRUB)にターゲットを変更する

起動時(GRUB)にターゲットを変更するには 、次のGRUBの画面で「e」 キーを押下し設定画面へ遷移します。

GRUBの画面

下のほうにある linux16/vmlinuz-3.xx で始まるカーネルオプションの末尾に「systemd.unit=変更したいターゲット.target」を追記します。

たとえば、グラフィカルログイン(ランレベル 5)にしたい場合は、「systemd.unit=graphical.target」と追記します。

linux16/vmlinuz-3.10.0-514.6.1.el7.x86_64 root=/dev/mapper/centos-toot 
ro rd.lvm.lv=centos/root rd.lvm.lv=centos/swap crashkernel=auto rhgb quiet 
LAND=ja_JP.UTF-8 systemd.unit=graphical.target

設定が完了したら、「Ctrl + x」キーを押下して起動します。

恒久的にターゲットを変更する

恒久的にターゲットを変更したい場合は、systemctl コマンドを次のように実行します。

# systemctl set-default graphical

実際のところ、 /etc/systemd/system/default.target はシンボリックリンクなので、シンボリックリンクが /lib/systemd/system/graphical.target へ変更されているだけです。

ここまで確認した結果、systemd へ変更されたことにより、ランレベルという考え方からターゲットという考え方へ変わってきていることが確認できました。