systemd の概要
systemd を採用したプロセスでは init プロセスの代わりに systemd プロセスが起動し、各種サービスを管理する。
systemd では以下のような複数のデーモンプロセスが連携して動作する。
| プロセス | 説明 |
|---|---|
| systemd | systemd のメインプロセス |
| systemd-journald | ジャーナル管理プロセス |
| systemd-logind | ログイン処理プロセス |
| systemd-udevd | デバイス動的検知プロセス |
systemd では、システムの起動処理は多数の Unit と呼ばれる処理単位に分かれており、サービスを起動する Unit や、ファイルシステムをマウントする Unit などがある。
| Unit の種類 | 説明 |
|---|---|
| service | 各種サービスを起動する |
| device | 各種デバイスを表す |
| mount | ファイルシステムをマウントする |
| swap | スワップ領域を有効にする |
| target | 複数の Unit をグループ化する |
systemd では、サービス A を起動するには先にサービス B を起動する、といった各種サービスの依存関係や順序関係を処理できる。
systemd の起動手順
システムが起動すると、まず default.target という Unit が処理される。この Unit の設定ファイルは /etc/systemd/system 以下に存在する。
$ ls -l /etc/systemd/system/default.target
lrwxrwxrwx. 1 root root 37 Mar 23 17:51 /etc/systemd/system/default.target -> /lib/systemd/system/multi-user.target multi-user.target はマルチユーザーモードで起動するサービスをまとめた Unit (ターゲット) である。default.target を multi-user.target のシンボリックリンクとすることにより、従来のデフォルトランレベルのような機能を実現している。
このように、ターベットが従来のランレベルに相当する。
| ランレベル | ターゲット |
|---|---|
| 0 | poweroff.target |
| 1 | rescue.target |
| 2,3,4 | multi-user.target |
| 5 | graphical.target |
| 6 | reboot.target |
なお、graphical.target にランレベル 5 で必要だったすべてのサービスが含まれているわけではない。
graphical.target にはマルチユーザー環境で必要なサービスを起動する multi-user.target が、multi-user.target にはランレベルにかかわらず必要なサービスを起動する basic.target という Unit が紐づけられている。
したがって、graphical.target を起動すると、グラフィカル環境に必要なすべてのサービスが起動することになる。
systemctl によるサービスの管理
systemd でサービスを管理するには systemctl コマンドを用いる。
| ランレベル | ターゲット |
|---|---|
| start | サービスを起動する |
| stop | サービスを終了する |
| restart | サービスを再起動する |
| reload | サービスの設定を再読み込みする |
| status | サービスの稼働状況を表示する |
| is-active | サービスが稼働しているかどうかを確認する |
| enable | システム起動時にサービスを自動起動する |
| disable | システム起動時にサービスを自動起動しない |
| list-unit-files | すべての Unit を表示する |
| reboot | システムを再起動する |
| poweroff | システムをシャットダウンする |
- コマンド実行例
$ sudo systemctl status cloud-config.service
● cloud-config.service - Apply the settings specified in cloud-config
Loaded: loaded (/usr/lib/systemd/system/cloud-config.service; enabled; vendor preset: disabled)
Active: active (exited) since Wed 2018-05-09 01:44:45 UTC; 23min ago
Main PID: 1175 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/cloud-config.service
May 09 01:44:44 ip-172-31-23-74.ap-northeast-1.compute.internal systemd[1]: Starting Apply the settings specified in cloud-config...
May 09 01:44:45 ip-172-31-23-74.ap-northeast-1.compute.internal cloud-init[1175]: Cloud-init v. 0.7.9 running 'modules:config' at Wed, 09 May 2018 01:44:45 +0000. Up 10.01 seconds.
May 09 01:44:45 ip-172-31-23-74.ap-northeast-1.compute.internal systemd[1]: Started Apply the settings specified in cloud-config. $ sudo systemctl list-unit-files | head
UNIT FILE STATE
proc-sys-fs-binfmt_misc.automount static
dev-hugepages.mount static
dev-mqueue.mount static
proc-sys-fs-binfmt_misc.mount static
sys-fs-fuse-connections.mount static
sys-kernel-config.mount static
sys-kernel-debug.mount static
tmp.mount disabled
brandbot.path enabled $ sudo systemctl enable tmp.mount
Created symlink from /etc/systemd/system/local-fs.target.wants/tmp.mount to /usr/lib/systemd/system/tmp.mount. 上記の例をみると、/etc/systemd/system 以下のファイルが操作されていることがわかる。
/etc/systemd/system ではホストごとに修正された Unit の設定ファイルが配置される。また、オリジナルの設定ファイルは /usr/lib/systemd/system または /lib/systemd/system に配置されている。
/etc/systemd/system/multi-user.target.wants 以下には multi-user.target に含まれる Unit を確認可能。
$ ls /etc/systemd/system/multi-user.target.wants/
auditd.service chronyd.service cloud-final.service cloud-init.service irqbalance.service NetworkManager.service remote-fs.target rsyslog.service tuned.service
brandbot.path cloud-config.service cloud-init-local.service crond.service kdump.service postfix.service rhel-configure.service sshd.service