ガラリと変わったCentOS 7 4

systemdの仕組み

systemdの仕組み

CentOS6系では、chkconfigコマンドによるサービスの有効化、無効化の切り替え、/etc/init.dディレクトリ配下のスクリプトに対してstart/stop/status等のパラメータを与えることで、様々なサービスの制御を行っていました。CentOS7においては、サービスの制御をsystemdによって行います。具体的には、管理者は、systemctlコマンドを使ってサービスの起動、停止、状態確認等を行います。CentOS 6までは、デーモンと起動スクリプトの集合体でサービスを管理していましたが、CentOS 7のsystemdでは、「ユニット」と呼ばれる単位で管理を行います。CentOS 5のSysVinitやCentOS 6のUpstartにおける起動スクリプトを使った処理が、CentOS 7では、複数の「ユニット」に分割されて、並列実行を行うことにより、OSの起動速度の高速化を実現しています。また、従来のデーモンと複雑な起動スクリプトの集合体では、スクリプトの記述がサービス毎に異なっており、管理が複雑化していましたが、systemdにより記述が標準化されており、複雑なスクリプト群をできるだけ排除する設計が見られます。systemdの管理の単位となるユニットには、以下に示す幾つかのタイプが存在します。

service 各種デーモンやサービスの起動
target 従来のランレベルに相当する起動プロセスをまとめたユニット群の処理に使用
mount ファイルシステムのマウントポイント制御
device ディスクデバイス
socket FIFO、UNIXドメインソケット、ポート番号等に関する通信資源

「service」は、OSの各種デーモンやサービスの起動に関連するユニットです。例えば、メールサービスで有名なpostfixであれば、「postfix.service」として管理されており、postfixサービスの制御に関わる設定ファイルは、/usr/lib/systemd/system/postfix.serviceです。

登録されているサービスのOS起動時における自動起動の有効化または無効化の設定状態を表示するには、ユニットの種類としては「service」を指定し、list-unit-filesを指定します。

# systemctl -t service list-unit-files
UNIT FILE                                   STATE
abrt-ccpp.service                           enabled
abrt-oops.service                           enabled
...
...
vsftpd.service                              disabled
vsftpd@.service                             disabled
wacom-inputattach@.service                  static
wpa_supplicant.service                      disabled
xinetd.service                              enabled

253 unit files listed.

CentOS 7.0の時点では、全てのサービスがsystemdに移行している訳ではなく、旧来のCentOS 6系で使われていた/etc/init.dディレクトリ配下のサービス群が残っています。これらの一部のサービスについては、chkconfigコマンドを使ってサービスの有効化・無効化の設定を行って下さい。

以下では、例として、FTPサービスの起動、停止、状態確認、OS起動時の自動起動の有効化・無効化の設定を行ってみます。まずFTPサービスが、systemdのユニットにおいてどのような名前のサービスとして登録されているのかを確認します。

# systemctl -t service list-unit-files |grep -i ftp
tftp.service                                static
vsftpd.service                              disabled
vsftpd@.service                             disabled

FTPサーバーを実現するサービスは、「vsftpd.service」です。「vsftpd.service」の右側を見ると「disabled」と表示されていあす。これは、OS起動時に、「vsftpd.service」が自動的に起動しない設定になっていることを意味します。サービスの状態確認は、systemctlコマンドに「status」を指定します。また、systemctlコマンドの利用においては、サービス名の「.service」を省略することができます。

# systemctl status vsftpd
vsftpd.service - Vsftpd ftp daemon
   Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled)
   Active: inactive (dead)

上記の「Active:」の項目を見ると「inactive(dead)」と表示されていることから、vsftpdサービスは現在起動していないことがわかります。vsftpdサービスを起動してみます。

# systemctl start vsftpd
# systemctl status vsftpd
vsftpd.service - Vsftpd ftp daemon
   Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled)
   Active: active (running) since Sun 2014-09-07 00:39:03 JST; 3s ago
  Process: 19159 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=0/SUCCESS)
 Main PID: 19160 (vsftpd)
   CGroup: /system.slice/vsftpd.service
           `-19160 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

Sep 07 00:39:03 centos70n01.jpn.linux.hp.com systemd[1]: Starting Vsftpd ftp d...
Sep 07 00:39:03 centos70n01.jpn.linux.hp.com systemd[1]: Started Vsftpd ftp da...
Hint: Some lines were ellipsized, use -l to show in full.

上記の「Active: active」及びプロセスが正常起動している旨の出力から、vsftpdサービスが正常に起動していることがわかります。vsftpdサービスを停止してみます。

# systemctl stop vsftpd
# systemctl status vsftpd

OSが起動した時に、vsftpdサービスが自動的に起動するように設定します。

# systemctl enable vsftpd
ln -s '/usr/lib/systemd/system/vsftpd.service'
'/etc/systemd/system/multi-user.target.wants/vsftpd.service'

OSが起動した時に、vsftpdサービスが自動的に起動するように設定されているかを確認します。

# systemctl -t service is-enabled vsftpd
enabled

以下に、CentOS 6系のSysVinitのコマンドと、CentOS 7で採用されているsystemdのコマンドの対応関係を表にまとめておきますので、参考にして下さい。

図3:CentOS 6系のserviceコマンドやchkconfigコマンドとCentOS 7のsystemdの対応関係(クリックで拡大)

ユニットの依存関係

systemdが管理するユニットには、依存関係が存在します。ユニットの依存関係は、あるユニットを有効にするために、他のユニットも有効にしないとうまく稼働しない場合、それらの複数のユニット間に依存関係があると判断します。ユニットに依存関係がない場合、それらのユニットは、個別に同時並列的に起動されることになり、CentOS 7のOS起動の高速化に貢献します。ユニットの依存関係は、CentOS 7で定義されているターゲットの設定ファイルの中身を見ると理解が深まります。例えば、graphical.targetファイルの中身を確認します。

# cd /usr/lib/systemd/system
# cat graphical.target
...
Requires=multi-user.target
...
Wants=display-manager.service
...

上記の「Requires=multi-user.target」は、graphical.targetを起動するためには、multi-user.targetが必要であるという依存関係を示しています。さらに、「Wants=display-manager.service」も依存関係を示しています。従来のランレベル5に相当するgraphical.targetは、従来のランレベル3に相当するmulti-user.targetに依存していることになります。同様にmulti-user.targetの中身も確認してみます。

# pwd
/usr/lib/systemd/system
# cat multi-user.target
...
Requires=basic.target
...

上記のとおり、multi-user.targetは、basic.targetに依存していることがわかります。このbasic.targetは、ランレベルに依存しないで起動するサービスに相当します。さらにbasic.targetの中身を確認してみます。

# cat basic.target
...
Requires=sysinit.target
Wants=sockets.target timers.target paths.target slices.target
...

上記より、basic.targetは、sysinit.target、sockets.target、timers.target、paths.target、そして、slices.targeに依存していることがわかります。sysinit.targetは、従来のCentOS 6におけるrc.sysinitの処理に相当するターゲットです。最後にsysinit.targetの中身を確認してみます。

# cat sysinit.target
...
Wants=local-fs.target swap.target
...

上記より、sysinit.targetは、local-fs.targetとswap.targetに依存していることがわかります。すなわち、sysinit.targetの処理を行うには、ファイルシステムのマウントとスワップ領域の有効化の処理が前提となっていることがわかります。

ユニットの起動順序

ユニットには、依存関係の他に、起動順序の概念が存在します。例を見ながら解説します。今度は、サービスについての起動順序を確認します。例として、sshdサービスをあげます。sshdサービスの起動に関する設定ファイルは、/usr/lib/systemd/system/sshd.serviceです。中身を確認します。

# pwd
/usr/lib/systemd/system

# cat sshd.service
...
After=syslog.target network.target auditd.service
...

上記設定ファイルに「After=syslog.target network.target auditd.service」と記述されています。これは、syslog.target、network.target、auditd.serviceの後にsshd.serviceが起動することを意味します。ここで、network.targetが指定されていることに注目します。起動順序において、ターゲットが指定されている場合は、そのターゲットの前後の起動順序において、一つ前のサービスの起動が完了してから、次のサービスの起動が開始することを保証することができます。上記の場合は、network.targetの後に、sshd.serviceが起動しますが、newtork.targetの前に起動するサービスを確認してみます。

# pwd
/usr/lib/systemd/system

# grep Before=network.target ./*.service
./NetworkManager-wait-online.service:Before=network.target network-online.target
./NetworkManager.service:Before=network.target network.service
./arp-ethers.service:Before=network.target
./firewalld.service:Before=network.target
./netcf-transaction.service:Before=network.target
./wpa_supplicant.service:Before=network.target

上記では、サービスの設定ファイルに、「Before=network.target」を指定しているものを抽出しています。上記のNetworkManager.serviceは、「Before=network.target」が指定されていますので、network.targetの前に起動することになります。すなわち、先述のsshd.serviceとNetworkManager.serviceの間には、network.targetが介在しており、NetworkManager.serviceの構成が終了してから、sshd.serviceが起動することが保証されることになります。続いて、上記のauditd.serviceの起動順序も確認してみます。

# pwd
/usr/lib/systemd/system

# cat auditd.service
...
After=local-fs.target
...
Before=sysinit.target shutdown.target
...

上記より、auditd.serviceは、loca-fs.targetの後に起動する順序を持っていることがわかります。また、「Before=sysinit.target shutdown.target」の設定により、audit.serviceがsysinit.targetと shutdown.targetの前に起動することがわかります。このように、systemdは、依存関係や起動順序を設定ファイルに記述することで実現していることがわかります。CentOS 7では、systemdのデフォルトの設定ファイル群が、/usr/lib/systemd/system配下に格納されています。もし独自のルールを設定したい場合は、/etc/systemd/systemディレクトリ配下に設定ファイルとして記述します。/usr/lib/systemd/systemディレクトリ以下と/etc/systemd/systemディレクトリ以下に同じファイル名で存在する場合は、/etc/systemd/systemディレクトリ配下の設定ファイルが優先されます。実行時に一時的に作成されるようなランタイムデータは、/run/systemdディレクトリ配下に生成されます。

この記事のキーワード

この記事をシェアしてください

人気記事トップ10

人気記事ランキングをもっと見る