CentOS6まではデーモンの起動や停止などを行う際には昔ながらの/etc/rc.d/init.d/**** restartなどで行っていました。CentOS7ではこの部分が大幅に変更されています。
CentOS7ではデーモンの制御対象のことを「ユニット」と呼びます。ユニットには以下のような種類がありますが、主に使われるものはserviceです。
ユニットの種類 | 説明 |
.service | 指定のバイナリを実行する |
.socket | systemdがSocketをListenして、接続があるとプロセスに受け渡す (xinetdの代替的な機能) |
.target | 複数のユニットをまとめるために使用する |
.device | udevから通知されたデバイスを表す |
.snapshot | ある時点のユニットの状態 |
.path | 指定のファイルが生成されると指定されたサービスを起動する |
.mount | 指定のファイルシステムをマウントする |
.automount | オートマウント処理を実施する ( automountdの代替的な機能 ) |
そしてこのユニットはsystemctlコマンドで制御を行います。単純にsystemctlコマンドを実行することでアクティブなユニット一覧を取得することができます。
# systemctl UNIT LOAD ACTIVE SUB DESCRIPTION proc-sys-f...nfmt_misc.automount loaded active waiting Arbitrary Executable File Formats sys-device...0.0-net-eno2.device loaded active plugged NetXtreme II BCM5708 Gigabit Ethe sys-device...ock-sda-sda1.device loaded active plugged PERC_5_i sys-device...ock-sda-sda2.device loaded active plugged PERC_5_i sys-device...ock-sda-sda3.device loaded active plugged PERC_5_i sys-device...:0-block-sda.device loaded active plugged PERC_5_i sys-device...0.0-net-eno1.device loaded active plugged NetXtreme II BCM5708 Gigabit Ethe sys-device...:0-block-sr0.device loaded active plugged HL-DT-STCD-RW_DVD-ROM_GCC-4244N sys-device....0-block-fd0.device loaded active plugged /sys/devices/platform/floppy.0/bl sys-device...50-tty-ttyS2.device loaded active plugged /sys/devices/platform/serial8250/ sys-device...50-tty-ttyS3.device loaded active plugged /sys/devices/platform/serial8250/ sys-device...05-tty-ttyS0.device loaded active plugged /sys/devices/pnp0/00:05/tty/ttyS0 sys-device...06-tty-ttyS1.device loaded active plugged /sys/devices/pnp0/00:06/tty/ttyS1 sys-module-configfs.device loaded active plugged /sys/module/configfs sys-module-fuse.device loaded active plugged /sys/module/fuse sys-subsys...devices-eno1.device loaded active plugged NetXtreme II BCM5708 Gigabit Ethe sys-subsys...devices-eno2.device loaded active plugged NetXtreme II BCM5708 Gigabit Ethe -.mount loaded active mounted / boot.mount loaded active mounted /boot dev-hugepages.mount loaded active mounted Huge Pages File System dev-mqueue.mount loaded active mounted POSIX Message Queue File System proc-fs-nfsd.mount loaded active mounted RPC Pipe File System run-user-0-gvfs.mount loaded active mounted /run/user/0/gvfs sys-fs-fuse-connections.mount loaded active mounted FUSE Control File System sys-kernel-config.mount loaded active mounted Configuration File System sys-kernel-debug.mount loaded active mounted Debug File System var-lib-nfs-rpc_pipefs.mount loaded active mounted RPC Pipe File System brandbot.path loaded active waiting Flexible branding cups.path loaded active waiting CUPS Printer Service Spool systemd-as...sword-plymouth.path loaded active waiting Forward Password Requests to Plym systemd-ask-password-wall.path loaded active waiting Forward Password Requests to Wall session-6.scope loaded active abandoned Session 6 of user root session-679.scope loaded active running Session 679 of user root session-c3.scope loaded active running Session c3 of user gdm abrt-ccpp.service loaded active exited Install ABRT coredump hook abrt-oops.service loaded active running ABRT kernel log watcher abrtd.service loaded active running ABRT Automated Bug Reporting Tool accounts-daemon.service loaded active running Accounts Service alsa-state.service loaded active running Manage Sound Card State (restore <省略> LOAD = Reflects whether the unit definition was properly loaded. ACTIVE = The high-level unit activation state, i.e. generalization of SUB. SUB = The low-level unit activation state, values depend on unit type. 138 loaded units listed. Pass --all to see loaded but inactive units, too. To show all installed unit files use 'systemctl list-unit-files'. |
これらの出力をファイル単位で見やすく ( list-unit-files ) して、なおかつサービスに限定する ( -t service ) コマンドとその出力が以下となります。
# systemctl list-unit-files -t service UNIT FILE STATE abrt-ccpp.service enabled abrt-oops.service enabled abrt-pstoreoops.service disabled abrt-vmcore.service enabled abrt-xorg.service enabled abrtd.service enabled accounts-daemon.service enabled alsa-restore.service static alsa-state.service static alsa-store.service static anaconda-direct.service static anaconda-noshell.service static anaconda-shell@.service static anaconda-sshd.service static anaconda-tmux@.service static anaconda.service static arp-ethers.service disabled atd.service enabled auditd.service enabled autofs.service disabled autovt@.service disabled avahi-daemon.service enabled blk-availability.service disabled bluetooth.service enabled <省略> |
enableとなっているところは自動起動が有効、disabledとなっているのとは自動起動が無効という意味です。staticは他のユニットに依存するもので、これ単体で有効/無効が設定できないものです。これらユニットファイルの実体は以下のディレクトリに保存されています。
ディレクトリ名 | 説明 |
/etc/systemd/system | ここに同名のファイル(/usr/libのシンボリックリンク)を配置することにより優先される。 |
/usr/lib/systemd/system | RPMから直接ファイルが提供される場所であり、システムのデフォルト設定 |
# ls /etc/systemd/system/*.wants /etc/systemd/system/basic.target.wants: firewalld.service microcode.service /etc/systemd/system/bluetooth.target.wants: bluetooth.service /etc/systemd/system/default.target.wants: systemd-readahead-collect.service systemd-readahead-replay.service /etc/systemd/system/getty.target.wants: getty@tty1.service /etc/systemd/system/graphical.target.wants: accounts-daemon.service firstboot-graphical.service rtkit-daemon.service /etc/systemd/system/multi-user.target.wants: ModemManager.service auditd.service ksm.service rngd.service NetworkManager.service avahi-daemon.service ksmtuned.service rpcbind.service abrt-ccpp.service chronyd.service libstoragemgmt.service rsyslog.service abrt-oops.service crond.service libvirtd.service smartd.service abrt-vmcore.service cups.path mdmonitor.service sshd.service abrt-xorg.service hypervkvpd.service nfs.target sysstat.service abrtd.service hypervvssd.service postfix.service tuned.service atd.service irqbalance.service remote-fs.target vmtoolsd.service <省略> |
上記ファイルはシンボリックリンクであり、実ファイルは/usr/lib/systemd/system以下のものにリンクされています。但し、優先されるのは/etc側となります。
# ls /usr/lib/systemd/system -.slice ntpdate.service ModemManager.service numad.service NetworkManager-dispatcher.service oddjobd.service NetworkManager-wait-online.service packagekit-offline-update.service NetworkManager.service paths.target abrt-ccpp.service plymouth-halt.service abrt-oops.service plymouth-kexec.service abrt-pstoreoops.service plymouth-poweroff.service abrt-vmcore.service plymouth-quit-wait.service abrt-xorg.service plymouth-quit.service abrtd.service plymouth-read-write.service accounts-daemon.service plymouth-reboot.service alsa-restore.service plymouth-start.service alsa-state.service plymouth-switch-root.service alsa-store.service polkit.service anaconda-direct.service postfix.service <省略> |
■systemctlコマンドの使い方
ユニット名のところはタブキーで自動補完することが可能です。
・ユニットの起動停止
※起動 systemctl start <unit> ※停止 systemctl stop <unit> ※再起動 systemctl restart <unit> |
・ユニットの自動起動の設定
※自動起動の有効化 systemctl enable <unit> ※自動起動の無効化 systemctl disable <unit> ※強制終了 systemctl kill -s 9 <unit> ※どのターゲットで有効にするか /usr/lib/systemd/system以下の各ファイルの中で以下の部分に注目 WantedBy=multi-user.target multi-user.targetはランレベル3、graphical.targetはランレベル5となる 但し、multi-user.targetを指定すれば自動的にguraphical.targetも有効となる<unit></unit> |
・ユニット状態の表示
※指定したユニットの状態表示 systemctl status <unit> ※アクティブになっているユニット一覧 systemctl ※全てのユニット一覧 systemctl -a ※指定したタイプのユニットのみ表示 systemctl -t <unit_type> ユニットタイプは冒頭で記載したもの<unit></unit> |
・ユニットのその他の情報
※ユニットの一覧表示 systemctl list-unit-files ※指定したユニットの設定表示 systemctl show <unit> ※指定したユニットが稼働中か否か systemctl is-active <unit> ※指定したユニットが有効か否か systemctl is-enabled <unit><unit></unit> |
・ログの参照方法
CentOS6までは/var/log/messageあたりを参照・検索というのが一般的ですが、systemdからはそれ専用のコマンドが用意されています。
※特定サービスのログを参照 journalctl -u <unit> ※特定サービスのログをリアルタイムに参照 journalctl -f -u <unit> ※dmesgの代わり journalctl -k または journalctl --dmesg<unit></unit> |
初期導入当初は不要なサービスが多々たちあがっているため、私の場合は以下のコマンドを実施して不要なサービスは停止するよう設定致しました。
systemctl disable abrt-ccpp.service systemctl disable abrt-oops.service systemctl disable abrt-vmcore.service systemctl disable abrt-xorg.service systemctl disable abrtd.service systemctl disable atd.service systemctl disable dbus-org.freedesktop.nm-dispatcher.service systemctl disable auditd.service systemctl disable avahi-daemon.service systemctl disable bluetooth.service systemctl disable accounts-daemon.service systemctl disable avahi-daemon.service systemctl disable dbus-org.freedesktop.ModemManager1.service systemctl disable dmraid-activation.service systemctl disable display-manager.service systemctl disable netcf-transaction.service systemctl disable firstboot-graphical.service systemctl disable fprintd.service systemctl disable gdm.service systemctl disable nfs nfs-server systemctl disable hypervkvpd.service systemctl disable hypervvssd.service systemctl disable irqbalance.service systemctl disable iscsi.service systemctl disable ksm.service systemctl disable ksmtuned.service systemctl disable libstoragemgmt.service systemctl disable libvirtd.service systemctl disable lvm2-monitor.service systemctl disable mdmonitor.service systemctl disable microcode.service systemctl disable ModemManager.service systemctl disable multipathd.service systemctl disable nfs-lock.service systemctl disable packagekit-offline-update.service systemctl disable postfix.service systemctl disable rngd.service systemctl disable rpcbind.service systemctl disable rtkit-daemon.service systemctl disable smartd.service systemctl disable spice-vdagentd.service systemctl disable sysstat.service systemctl disable systemd-readahead-collect.service systemctl disable systemd-readahead-drop.service systemctl disable systemd-readahead-replay.service systemctl disable tuned.service systemctl disable vmtoolsd.service systemctl disable cups.service systemctl disable rpc-statd.service systemctl disable firewalld |
導入当初、NetworkManagerも合わせて停止するよう設定していたのですが、これを停止するとGatewayが消えてしまい、自身が属するセグメント外に出れなくなり、原因究明に時間を要しました。他に回避策があるかもしれませんがNetworkManagerは稼働させておいたほうが良いようです。