Linuxでは、クライアントからの要求に応えるサーバー機能を、それぞれデーモンプログラムによって提供しています。こうしたサーバー機能を「サービス」と呼びます。Webサーバーやメールサーバー、DNSサーバーなどはすべてサービスです。

サービスを起動し管理する仕組みとして、Linuxではinitデーモンというプログラムが動いています。Linuxでは古くからSysVinitがinitデーモンとして使われてきました。また、CentOS 6やRHEL6ではUpstartが採用されました。
このinitデーモンが、CentOS 7、RHEL 7からは「systemd」に変更されました。これが6から7への変更の中で一番大きい変更といえます。

systemdでは、サービスなどの管理対象を「Unit(ユニット)」として管理しています。systemdは、ユーザーやシステムが起こしたイベントに基づいてUnitを実行する、イベント駆動型となっています。また、各Unitには、そのUnitを実行するために必要なUnitが依存関係として定義されています。

Unitはいくつかの種類がありますが、サービスの起動と停止をするUnitは、サービスユニット(*.service)と呼ばれます。サービスユニットの定義ファイルは「/usr/lib/systemd/system」ディレクトリに格納されています。
Unit単位で管理することで、必要に応じて必要なサービスを起動する、賢いシステムを実現しています。また、依存関係のないサービスの起動などを並列化し、システムの初期化と起動を格段に高速化しました。

systemdとは

CentOS 7では、上述のとおり、サービスの起動や終了にsystemdというソフトウェアを利用しています。
systemdは、OS起動時に必要なサービスを起動したり、サービスの状態を監視したりしています。OSのシャットダウンの時もsystemdがサービスを停止します。

systemdは、サービス同士に依存関係や起動の順序がある場合にはその順序を守りつつ、高速に処理が進むように制御しています。

systemctlコマンドで操作

systemdの操作には、systemctlというコマンドを使います。systemctlからは、インストールされているサービスの一覧表示や、サービスの起動と終了、起動状態の確認、自動起動の設定などが行えます。
systemdのunitファイルの構造は比較的複雑ですが、ほとんどの場合は直接unitファイルを設定することはなく、systemctlコマンドで実行するだけで操作できます。(従来は設定ファイルを直接編集するという設定方法が多かったですが、CentOS 7になり、設定ファイルを直接編集するのではなく、コマンドで設定を変更する方法に変わってきているようです。)

systemdとjournald

systemdには、Linuxのログを保存するjournaldというサービスも含まれています。journaldが保存したログは、journalctlコマンドで閲覧や検索ができるようになっており、なんらかの理由でサービスの起動に失敗したときは、journalctlコマンドによるログの参照を促すメッセージがプロンプト上に表示されます。
CentOS 7では、rsyslogというログ保存サービスとjorunaldを併用しています。デフォルトではrsyslogは/var/logディレクトリ以下にログを保存し、journaldはメモリ上にログを保存するという設定になっています。

systemdのコマンド

systemdには、systemctlやjornalctlが用意されていることは上述のとおりであり、CentOS 7を使う上ではそれぞれよく使うコマンドになります。また、それら以外にも便利なコマンドが用意されています。例えば、systemd-analyzeコマンドによってOSの起動時間を分析できたり、systemd-cgtopコマンドでサービスごとのメモリやCPUの使用量を観察できたりします
電源オフや再起動に使うshutdownコマンドもsystemdが提供しているコマンドです。

unit単位でサービスを管理

systemdはunitと呼ばれる単位でサービスを管理しています。unitには、serviceやdevice、mount、targetなどといった種類があります。
メールサーバーやWebサーバーなどは、すべてserviceという種類です。
unitには、実行する内容や依存関係などが書かれた設定ファイルがあります。
この設定ファイルは「サービス名.種類」というファイル名です。例えば、sshdのunitファイルは「sshd.service」です。
unitの依存関係は、末尾に.wantsがつく名前のディレクトリでも表現されます。例えば、自動起動を設定するには、複数のサービスを束ねるtargetという種類のunitのwantsディレクトリを作り、その中に他のunitファイルを入れて依存関係を設定します。