SysVinit

May 09, 2018

SysVinit による起動

SysVinit では、init プロセスが /etc/inittab ファイルの設定に従い、以下の流れでシステムに必要なサービスを順次起動する。

  1. init が /etc/inittab ファイルを読み込む
  2. init が /etc/rc/sysinit スクリプトを読み込む
  3. init が /etc/rc スクリプトを実行する
  4. /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 はダメ!絶対!)


 © 2023, Dealing with Ambiguity