systemdの起動シーケンスのメモ。
前提
- Amazon Linux 2を使っている。
- RunLevelは 3 にしている。
- 動的生成ユニットに関しては割愛。
systemd の起動シーケンス
- systemd が起動する。
- systemd が起動すると、
/etc/systemd/system/default.target
が呼ばれる。 - default.target が呼ばれると
/etc/systemd/system/default.target
の After に記述された内容に従い、
4. ユニット basic.target が起動され
5. ユニット rescue.service が起動され
6. ユニット rescue.target が起動される。 - After で示されたユニットの起動が終わると、ディレクトリ
/etc/systemd/system/default.target.wants
下のユニットが順に呼ばれる。
解説
1. systemd が起動する
Linuxが立ち上がった時に、initスクリプトが実行されて /sbin/init
が実行される。
/sbin/init
はすでに systemd
のシンボリックリンクになっているので、結果的にはこれが読み込まれる。
$ ls -l /sbin/init
lrwxrwxrwx 1 root root 22 1月 15 03:30 /sbin/init -> ../lib/systemd/systemd
2. /etc/systemd/system/default.target
が呼ばれる
Unit の定義は2ヶ所で行われている。
ディレクトリ | 目的 |
---|---|
/etc/systemd/system/下 | 管理者がカスタマイズする内容 |
/usr/lib/systemd/system/下 | システムのデフォルト |
同じファイル名のものがあった場合には /etc/systemd/system/
のほうが優先される。
どちらのディレクトリにも defaukt.target
ディレクトリは存在するのだが、このルールのために /etc/systemd/system/default.target
のほうをsystemdは処理する。
そしてこの /etc/systemd/system/default.target
は、RunLevelに応じた実体のシンボリックになっている。RunLevelが3(Multi-Userモード)の場合は、次のようになっている。
$ ls -l /etc/systemd/system/default.target
lrwxrwxrwx 1 root root 41 2月 23 19:39 /etc/systemd/system/default.target -> /usr/lib/systemd/system/multi-user.target
結果的に、 /usr/lib/systemd/system/multi-user.target
が処理される。
3. /etc/systemd/system/default.target
の After に記述された内容に従い
[Unit]
項目では、いくつか定義を記述できます。
After は、順序関係の定義の1つで、記述された他ユニットの実行の後に実行する、という意味になる。(Beforeはその反対になる)
なお、 default.tareget
には Require、 Conflict といった定義もされている。Requireは当ユニットの実行に必須な依存関係を、Conflict は同時に実行してはならない同時実行制限を記述している。
4. basic.target が起動
実体は /usr/lib/systemd/system/basic.target
。
5. rescue.service が起動
実体は、 /usr/lib/systemd/system/rescue.service
。
6. rescue.target が起動
実体は、/usr/lib/systemd/system/rescue.target
。
7. /etc/systemd/system/default.target.wants
下のユニットが順に呼ばれる
このディレクトリの下に、default.target が起動させたいユニットのシンボリックリンクが張られている。