SysVinit による起動
SysVinit では、init プロセスが /etc/inittab ファイルの設定に従い、以下の流れでシステムに必要なサービスを順次起動する。
- init が /etc/inittab ファイルを読み込む
- init が /etc/rc/sysinit スクリプトを読み込む
- init が /etc/rc スクリプトを実行する
- /etc/rc スクリプトが /etc/rc*.d 以下のスクリプトを実行する
$ cat /etc/inittab
# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# System initialization is started by /etc/init/rcS.conf
#
# Individual runlevels are started by /etc/init/rc.conf
#
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
#
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
# with configuration in /etc/sysconfig/init.
#
# For information on how to write upstart event handlers, or how
# upstart works, see init(5), init(8), and initctl(8).
#
# 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:
SysVinit ではあらかじめ決められた順にサービスが起動するため、あるサービスの起動に時間がかかると、それ以降のサービス起動が待たされ、最終的に起動完了までの時間が長くなる。
そのため、現在は多くのディストリビューションで systemd や Upstart という仕組みに切り替えている。
Upstart ではサービスの依存関係を適切に設定したり、サービスを並列で起動することにより短時間でシステムを起動したり、ということができるようになった。
ランレベル
SysVinit を採用するシステムではランレベルと呼ばれる動作モードがあり、ランレベルごとにどのサービスが起動するか/しないかを決定できる。
ディストリビューションごとのランレベルは以下。
RHEL, CentOS, Fedora のランレベル
ランレベル | 説明 |
---|---|
0 | 停止 |
1 | シングルユーザーモード |
2 | マルチユーザーモード (テキストログイン、NFS サーバは停止) |
3 | マルチユーザーモード (テキストログイン) |
4 | 未使用 |
5 | マルチユーザーモード (グラフィカルログイン) |
6 | 再起動 |
S or s | シングルユーザーモード |
Ubuntu, Debian GNU/Linux のランレベル
ランレベル | 説明 |
---|---|
0 | 停止 |
1 | シングルユーザーモード |
2 | マルチユーザーモード |
3 | マルチユーザーモード |
4 | マルチユーザーモード |
5 | マルチユーザーモード |
6 | 再起動 |
S or s | シングルユーザーモード |
なお、シングルユーザーモードは root ユーザーのみが利用できる状態。一般ユーザーがシステムを利用すると困る場合などに用いられる。
ランレベルの確認と変更
現在のランレベルを表示するには runlevel コマンドを用いる。
$ runlevel
N 3
以前のランレベルが N なのは、起動してからランレベルを変更していないため。
ランレベルを変更するには、root ユーザーで init コマンドもしくは telinit コマンドを用いる。
$ runlevel
3 1
$ init 3
$ runlevel
1 3
一般ユーザーのログイン中にシングルユーザーモードに切り替える場合は wall コマンドでメッセージを送っておくと良い。
$ wall 'This system is going to swich to single-user mode.'
Broadcast message from root@ip-172-31-24-42 (pts/0) (Wed May 9 10:19:07 2018):
This system is going to swich to single-user mode.
起動スクリプトによるサービスの管理
SysVinit では各種サービスの起動に /etc/init.d 以下の起動スクリプトが用いられる。一般的にランレベルが異なれば起動されるサービスも異なる。
/etc/rc3.d にはランレベル 3 になった際に利用されるスクリプトが配置されている。これらのスクリプトはいずれも /etc/init.d 以下の起動スクリプトへのシンボリックリンクとなっている。
$ ls /etc/rc3.d/
K01collectd K10varnishncsa K60nfs K75quota_nld S01sysstat S08iptables S13rngd S22messagebus S50cloud-init-local S58ntpd S95atd
K01collectl K15htcacheclean K69rpcsvcgssd K86cgred S02lvm2-lvmetad S10network S13rpcbind S25blk-availability S50mosquitto S65saslauthd S95awslogs
K10psacct K16php-fpm-7.0 K74redis K89netconsole S02lvm2-lvmpolld S11auditd S14nfslock S25netfs S51cloud-init S80postfix S95docker
K10varnish K36mysqld K74redis-sentinel K89rdisc S02lvm2-monitor S12rsyslog S15mdmonitor S26acpid S52cloud-config S85httpd S98cloud-final
K10varnishlog K50vsftpd K75ntpdate K95cgconfig S08ip6tables S13irqbalance S19rpcgssd S26udev-post S55sshd S90crond S99local
$ ls -l /etc/rc3.d/K74redis
lrwxrwxrwx 1 root root 15 Mar 21 13:40 /etc/rc3.d/K74redis -> ../init.d/redis
デフォルトのランレベルの設定
デフォルトのランレベルは /etc/inittab に記載されている。
$ cat /etc/inittab | grep initdefault
# 0 - halt (Do NOT set initdefault to this)
# 6 - reboot (Do NOT set initdefault to this)
id:3:initdefault:
デファオルトのランレベルを切り替えるなら上記の 3 を 5 とかに変えればよい。(0 と 6 はダメ!絶対!)