cgcreateコマンドオプション一覧

改定されたLPIC303で新しく出題されるらしいけど教材が無いので自分で調べる！
※随時更新

#### 0.0 その前にcgroup関係コマンドのインストール
```terminal:cgroupのインストール
# dnf install -y libcgroup libcgroup-tools
```
上記コマンドでcgcreateやcgclassifyなどcgroups操作用コマンド群をインストールします


#### 1.1 cgcreateコマンド

ドキュメントを翻訳しながら実際にコマンドを打って確認していきます

```terminal:cgcreateコマンドのドキュメント
# man 1 cgcreate
```
<br>

```terminal:cgcreateって？
NAME
       cgcreate - create new cgroup(s)
```
>cgroupを新規作成するコマンドだそう

<br>

### 1.1.1 -gオプション
```terminal:-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) を作成します。<br>
controllersはコントローラのリストで、pathは与えられたコントローラリスト内のコントロールグループへの相対パスです。このオプションは複数回指定することができます。

cgcreateコマンドを使用するときに必須のオプションですね。ならオプションとして分離する必要無いのでは？と思いましたが、-gオプションは1度の入力に複数個指定することで複数のcgroupを作成できるようです。

\<controllers>に制御対象のサブシステム(cpu,memoryなどの単一のリソース)を、\<path>に作成したいcgroup名を指定します(\<path>は/で始まる必要があります)。

ちなみに、使用可能なサブシステムは/proc/cgroupsファイルから確認可能です。
```terminal:/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を作成してみます。
```terminal:-gオプション実行(1group作成)
# 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用のディレクトリが作成されるようですね！

```terminal:-gオプション実行(複数group作成)
# 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コマンドで消すことができます。作りすぎてもしょうがないので一旦消してしまいましょう。

```terminal:cgroupの削除
# 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オプション
```terminal:-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オプション
```terminal:-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オプション項を参照)のパーミッションを指定できます。

```terminal:-dオプション実行
※-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
```
上記のようにディレクトリのパーミッションがデフォルトから変更されています。
なお、ディレクトリ配下のファイル群はこのオプションの影響を受けません。
```terminal:ディレクトリ配下のパーミッションはそのまま
合計 0
-rw-rw-r-- 1 root root 0 12月  3 15:17 cgroup.clone_children
(略)
```
配下のファイル群のパーミッションを指定するオプションとして-fがあります。ディレクトリのdとファイルのfということですね。

### 1.1.4 -fオプション
```terminal:-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と同じですね。
```terminal:-fオプション実行
# 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コマンドのヘルプを表示してくれます。今のところ以下の内容で全部っぽい。
```terminal:cgcreate -h
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オプション
※後ほど更新