1.2. デフォルトの cgroup 階層

デフォルトで、systemdスライススコープ および サービス ユニットの階層を自動作成し、cgroup ツリーの統一された構造を提供します。systemctl コマンドを使用すると、「コントロールグループの作成」 で説明されているように、カスタムスライスを作成してこの構造をさらに変更することができます。また、systemd は重要なカーネルリソースコントローラー (Red Hat Enterprise Linux 7 で利用可能なコントローラー を参照) の階層を /sys/fs/cgroup/ ディレクトリーに自動マウントします。

警告

まだ systemd でサポートされていないコントローラー (とくに net-prio コントローラー) の階層をマウントし、これを処理するには、libcgroup パッケージの非推奨の cgconfig ツールを使用することができます。systemd でマウントされているデフォルト階層を変更するために libcgropup ツールを使用すると、予期しない動作が発生する可能性があるので、その場合はこのツールは使用しないでください。libcgroup ライブラリーは Red Hat Enterprise Linux の今後のバージョンでは削除されます。cgconfig の使用方法の詳細については、3章libcgroup ツールの使用 を参照してください。

systemd ユニットタイプ

システム上で実行されるすべてのプロセスは systemd init プロセスの子プロセスです。systemd は、リソースを制御する目的で使用される 3 つのユニットタイプを提供します (systemd のユニットタイプの詳細一覧については、『Red Hat Enterprise Linux 7 システム管理者のガイド』の「systemd によるサービス管理 」の章を参照してください)。
  • サービス: ユニット設定ファイルに基づいて systemd が起動したプロセスまたはプロセスのグループです。サービスは指定されたプロセスをカプセル化し、これらのプロセスが 1 つのセットとして起動したり、停止したりできるようにします。サービスの名前は以下のように指定されます。
    name.service
    ここで、name はサービスの名前を表します。
  • スコープ: 外部で作成されたプロセスのグループです。スコープは fork() 機能により任意のプロセスで起動し、停止された後に、ランタイム時に systemd によって登録されたプロセスをカプセル化します。たとえば、ユーザーセッション、コンテナーおよび仮想マシンはスコープとして処理されます。スコープの名前は以下のように指定されます。
    name.scope
    ここで、name はスコープの名前を表します。
  • スライス: 階層的に編成されたユニットのグループです。スライスにはプロセスが含まれず、スコープやサービスが置かれる階層を編成します。実際のプロセスはスコープやサービスに含まれます。この階層ツリーでは、スライスユニットのすべての名前は階層内の場所へのパスに対応します。ダッシュ ("-") 文字はパスコンポーネントの区切り文字として機能します。たとえばスライスの名前は以下のようになります。
    parent-name.slice
    これは、parent-name.slice というスライスは parent.slice のサブスライスであることを意味します。このスライスには parent-name-name2.slice などの独自のサブスライスを持たせることができます。
    以下のように表示される 1 つの root スライスがあります。
    -.slice
サービス、スコープおよびスライスユニットは cgroup ツリー内のオブジェクトに直接マップされます。これらのユニットがアクティブになると、それぞれがユニット名から作成される cgroup パスに直接マップされます。たとえば、test-waldo.slice にある ex.service は cgroup の test.slice/test-waldo.slice/ex.service/ にマップされます。
サービス、スコープおよびスライスはシステム管理者が手動で作成することも、またはプログラムによって動的に作成されることもあります。デフォルトでは、オペレーティングシステムはシステムの実行に必要な多数の組み込みサービスを定義します。さらに、以下の 4 種類のスライスがデフォルトで作成されます。
  • -.slice: root スライス
  • system.slice: すべてのシステムサービスのデフォルトの場所
  • user.slice: すべてのユーザーセッションのデフォルトの場所
  • machine.slice: すべての仮想マシンおよび Linux コンテナーのデフォルトの場所
すべてのユーザーセッションが、仮想マシンやコンテナープロセスと共に分離したスコープユニットに自動的に置かれることに注意してください。さらにすべてのユーザーには暗黙的なサブスライスが割り当てられます。上記のデフォルト設定に加え、システム管理者は新規スライスを定義し、サービスおよびスコープをこれらのスライスに割り当てることができます。 
以下は、cgroup ツリーの単純化したサンプルツリーです。この出力は 「コントロールグループに関する情報の取得」 で説明されているように systemd-cgls コマンドで生成されています。
├─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 20  
├─user.slice
│ └─user-1000.slice
│   └─session-1.scope
│     ├─11459 gdm-session-worker [pam/gdm-password]
│     ├─11471 gnome-session --session gnome-classic
│     ├─11479 dbus-launch --sh-syntax --exit-with-session
│     ├─11480 /bin/dbus-daemon --fork --print-pid 4 --print-address 6 --session
│     ...
│     
└─system.slice
  ├─systemd-journald.service
  │ └─422 /usr/lib/systemd/systemd-journald
  ├─bluetooth.service
  │ └─11691 /usr/sbin/bluetoothd -n
  ├─systemd-localed.service
  │ └─5328 /usr/lib/systemd/systemd-localed
  ├─colord.service
  │ └─5001 /usr/libexec/colord
  ├─sshd.service
  │ └─1191 /usr/sbin/sshd -D
  │ 
  ...
上記のように、サービスおよびスコープにはプロセスが含まれ、それらは独自のプロセスを所有しないスライスに置かれています。唯一の例外となるのは、特殊な systemd.slice にある PID 1 です。さらに -.slice はツリー全体の root で暗黙的に識別されるため、ここには表示されていません。
サービスおよびスライスユニットは、「ユニットファイルの変更」) で説明されているように永続的なユニットファイルで設定することも、PID 1 への API 呼び出しでランタイム時に動的に作成することもできます (「オンラインのドキュメント」 で API の参照情報をご覧ください)。スコープユニットは前者の方法でのみ作成できます。API 呼び出しで動的に作成されるユニットは一時的であり、ランタイム時にのみ存在します。一時的なユニットは、終了するとすぐに自動的にリリースされ、非アクティブにされるか、またはシステムの再起動が行われます。