改定されたLPIC303で新しく出題されるらしいけど教材が無いので自分で調べる!
※随時更新
0.0 その前にcgroup関係コマンドのインストール
# dnf install -y libcgroup libcgroup-tools
上記コマンドでcgcreateやcgclassifyなどcgroups操作用コマンド群をインストールします
1.1 cgcreateコマンド
ドキュメントを翻訳しながら実際にコマンドを打って確認していきます
# man 1 cgcreate
NAME
cgcreate - create new cgroup(s)
cgroupを新規作成するコマンドだそう
1.1.1 -gオプション
The command creates new cgroup(s) defined by the options -g.
-g <controllers>:<path>
defines control groups to be added. controllers is a list of controllers and path is the relative path to control groups in the given controllers list. This option can
be specified multiple times.
このコマンドは、-g オプションで定義された新しい cgroup(s) を作成します。
controllersはコントローラのリストで、pathは与えられたコントローラリスト内のコントロールグループへの相対パスです。このオプションは複数回指定することができます。
cgcreateコマンドを使用するときに必須のオプションですね。ならオプションとして分離する必要無いのでは?と思いましたが、-gオプションは1度の入力に複数個指定することで複数のcgroupを作成できるようです。
<controllers>に制御対象のサブシステム(cpu,memoryなどの単一のリソース)を、<path>に作成したいcgroup名を指定します(<path>は/で始まる必要があります)。
ちなみに、使用可能なサブシステムは/proc/cgroupsファイルから確認可能です。
# cat /proc/cgroups
#subsys_name hierarchy num_cgroups enabled
cpuset 6 1 1
cpu 3 110 1
cpuacct 3 110 1
blkio 7 109 1
memory 2 188 1
devices 4 109 1
freezer 9 1 1
net_cls 11 1 1
perf_event 8 1 1
net_prio 11 1 1
hugetlb 5 1 1
pids 12 144 1
rdma 10 1 1
では、実際にcgroupを作成してみます。
# cgcreate -g cpu:/test_cgroup
# ls -l /sys/fs/cgroup/cpu/test_cgroup
合計 0
-rw-rw-r-- 1 root root 0 11月 14 12:34 cgroup.clone_children
-rw-rw-r-- 1 root root 0 11月 14 12:34 cgroup.procs
-rw-rw-r-- 1 root root 0 11月 14 12:34 cpu.cfs_period_us
-rw-rw-r-- 1 root root 0 11月 14 12:34 cpu.cfs_quota_us
-rw-rw-r-- 1 root root 0 11月 14 12:34 cpu.rt_period_us
-rw-rw-r-- 1 root root 0 11月 14 12:34 cpu.rt_runtime_us
-rw-rw-r-- 1 root root 0 11月 14 12:34 cpu.shares
-r--r--r-- 1 root root 0 11月 14 12:34 cpu.stat
-r--r--r-- 1 root root 0 11月 14 12:34 cpuacct.stat
-rw-rw-r-- 1 root root 0 11月 14 12:34 cpuacct.usage
-r--r--r-- 1 root root 0 11月 14 12:34 cpuacct.usage_all
-r--r--r-- 1 root root 0 11月 14 12:34 cpuacct.usage_percpu
-r--r--r-- 1 root root 0 11月 14 12:34 cpuacct.usage_percpu_sys
-r--r--r-- 1 root root 0 11月 14 12:34 cpuacct.usage_percpu_user
-r--r--r-- 1 root root 0 11月 14 12:34 cpuacct.usage_sys
-r--r--r-- 1 root root 0 11月 14 12:34 cpuacct.usage_user
-rw-rw-r-- 1 root root 0 11月 14 12:34 notify_on_release
-rw-rw-r-- 1 root root 0 11月 14 12:34 tasks
cgroupを作成すると/sys/fs/cgroup/<controllers>/<path>に作成したcgroup用のディレクトリが作成されるようですね!
# cgcreate -g cpu:/test_hoge_cgroup -g cpu:/test_piyo_cgroup
# ls -l /sys/fs/cgroup/cpu/test_hoge_cgroup
合計 0
-rw-rw-r-- 1 root root 0 11月 14 12:42 cgroup.clone_children
-rw-rw-r-- 1 root root 0 11月 14 12:42 cgroup.procs
-rw-rw-r-- 1 root root 0 11月 14 12:42 cpu.cfs_period_us
-rw-rw-r-- 1 root root 0 11月 14 12:42 cpu.cfs_quota_us
-rw-rw-r-- 1 root root 0 11月 14 12:42 cpu.rt_period_us
-rw-rw-r-- 1 root root 0 11月 14 12:42 cpu.rt_runtime_us
-rw-rw-r-- 1 root root 0 11月 14 12:42 cpu.shares
-r--r--r-- 1 root root 0 11月 14 12:42 cpu.stat
-r--r--r-- 1 root root 0 11月 14 12:42 cpuacct.stat
-rw-rw-r-- 1 root root 0 11月 14 12:42 cpuacct.usage
-r--r--r-- 1 root root 0 11月 14 12:42 cpuacct.usage_all
-r--r--r-- 1 root root 0 11月 14 12:42 cpuacct.usage_percpu
-r--r--r-- 1 root root 0 11月 14 12:42 cpuacct.usage_percpu_sys
-r--r--r-- 1 root root 0 11月 14 12:42 cpuacct.usage_percpu_user
-r--r--r-- 1 root root 0 11月 14 12:42 cpuacct.usage_sys
-r--r--r-- 1 root root 0 11月 14 12:42 cpuacct.usage_user
-rw-rw-r-- 1 root root 0 11月 14 12:42 notify_on_release
-rw-rw-r-- 1 root root 0 11月 14 12:42 tasks
# ls -l /sys/fs/cgroup/cpu/test_piyo_cgroup
合計 0
-rw-rw-r-- 1 root root 0 11月 14 12:42 cgroup.clone_children
-rw-rw-r-- 1 root root 0 11月 14 12:42 cgroup.procs
-rw-rw-r-- 1 root root 0 11月 14 12:42 cpu.cfs_period_us
-rw-rw-r-- 1 root root 0 11月 14 12:42 cpu.cfs_quota_us
-rw-rw-r-- 1 root root 0 11月 14 12:42 cpu.rt_period_us
-rw-rw-r-- 1 root root 0 11月 14 12:42 cpu.rt_runtime_us
-rw-rw-r-- 1 root root 0 11月 14 12:42 cpu.shares
-r--r--r-- 1 root root 0 11月 14 12:42 cpu.stat
-r--r--r-- 1 root root 0 11月 14 12:42 cpuacct.stat
-rw-rw-r-- 1 root root 0 11月 14 12:42 cpuacct.usage
-r--r--r-- 1 root root 0 11月 14 12:42 cpuacct.usage_all
-r--r--r-- 1 root root 0 11月 14 12:42 cpuacct.usage_percpu
-r--r--r-- 1 root root 0 11月 14 12:42 cpuacct.usage_percpu_sys
-r--r--r-- 1 root root 0 11月 14 12:42 cpuacct.usage_percpu_user
-r--r--r-- 1 root root 0 11月 14 12:42 cpuacct.usage_sys
-r--r--r-- 1 root root 0 11月 14 12:42 cpuacct.usage_user
-rw-rw-r-- 1 root root 0 11月 14 12:42 notify_on_release
-rw-rw-r-- 1 root root 0 11月 14 12:42 tasks
-g複数指定が可能なことも確認できました
作成したcgroupはcgdeleteコマンドで消すことができます。作りすぎてもしょうがないので一旦消してしまいましょう。
# cgdelete -g cpu:/test_cgroup
# ls -l /sys/fs/cgroup/cpu/test_cgroup
ls: '/sys/fs/cgroup/cpu/test_cgroup' にアクセスできません: そのようなファイルやディレクトリはありません
# cgdelete -g cpu:/test_hoge_cgroup
# ls -l /sys/fs/cgroup/cpu/test_hoge_cgroup
ls: '/sys/fs/cgroup/cpu/test_hoge_cgroup' にアクセスできません: そのようなファイルやディレクトリはありません
# cgdelete -g cpu:/test_piyo_cgroup
# ls -l /sys/fs/cgroup/cpu/test_piyo_cgroup
ls: '/sys/fs/cgroup/cpu/test_piyo_cgroup' にアクセスできません: そのようなファイルやディレクトリはありません
ディレクトリが無くなっているのでたぶん削除できているかと思います。cgdeleteについてはよく知らないので調べてから別記事にまとめます。
1.1.2 -aオプション
-a <agid>:<auid>
defines the name of the user and the group which own the rest of the defined control group’s files. These users are allowed to set subsystem parameters and create sub‐
groups. The default value is the same as has the parent cgroup.
定義された制御グループの残りのファイルを所有するユーザーとグループの名前を定義します。
これらのユーザーは、サブシステムのパラメータを設定し、サブグループを作成することができます。
デフォルト値は、親グループのcgroupが持つものと同じです。
ざっくり調べてもいまいち情報が出てこないですね。使っている人も見ないので一旦無視します(後でちゃんと調べます)。
1.1.3 -dオプション
-d, --dperm=mode
sets the permissions of a control groups directory. The permissions needs to be specified as octal numbers e.g. -d 775.
制御グループ・ディレクトリのパーミッションを設定します. パーミッションは、8進数で指定する必要があります (例: -d 775)。
cgcreateで作成されたディレクトリ(1.1.1 -gオプション項を参照)のパーミッションを指定できます。
※-dを指定しない(デフォルトの状態で作成)
# cgcreate -g cpu,memory:/CPU75_Mem_Grouppiyopiyo
# ls -ld /sys/fs/cgroup/cpu,cpuacct/CPU75_Mem_Grouppiyopiyo
drwxr-xr-x 2 root root 0 12月 3 15:14 /sys/fs/cgroup/cpu,cpuacct/CPU75_Mem_Grouppiyopiyo
※-dを指定して作成
# cgcreate -d 777 -g cpu,memory:/CPU75_Mem_Grouphogehoge
# ls -ld /sys/fs/cgroup/cpu,cpuacct/CPU75_Mem_Grouphogehoge
drwxrwxrwx 2 root root 0 12月 3 15:17 /sys/fs/cgroup/cpu,cpuacct/CPU75_Mem_Grouphogehoge
上記のようにディレクトリのパーミッションがデフォルトから変更されています。
なお、ディレクトリ配下のファイル群はこのオプションの影響を受けません。
合計 0
-rw-rw-r-- 1 root root 0 12月 3 15:17 cgroup.clone_children
(略)
配下のファイル群のパーミッションを指定するオプションとして-fがあります。ディレクトリのdとファイルのfということですね。
1.1.4 -fオプション
-f, --fperm=mode
sets the permissions of the control groups parameters. The permissions needs to be specified as octal numbers e.g. -f 775. The value is not used as given because the
current owner's permissions are used as an umask (so 777 will set group and others permissions to the owners permissions).
制御グループパラメーターのパーミッションを設定します。 パーミッションは、8進数で指定する必要があります (例: -f 775)。
現在の所有者のパーミッションがumaskとして使用されるため、この値はそのままでは使用されません(したがって、777はグループとその他のパーミッションを所有者のパーミッションに設定します)。
使い方は基本的に-dと同じですね。
# ls -l /sys/fs/cgroup/cpu,cpuacct/CPU75_Mem_Grouppiyopiyo
合計 0
-r-------- 1 root root 0 12月 3 15:30 cgroup.clone_children
(略)
-rw-rw-r-- 1 root root 0 12月 3 15:30 tasks
tasksファイルのみパーミッションが変更されないようになっています。
tasksファイルはcgroupによりリソースが制限されるプロセスのPIDを書き込むファイルとのこと。こちらについては別記事にまとめる予定です。
tasksファイルのパーミッションを指定するオプションとして-sオプションがあります。
1.1.5 -hオプション
cgcreateコマンドのヘルプを表示してくれます。今のところ以下の内容で全部っぽい。
Usage: cgcreate [-h] [-f mode] [-d mode] [-s mode] [-t <tuid>:<tgid>] [-a <agid>:<auid>] -g <controllers>:<path> [-g ...]
Create control group(s)
-a <tuid>:<tgid> Owner of the group and all its files
-d, --dperm=mode Group directory permissions
-f, --fperm=mode Group file permissions
-g <controllers>:<path> Control group which should be added
-h, --help Display this help
-s, --tperm=mode Tasks file permissions
-t <tuid>:<tgid> Owner of the tasks file
1.1.6 -sオプション
※後ほど更新
1.1.7 -tオプション
※後ほど更新