systemd

May 09, 2018

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  

 © 2023, Dealing with Ambiguity