'\" -*- coding: UTF-8 -*- .if \n(.g .ds T< \\FC .if \n(.g .ds T> \\F[\n[.fam]] .de URL \\$2 \(la\\$1\(ra\\$3 .. .if \n(.g .mso www.tmac .TH pam_cgfs 8 2024-03-30 "" "" .SH NAME pam_cgfs \- 非特権の LXC コンテナのための cgroup を管理する .SH SYNOPSIS 'nh .fi .ad l \*(T<\fBpam_cgfs.so\fR\*(T> \kx .if (\nx>(\n(.l/2)) .nr x (\n(.l/5) 'in \n(.iu+\nxu {-c \fIkernel_controller,name=named_controller\fR} 'in \n(.iu-\nxu .ad b 'hy .SH 説明 LXC は LXC 1.0 以降、完全な非特権コンテナをサポートしてきました。完全な非特権コンテナは安全なコンテナであり、一般ユーザ(非 root)で実行できます。これはホスト上の特権のない UID と GID の範囲を、それとは異なるコンテナ内の UID と GID の範囲にマッピングするユーザ名前空間を使うことで実現しています。これは、コンテナ内の UID 0 (root) が、コンテナの外では 1000000 のような特権のないユーザ ID にマッピングされ、自身の所有するリソースに対してのみ権限を有することを意味します。 .PP 完全な非特権コンテナの cgroup 管理は、このようなコンテナが使用するリソースを制限するということです。例えば、コンテナの CPU 使用量を制限したり、コンテナ内で起動するプロセスの数を制限したり、コンテナが消費できるメモリを制限したりということです。 完全な非特権コンテナは一般ユーザによって実行され、コンテナ間のリソース消費を制限、管理する必要があるということは明らかです。 しかし、非特権での cgroup 管理はほとんどの init システムでは簡単ではありません。 そこで、pam_cgfs.so が誕生したのです。 .PP \fBpam_cgfs.so\fR モジュールは、純粋な cgroupfs v1 (\*(T<\fI/sys/fs/cgroup/$controller\fR\*(T>) ツリーと、コントローラのいくつかが cgroupfs v1 ツリー (\*(T<\fI/sys/fs/cgroup/$controller\fR\*(T>) で、それ以外が cgroupfs v2 (\*(T<\fI/sys/fs/cgroup/unified\fR\*(T>) ツリーと言ったようなミックスマウントを扱えます。 書き込み可能な cgroup がすべてのコントローラ用に作られます。また、引数で指定すれば、指定したコントローラのみ書き込み可能な cgroup が作られます。 純粋な cgroup v2 のみのマウントは pam_cgfs.so モジュールでは対象外です。 .PP 作成された cgroup \*(T<\fIuser/$user/n\fR\*(T> は cgroup カーネルコントローラ階層配下の n 番目のセッション用です。 .PP init システムが systemd であるシステムは、cgroupfs v1 と v2 の両方が特別に扱われます。cgroupfs v1 と v2 の両方に対して、このモジュールは systemd が既に、\*(T<\fIuser.slice/user\-$uid/session\-n.scope\fR\*(T> を cgroup 内に作成しているかどうか、$uid == login uid であるかどうかをチェックします。もし $uid == login uid であるなら、\*(T<\fIsession\-n.scope\fR\*(T> をユーザに chown します。そうでなければ、前述のような cgroup (\*(T<\fIuser/$user/n\fR\*(T>) が作成され、ログイン uid で chown されます。 もし、init システムがすでにセッション特有のグループ内にログインユーザーの cgroup を配置しているなら、\fBpam_cgfs.so\fR モジュールはそれを検出して再利用する機能を持っています。 .PP 基本的には \fBpam_cgfs.so\fR モジュールは、ログイン時に非特権(非 root)ユーザが書き込みできる cgroup を配置し、ログアウト時にもその cgroup ツリーをクリーンアップする処理を行います。したがって、必要に応じて提供されているリソースをコンテナに自由に委譲できます。 .SH オプション .TP \*(T<\fB\-c \fR\*(T>\fIcontroller-list\fR カンマ(",")で区切られたカーネルコントローラと名前付きコントローラ(訳注: mount オプションとして name オプションで名前を指定してマウントした cgroup v1 ツリー)のリストを設定した文字列の引数を取ります。名前付きコントローラは "name=$namedcontroller" の形で指定する必要があります。"all" を指定して、すべての cgroup リソースコントローラーのツリーを有効にできます。"all" と他のコントローラを同時に指定すると、明確に PAM_SESSION_ERR が返ります。 .SH "MODULE TYPES PROVIDED" モジュールタイプとして \*(T<\fBsession\fR\*(T> のみが提供されます(そして必要です)。 .SH 返り値 .TP PAM_SUCCESS ユーザ用の書き込み可能な cgroup が作成されました。 .TP PAM_SESSION_ERR ユーザ用の書き込み可能な cgroup の作成が失敗しました。 .SH ファイル .TP /etc/pam.d/common-session{,-noninteractive} これらのファイルの最後にデフォルト設定が追加されます。 .SH 例 .nf \*(T< session optional pam_cgfs.so \-c freezer,memory,named=systemd # デフォルト設定 # ユーザが書き込み可能な cgroup が freezer, memory, 名前付き cgroup "systemd" ツリー以下に作成されます。 # freezer と memory に対しては /sys/fs/cgroup/$controller/user/$user/n # systemd に対しては /sys/fs/cgroup/systemd/user.slice/user\-$uid/session\-n.scope session optional pam_cgfs.so \-c all # すべての cgroup コントローラ以下にユーザが書き込み可能な cgroup が作成されます session optional pam_cgfs.so \-c all,memory,freezer # 不正な引数なので PAM_SESSION_ERR が返ります \*(T> .fi .SH "SEE ALSO" \fBlxc-cgroup\fR(1), \fBcgroups\fR(7), \fBuser_namespaces\fR(7), \fBnamespaces\fR(7), \fBpam\fR(8) .SH AUTHOR Venkata Harshavardhan Reddy Allu <\*(T>