【初級者向け】Linuxシステムの起動 ~ SysVinit、Upstart、systemd ~
今回の内容
今回は、Linuxの起動の種類とその仕組みについて解説します。
覚えておきたいキーワード
・SysVinit
・Upstart
・systemd
概要
以下は、一般的なOSの起動の仕組みです。
今回対象とするのは⑤およびその後のプロセスの管理に関する内容で、
SysVinit, Upstart, systemdという3種類の仕組みを解説します。
※プロセスとは、Linuxにおける1つ1つの処理あるいはプログラムの単位のことです。
詳細は後程説明していきますが、登場年代順に並べると以下の通りです。
SysVinit(1988頃~) ⇒ Upstart(2006頃~) ⇒ systemd(2011頃~)
SysVinit | Upstart | systemd | |
---|---|---|---|
CentOS | 5以前 | 6.0(2011) | 7.0(2014) |
Ubuntu | 6.9以前 | 6.10(2006) | 15.04(2015) |
基本的には新しくなるにつれて、機能が改良されています。
最近のディストリビューションではsystemdが主流となっていますが、
長年動いている既存のシステムではSysVinitが使われている事もまだ多いと思いますので、3種の仕組みについて確認していきましょう。
SysVinit
特徴
SysVinitでは、初めにinitプロセスを開始します。
initプロセスは、/etc/inittabに記述されたプロセスを順に起動します。
前のプロセスの終了を待って次のプロセスを起動する事から、いずれかのプロセスの終了までに時間がかかると後続のプロセス全てが遅れることとなり、結果として最終的な起動までに時間がかかるデメリットがありました。
最初の時点では必要は無いプロセスであっても順番どおりに起動してしまうのも、起動遅延の原因でした。
そのため現在ではこの問題を改善した、Upstartやsystemdといった新しい仕組みが採用されることが多くなっています。
実行順序
1. initプロセス開始
2. /etc/inittabファイルを読み込む
以下、inittabに記載されたプロセスを順に起動
2-1. 「システム初期化スクリプトを実行」(/etc/rc.d/rc.sysinitスクリプト)
2-2. 「rcスクリプトを実行」(/etc/rc.d/rcスクリプト)
2-3. その他の定義、設定や、特定ランレベルの場合の処理
以下は/etc/inittabの例です。(※内容は、ディストリビューションとバージョンによって異なります。)
画像の①~③の箇所をまずは簡単に説明すると、以下の通りです。
① ⇒ デフォルトのランレベルを設定している。この場合は「5:マルチユーザー(グラフィカル)」
② ⇒ システム初期化のために、ランレベルに関係なく実行する処理。
③ ⇒ ランレベルに応じた処理が実行される。今回は「/etc/rc.d/rc 5」
(詳細:補足1 /etc/inittabの書式)
②が先ほどの実行順序における「2-1 システム初期化スクリプトを実行」に対応し、
③が「2-2 rcスクリプトを実行」に対応しています。(補足3 rc.sysinitスクリプトについて )
ここまでが基本的なSysVinitの内容となるので、実行の流れと各キーワードを押さえておきましょう。
※ランレベルとはLinuxの動作モードの事です。詳細は以下記事で解説します。
ランレベル/ブートターゲット変更、システムの再起動とシャットダウン ~ ランレベルとブートターゲット
Upstart
特徴
Upstartも、SysVinitと同じように初めにinitプロセスが実行されますが、
SysVinitとは違い、プロセスを並列で起動することにより、短時間で起動することが可能となっています。
/etc/inittabファイルは存在しません。(補足7 Upstartでの/etc/inittab)
Upstartの大きな特徴は「イベント駆動型」であるという点です。
イベントとはシステム上の何らかの変化のことで、例えばデバイスの追加、ネットワークの変更、システムの再起動など、種類は様々です。
initデーモンがイベントを検知すると、イベントに対応するジョブを実行します。
ジョブとは、デーモンのような常駐型の「サービス」と1回きりの処理で終了する「タスク」から成る複数のプロセスを、1つの処理単位としてグループ化したものです。
より具体的には、/etc/event.d(または /etc/init)に置かれたジョブ定義ファイルのうち、対象のイベントが引き金となっているファイルの処理が実行されます。
また、対象となるファイルが複数ある場合にはそれらの処理は並列して実行されます。(補足8 ジョブ定義ファイルの書式)
実行順序
イベント駆動型の特徴を元に、起動時の流れを整理すると以下の通りです。
1. initプロセス開始
2. 各ジョブが待機状態になる(指定されたイベントの実行を待つ)
3. システム起動イベントが発行される
4. イベントに対応したジョブが、並列で実行される。
systemd
特徴
systemdは近年登場して主流となっている仕組みです。
Upstartと同じく、各プロセス(ユニット)を並列起動する仕組みになっています。
これだけであればどちらを使っても良いように思いますが、systemdはUpstartと比べて
・より無駄を減らして高速起動を可能にしている点
・SysVinitからの移行に便利な互換モードがある点
・システム管理の共通化(異なるディストリビューションでも同様の操作が可能)
・その他多数の追加機能
これらのメリットがあることから、現在の主流となっています。
systemdでは、システム起動のための処理をUnitと言う単位で管理します。
Unitの種類は以下の通りです。
最低限、「target」と「service」について確認しておきましょう。
種類 | 意味 |
target | 複数のユニットをグループ化する時に使用する |
service | プロセスの開始・停止・自動起動といった管理を行う |
device | systemdで管理するデバイスを定義する |
mount | ファイルシステムのマウントを行う |
automount | 自動的にマウントされるマウントポイントを定義する |
socket | 特定のソケットをListen(監視)する |
swap | スワップ領域を有効にする |
path | 指定のファイルが作成されると、指定されたサービスを起動する |
timer | 対応するserviceユニットの実行を管理する。cron の代替機能。 |
実行順序
実行順序と、使用されるファイルを見てみましょう。
1. systemdプロセス開始
2. default.targetを処理(/etc/systemd/system以下)
3. リンク先のtargetを解析(/etc/systemd/system/graphical.targetなど)
4. 解析結果により、必要なサービスを起動する(依存関係順に従いながら並列に)
systemdではinitプロセスではなく、systemdプロセスが起動してサービスを管理します。
systemdプロセスが起動すると、「default.target」というUnitが起動されます。
このファイルは /etc/systemd/system以下に置かれたシンボリックリンクで、
実際には「graphical.target」等の、ランレベルに対応するファイルが実体となっています。
default.targetの対象としては以下のような種類があります。
ランレベル | ターゲット | 意味 |
0 | runlevel0.target, poweroff.target | システムをシャットダウンする |
1 | runlevel1.target, rescue.target | シングルユーザログイン |
2, 3, 4 | runlevel2.target, multi-user.target | マルチユーザログイン環境(非グラフィカル) |
5 | runlevel5.target, graphical.target | マルチユーザログイン環境(グラフィカル) |
6 | runlevel6.target, reboot.target | システムを再起動する |
以下は、default.targetとgraphical.targetの確認結果の例です。
[root@localhost ~]# ls -l /etc/systemd/system/default.target lrwxrwxrwx. 1 root root 16 3月 22 20:03 default.target -> graphical.target
この場合、「graphical.target」へのシンボリックリンクとなっています。
[root@localhost ~]# cat /etc/systemd/system/default.target [Unit] Description=Graphical Interface Documentation=man:systemd.special(7) Requires=multi-user.target Wants=display-manager.service Conflicts=rescue.service rescue.target After=multi-user.target rescue.service rescue.target display-manager.service AllowIsolate=yes
「Requires」と「Wants」では依存するUnitの設定を行っています。(補足9 RequiresとWantsの違い )
「After」では、自身よりも先に起動する(起動を待つ)Unitの一覧が設定されています。
graphical.targetがdefault.targetを介して起動時に実行されるUnitであることを踏まえると、
これら「Requires」「Wants」「After」内のサービス(およびtargetに紐づくサービス)が起動時に実行される解釈となります。
サービスの管理
SysVinitやUpstartでのコマンドは割愛しましたが、systemdは現在主流となっている仕組みですので、
サービスの管理方法と管理コマンドについても説明します。
systemdでは、systemctlコマンドを使ってサービスを管理します。
まずは以下に書式とコマンドを載せますが、その後の例と併せてご確認ください。
【書式】
systemctl コマンド [ユニット]
【コマンド】
コマンド | 説明 |
list-units | 全てのユニットとその状態を表示する。 |
start | 指定したユニットを起動する。 |
stop | 指定したユニットを停止する。 |
reload | サービスの設定ファイルを再読み込みする。 |
restart | ユニットを再起動する。 |
is-active | 指定したユニットが起動しているか確認する。 |
status | 指定したユニットの実行状況を表示する。 |
get-default | 「default.target」のリンク先を表示する。 |
set-default | 「default.target」のリンク先を設定する。 |
poweroff | システムを再起動する。 |
reboot | 「default.target」のリンク先を設定する。 |
[root@localhost ~]# systemctl is-active sshd.service active
[root@localhost ~]# systemctl status default.target ● multi-user.target - Multi-User System Loaded: loaded (/usr/lib/systemd/system/multi-user.target; enabled; vendor preset: disabled) Active: active since 木 2019-04-04 08:54:18 JST; 4h 34min ago Docs: man:systemd.special(7) 4月 04 08:54:18 localhost.localdomain systemd[1]: Reached target Multi-User System.
[root@localhost ~]# systemctl start httpd.service
[root@localhost ~]# systemctl stop httpd.service
[root@localhost ~]# systemctl enable httpd.service
[root@localhost ~]# systemctl disable httpd.service
比較的よく使いそうな例を挙げました。
この辺りのコマンドは実際によく使う可能性もありますし、Lpicの試験でも問われる可能性があるので押さえておきましょう。
まとめ
SysVinit, Upstart, systemdの特徴と実行順序を確認しておきましょう。
以下は最低限の情報を、簡単にまとめた表です。
起動プロセス | 特徴 | |
---|---|---|
SysVinit | initプロセス | /etc/inittabのプロセスを順に実行 |
Upstart | initプロセス | イベント駆動型。/etc/event.d or /etc/init にジョブ定義ファイルがある。 |
systemd | systemdプロセス | Unit単位での管理。/etc/systemd/system/default.targetが起動時のターゲット。 |
特にsystemdについては現在主流となっている方式ですので、systemctl等の管理コマンドについても確認しましょう。
それでは今回はこのあたりで。
確認問題
SysVinitの設定ファイルは以下のどれですか?
A) /etc/init
B) /etc/inittab
C) /etc/event.d
D) 設定ファイルは必要ない
SysVinit, Upstart, systemdの説明で、正しい選択肢を1つ選びなさい。
A) SysVinitはイベント駆動型で、ジョブを並列起動する
B) いずれの仕組みも、initプロセスが起動する
C) Upstartはsystemdを改良して作られた仕組みである
D) systemdはユニットという単位で、処理を管理する
systemdで、httpdサービスを起動するコマンドを1つ選びなさい。
A) service httpd start
B) service httpd enable
C) systemctl start httpd.service
D) systemctl enable httpd.service