この連載では、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