1.2. デフォルトの cgroup 階層
デフォルトでは、systemd は slice、scope、および service ユニットの階層を自動的に作成して、cgroup ツリーに統一された構造を提供します。systemctl コマンドを使用すると、「コントロールグループの作成」 のようにカスタムスライスを作成して、この構造をさらに変更できます。また、systemd は、
/sys/fs/cgroup/
ディレクトリーの重要なカーネルリソースコントローラーの階層を自動的にマウントします (Red Hat Enterprise Linux 7 で利用可能なコントローラー を参照)。
警告
libcgroup
パッケージの非推奨の cgconfig ツールを使用して、systemd でまだサポートされていないコントローラー (特に net-prio
コントローラー) の階層をマウントおよび処理できます。予期しない動作が発生する可能性があるので、libcgroupup
ツールを使用して、systemd によってマウントされたデフォルトの階層を変更しないでください。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 つのルートスライスがあります。-.slice
サービス、スコープ、およびスライスユニットは、cgroup ツリー内のオブジェクトに直接マップされます。これらのユニットがアクティブになると、ユニット名から構築される cgroup パスを制御するように直接マッピングされます。たとえば、test-waldo.slice にある ex.service は、cgroup
test.slice/test-waldo.slice/ex.service/
にマップされます。
サービス、スコープ、およびスライスは、システム管理者によって手動で作成されるか、プログラムによって動的に作成されます。デフォルトでは、オペレーティングシステムは、システムの実行に必要な多数の組み込みサービスを定義します。また、デフォルトで 4 つのスライスが作成されます。
- -.slice: ルートスライス。
- 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 │ ...
ここにあるように、サービスとスコープにはプロセスが含まれており、独自のプロセスを含まないスライスに配置されています。唯一の例外は、-.slice としてマークされた特別な systemd スライスにある PID 1 です。また、-.slice は、ツリー全体のルートで暗黙的に識別されるため、表示されないことに注意してください。
「ユニットファイルの変更」 で説明されているように、サービスおよびスライスユニットは、永続ユニットファイルを使用して設定できます。または PID 1 への API 呼び出しによって実行時に動的に作成されます (API リファレンスについては 「オンラインドキュメント」 を参照)。スコープユニットは動的にしか作成できません。API 呼び出しで動的に作成されたユニットは一時的なものであり、実行時にのみ存在します。一時的なユニットは、終了するか、非アクティブになるか、システムが再起動されるとすぐに自動的に解放されます。