CGroups
Last updated
AWSハッキングの学習と実践:HackTricks Training AWS Red Team Expert (ARTE) GCPハッキングの学習と実践: HackTricks Training GCP Red Team Expert (GRTE)
Linux Control Groups、またはcgroupsは、Linuxカーネルの機能であり、CPU、メモリ、ディスクI/Oなどのシステムリソースの割り当て、制限、優先順位付けをプロセスグループ間で可能にします。これらは、プロセスコレクションのリソース使用量を管理および分離するメカニズムを提供し、リソース制限、ワークロードの分離、異なるプロセスグループ間でのリソースの優先順位付けなどの目的に役立ちます。
cgroupsには2つのバージョンがあります: バージョン1とバージョン2。両方をシステムで同時に使用できます。主な違いは、cgroupsバージョン2が階層的なツリー構造を導入し、プロセスグループ間でより微妙で詳細なリソース分配を可能にする点です。さらに、バージョン2には次のようなさまざまな改善点があります:
新しい階層構造の導入に加えて、cgroupsバージョン2には他のいくつかの変更と改善が導入されており、新しいリソースコントローラのサポート、レガシーアプリケーションへのより良いサポート、およびパフォーマンスの向上が含まれています。
全体として、cgroups バージョン2は、バージョン1よりも多くの機能と優れたパフォーマンスを提供しますが、後者は、古いシステムとの互換性が懸念される場合には引き続き使用される可能性があります。
任意のプロセスのv1およびv2 cgroupsをリストするには、そのcgroupファイルを/proc/<pid>で見ることができます。次のコマンドでシェルのcgroupsを確認できます:
ファイルシステムは通常、cgroupsにアクセスするために使用され、従来はカーネルとのやり取りにUnixシステムコールインターフェースが使用されていました。シェルのcgroup構成を調査するには、/proc/self/cgroupファイルを調べる必要があります。これにより、シェルのcgroupが明らかになります。次に、/sys/fs/cgroup(または**/sys/fs/cgroup/unified
**)ディレクトリに移動し、cgroupの名前を共有するディレクトリを見つけることで、cgroupに関連するさまざまな設定やリソース使用情報を観察できます。
cgroupsの主要なインターフェースファイルはcgroupで接頭辞が付けられています。標準のcatなどのコマンドで表示できるcgroup.procsファイルには、cgroup内のプロセスがリストされています。別のファイルであるcgroup.threadsにはスレッド情報が含まれています。
シェルを管理するcgroupsには通常、メモリ使用量とプロセス数を規制する2つのコントローラが含まれています。コントローラとやり取りするには、コントローラの接頭辞を持つファイルを参照する必要があります。たとえば、pids.currentは、cgroup内のスレッド数を確認するために参照されます。
値にmaxが示されている場合、cgroupに特定の制限がないことを示します。ただし、cgroupsの階層構造のため、ディレクトリ階層の下位レベルのcgroupによって制限が課される場合があります。
プロセスは、そのプロセスID(PID)をcgroup.procs
ファイルに書き込むことでcgroupsに割り当てられます。これにはroot権限が必要です。たとえば、プロセスを追加するには:
同様に、PID制限を設定するなど、cgroup属性を変更するには、関連するファイルに希望する値を書き込むことで行われます。cgroupに最大3,000個のPIDを設定するには:
新しいcgroupsを作成するには、cgroup階層内に新しいサブディレクトリを作成する必要があります。これにより、カーネルが自動的に必要なインターフェースファイルを生成します。アクティブなプロセスがないcgroupsはrmdir
で削除できますが、次の制約に注意してください:
プロセスはリーフcgroupsにのみ配置できます(つまり、階層内で最も入れ子になっています)。
親に存在しないコントローラを持つcgroupはできません。
子cgroupsのコントローラはcgroup.subtree_control
ファイルで明示的に宣言する必要があります。たとえば、子cgroupでCPUおよびPIDコントローラを有効にするには:
ルートcgroupはこれらのルールの例外であり、直接プロセス配置を許可します。これは、プロセスをsystemdの管理から削除するために使用できます。
cgroup内でのCPU使用率の監視は、cpu.stat
ファイルを介して可能であり、消費された合計CPU時間を表示し、サービスのサブプロセス全体での使用状況を追跡するのに役立ちます:
書籍: How Linux Works, 3rd Edition: What Every Superuser Should Know By Brian Ward