めもめも

このブログに記載の内容は個人の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

Systemd入門(2) - Serviceの操作方法

この連載では、Fedora 17での実装をベースとして、systemdの考え方や仕組み、利用方法を説明します。今後出てくる予定のRHEL7での実装とは異なる部分があるかも知れませんが、その点はご了承ください。

前回は、systemdの基本概念となるUnitの説明をしました。今回は、日々のオペレーションで必要となる、serviceの操作方法をまとめます。旧来のchkconfigコマンド、serviceコマンドに相当する部分ですね。

サービスの確認

現在稼働中のサービス一覧
# systemctl list-units --type=service
UNIT                       LOAD   ACTIVE SUB     JOB DESCRIPTION
auditd.service             loaded active running     Security Auditing Service
crond.service              loaded active running     Command Scheduler
dbus.service               loaded active running     D-Bus System Message Bus
fedora-readonly.service    loaded active exited      Configure read-only root su
fedora-s...it-late.service loaded active exited      Initialize storage subsyste
fedora-s...ge-init.service loaded active exited      Initialize storage subsyste
fedora-w...storage.service loaded active exited      Wait for storage scan
getty@tty1.service         loaded active running     Getty on tty1
ip6tables.service          loaded active exited      IPv6 firewall with ip6table
iptables.service           loaded active exited      IPv4 firewall with iptables
lvm2-monitor.service       loaded active exited      Monitoring of LVM2 mirrors,
NetworkManager.service     loaded active running     Network Manager
rsyslog.service            loaded active running     System Logging Service
sendmail.service           loaded active running     Sendmail Mail Transport Age
sm-client.service          loaded active running     Sendmail Mail Transport Cli
sshd.service               loaded active running     OpenSSH server daemon
systemd-journald.service   loaded active running     Journal Service
systemd-logind.service     loaded active running     Login Service
systemd-remount-fs.service loaded active exited      Remount Root and Kernel Fil
systemd-sysctl.service     loaded active exited      Apply Kernel Variables
systemd-...s-setup.service loaded active exited      Recreate Volatile Files and
systemd-...essions.service loaded active exited      Permit User Sessions
systemd-...e-setup.service loaded active exited      Setup Virtual Console
udev-settle.service        loaded active exited      udev Wait for Complete Devi
udev-trigger.service       loaded active exited      udev Coldplug all Devices
udev.service               loaded active running     udev Kernel Device Manager

「running/exited」の意味は前回の記事を参照ください。実際に実行するとわかるように、systemctlコマンドで一覧表示すると、自動でlessコマンドにパイプされます。これが不要な場合は、「--no-pager」オプションを付けるか、catコマンドにパイプしてください。

定義されているサービスの一覧
# systemctl list-unit-files --type=service
UNIT FILE                                   STATE   
arp-ethers.service                          enabled 
auditd.service                              enabled 
autovt@.service                             disabled
console-getty.service                       disabled
console-shell.service                       disabled
crond.service                               enabled 
dbus-org.freedesktop.hostname1.service      static  
dbus-org.freedesktop.locale1.service        static  
dbus-org.freedesktop.login1.service         static  
dbus-org.freedesktop.NetworkManager.service enabled 
dbus-org.freedesktop.timedate1.service      static  
dbus.service                                static  
debug-shell.service                         disabled
display-manager.service                     static  
dm-event.service                            disabled
dnsmasq.service                             disabled
dracut-shutdown.service                     static  
emergency.service                           static  
fedora-autorelabel-mark.service             static  
fedora-autorelabel.service                  static  
fedora-configure.service                    static  
fedora-import-state.service                 static  
fedora-loadmodules.service                  static  
fedora-readonly.service                     static  
fedora-storage-init-late.service            static  
fedora-storage-init.service                 static  
fedora-wait-storage.service                 static  
fsck-root.service                           static  
fsck@.service                               static  
getty@.service                              enabled 
halt-local.service                          static  
halt.service                                static  
hibernate.service                           static  
ip6tables.service                           enabled 
iptables.service                            enabled 
kexec.service                               static  
lvm2-monitor.service                        enabled 
messagebus.service                          static  
NetworkManager-wait-online.service          disabled
NetworkManager.service                      enabled 
plymouth-halt.service                       static  
plymouth-kexec.service                      static  
plymouth-poweroff.service                   static  
plymouth-quit-wait.service                  static  
plymouth-quit.service                       static  
plymouth-read-write.service                 static  
plymouth-reboot.service                     static  
plymouth-start.service                      static  
poweroff.service                            static  
prefdm.service                              static  
quotacheck.service                          static  
quotaon.service                             static  
rc-local.service                            static  
rdisc.service                               disabled
reboot.service                              static  
rescue.service                              static  
rsyslog.service                             enabled 
saslauthd.service                           disabled
sendmail.service                            enabled 
serial-getty@.service                       static  
single.service                              static  
sm-client.service                           enabled 
sshd.service                                disabled
suspend.service                             static  
syslog.service                              enabled 
systemd-ask-password-console.service        static  
systemd-ask-password-plymouth.service       static  
systemd-ask-password-wall.service           static  
systemd-binfmt.service                      static  
systemd-debug-shell.service                 disabled
systemd-hostnamed.service                   static  
systemd-initctl.service                     static  
systemd-journald.service                    static  
systemd-localed.service                     static  
systemd-logind.service                      static  
systemd-modules-load.service                static  
systemd-random-seed-load.service            static  
systemd-random-seed-save.service            static  
systemd-readahead-collect.service           enabled 
systemd-readahead-done.service              static  
systemd-readahead-replay.service            enabled 
systemd-remount-fs.service                  static  
systemd-shutdownd.service                   static  
systemd-sysctl.service                      static  
systemd-timedated.service                   static  
systemd-tmpfiles-clean.service              static  
systemd-tmpfiles-setup.service              static  
systemd-update-utmp-runlevel.service        static  
systemd-update-utmp-shutdown.service        static  
systemd-user-sessions.service               static  
systemd-vconsole-setup.service              static  
udev-settle.service                         disabled
udev-trigger.service                        static  
udev.service                                static  
user@.service                               static  
wpa_supplicant.service                      disabled

「enabled/disabled/static」の意味は前回の記事を参照ください。「staticには興味ない!」という場合はgrepでフィルタしてください。

# systemctl list-unit-files --type=service | grep -Ev 'static\s+$'
UNIT FILE                                   STATE   
arp-ethers.service                          enabled 
auditd.service                              enabled 
autovt@.service                             disabled
console-getty.service                       disabled
console-shell.service                       disabled
crond.service                               enabled 
dbus-org.freedesktop.NetworkManager.service enabled 
debug-shell.service                         disabled
dm-event.service                            disabled
dnsmasq.service                             disabled
getty@.service                              enabled 
ip6tables.service                           enabled 
iptables.service                            enabled 
lvm2-monitor.service                        enabled 
NetworkManager-wait-online.service          disabled
NetworkManager.service                      enabled 
rdisc.service                               disabled
rsyslog.service                             enabled 
saslauthd.service                           disabled
sendmail.service                            enabled 
sm-client.service                           enabled 
sshd.service                                disabled
syslog.service                              enabled 
systemd-debug-shell.service                 disabled
systemd-readahead-collect.service           enabled 
systemd-readahead-replay.service            enabled 
udev-settle.service                         disabled
wpa_supplicant.service                      disabled
サーバ起動時の自動起動の有効化/無効化
# systemctl disable sshd
rm '/etc/systemd/system/multi-user.target.wants/sshd.service'

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

無効化/有効化に合わせてrm/lnが実行される理由は、前回の記事を参照ください。

参考資料
systemd for Administrators, Part V - The Three Levels of "Off":サービスの有効化・無効化に関するまとめ

現在のサービスの状態の確認
# systemctl status sshd.service
sshd.service - OpenSSH server daemon
	  Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled)
	  Active: active (running) since Sun, 15 Sep 2013 11:26:52 +0900; 19s ago
	 Process: 476 ExecStartPre=/usr/sbin/sshd-keygen (code=exited, status=0/SUCCESS)
	Main PID: 493 (sshd)
	  CGroup: name=systemd:/system/sshd.service
		  └ 493 /usr/sbin/sshd -D

Sep 15 11:26:53 fedora17 sshd[493]: Server listening on 0.0.0.0 port 22.
Sep 15 11:26:53 fedora17 sshd[493]: Server listening on :: port 22.
Sep 15 11:27:00 fedora17 unix_chkpwd[548]: password check failed for user (root)
Sep 15 11:27:00 fedora17 sshd[546]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost...er=root
Sep 15 11:27:00 fedora17 sshd[546]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"
Sep 15 11:27:02 fedora17 sshd[546]: Failed password for root from 192.168.122.1 port 47931 ssh2
Sep 15 11:27:03 fedora17 sshd[549]: Accepted password for root from 192.168.122.1 port 47932 ssh2
Sep 15 11:27:07 fedora17 sshd[546]: Accepted password for root from 192.168.122.1 port 47931 ssh2

出力の意味はほぼ自明かと思います。最後に該当サービスの直近のシステムログが表示されています。rsyslogに送られるメッセージは、systemd-journaldというデーモンが監視しており、すべてsystemd独自のログ(ジャーナル)にも保存されています。ここで表示されるログは、ジャーナルから取り出しているため、実際のログの出力ファイルに関わらずすべてのログがここで確認できます。上記のコマンドに-fオプションをつけると、「tail -f」と同じように新たなログが追記されるのを監視することもできます。

なお、systemd-journaldがrsyslogに送られるメッセージを監視する仕組みは、次のようになります。通常、rsyslogdは、Unixソケット「/dev/log」から送られてきたメッセージを取り出して処理しますが、systemdの環境では、rsyslogdではなく、systemd-journaldが/dev/logからメッセージを取り出してジャーナルに記録します。その後、同じメッセージをUnixソケット「/run/systemd/journal/syslog」に転送します。rsyslogdはこちらのソケットからメッセージを取り出して処理を行います。Fedora 17に同梱のrsyslogdでは、次の設定ファイルで、こちらからメッセージを取り出すように設定されています。

# cat /etc/rsyslog.d/listen.conf
$SystemLogSocketName /run/systemd/journal/syslog

それぞれのソケットをOpenしているプロセスを確認すると、次のようになっています。

# lsof /dev/log
COMMAND   PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
systemd     1 root   29u  unix 0xffff88001d1b9d40      0t0 7761 /dev/log
systemd-j 279 root    5u  unix 0xffff88001d1b9d40      0t0 7761 /dev/log

# lsof /run/systemd/journal/syslog 
COMMAND  PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
systemd    1 root   18u  unix 0xffff88001d1b89c0      0t0 7706 /run/systemd/journal/syslog
rsyslogd 409 root    3u  unix 0xffff88001d1b89c0      0t0 7706 /run/systemd/journal/syslog

また、ジャーナルの内容をまとめて確認するには、journalctlコマンドを使用します。オプション指定により、特定条件のログを取り出したり、syslogには無いさまざまな付加情報を表示することも可能です。詳細は、下記の参考資料を参照してください。

参考資料
systemd for Administrators, Part XVII - Using the Journal:journalctlコマンドのさまざまなオプションの解説
systemd v38 released:/dev/logの扱いの変更に関するアナウンス

serviceの再起動と設定の再読み込み

serviceを再起動(停止してすぐに起動)する際は、restartオプションを使用します。

# systemctl restart sshd.service

該当デーモンの設定ファイル(sshdであれば、/etc/ssh/sshd_configなど)を変更した際に、デーモンを止めずに変更を反映させるには、reloadオプションが使えます。

# systemctl reload sshd.service

ただし、これは、該当のserviceがreloadオプションに対応している必要があります。sshd.serviceの場合は、次のように設定ファイル内の[Service]セクションにおいて、start/reloadの際に実行されるコマンドが指定されています(「ExecStart=」、および「ExecReload=」オプション)。

# cat /usr/lib/systemd/system/sshd.service 
[Unit]
Description=OpenSSH server daemon
After=syslog.target network.target auditd.service

[Service]
EnvironmentFile=/etc/sysconfig/sshd
ExecStartPre=/usr/sbin/sshd-keygen
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

「ExecReload=」オプションの指定のないサービスの場合、reloadオプションはエラーになります。

# systemctl reload chronyd
Failed to issue method call: Job type reload is not applicable for unit chronyd.service.

なお、/etc/systemd/system/以下の「systemdとしてのservice設定ファイル」を変更した場合、この変更をsystemdに反映させるには、次のdaemon-reloadオプションを使用します。

# systemctl daemon-reload
chkconfig/serviceコマンドとの共存

/etc/init.d/以下に旧来のサービススクリプトがある場合、そちらをchkconfig/serviceコマンドで操作することも可能です。Fedora 17では、次のサービスはsystemdに移行せずに残っています。

# chkconfig --list

注記: この出力は SysV サービスのみであり、ネイティブな systemd のサービスは含まれていません。
      systemd services. SysV 設定のデータはネイティブな systemd の設定によって上書きされます。
netconsole     	0:off	1:off	2:off	3:off	4:off	5:off	6:off
network        	0:off	1:off	2:off	3:off	4:off	5:off	6:off

systemdの環境では、ネットワーク設定はNetworkManagerサービスで管理するようになっているため、旧来の「network」サービスは不要なのですが、NetworkManagerサービスをどうしても使いたくないという場合のために残っているものと思われます。(RHEL6では、NetworkManager経由ではBondingが組めないなどの制限があるため、NetworkManagerサービスは使用しない方が普通でしたが、RHEL7では、そのような制限はなくなる予定です。systemd環境では、NetworkManagerサービスの利用が前提となるので、RHEL7では、NetworkManagerを利用してください。)

厳密には、RHEL6でも、RHEL6.4以降では、NetworkManager経由でのBonding/Bridgeの構成ができるようになっています。詳細は、「6.155.1. RHBA-2013:0429 ― NetworkManager bug fix and enhancement update」を参照ください。

一方、/etc/init.d/以下にスクリプトがないサービスに対して、chkconfig/serviceコマンドを実行した場合は、自動的に対応するsystemctlコマンドが発行されます。

# chkconfig sshd off
情報:'systemctl disable sshd.service'へ転送しています。
rm '/etc/systemd/system/multi-user.target.wants/sshd.service'

# chkconfig sshd on
情報:'systemctl enable sshd.service'へ転送しています。
ln -s '/usr/lib/systemd/system/sshd.service' '/etc/systemd/system/multi-user.target.wants/sshd.service'

# service sshd stop
Redirecting to /bin/systemctl stop  sshd.service

# service sshd start
Redirecting to /bin/systemctl start  sshd.service