LXC/cgroupsについても調べてみたのでめもめも

Dockerを調べていたら、下位レイヤであるLXCやcgroupに興味が出てきたので少し調べました。
まだ触ってみたくらい。

# What is LXC?

- LinuX Containerの略で、システムのコンテナ化を行なうための機構
- OSレベルで提供されている
- Linux kernelの機構であるcgroups/namespaceなどに依存している
- 低レイヤな機構であるcgroupsなどをとりまとめる中間レイヤ的な側面を持つが、さらに高レイヤのDockerから利用されることが多い
- 同様の技術にFreeBSD jailやSolaris Containersなど

## How to use

以下でインストール。

```shell-session
ubuntu@ubuntu:~$ sudo apt-get install lxc
```

以下がテンプレートとして用意されている。

```shell-session
ubuntu@ubuntu:~$ ls -l /usr/lib/lxc/templates/
total 88
-rwxr-xr-x 1 root root  8227 Oct 29  2013 lxc-busybox
-rwxr-xr-x 1 root root  9806 Oct 29  2013 lxc-debian
-rwxr-xr-x 1 root root 10520 Oct 29  2013 lxc-fedora
-rwxr-xr-x 1 root root  9094 Oct 29  2013 lxc-opensuse
-rwxr-xr-x 1 root root  5115 Oct 29  2013 lxc-sshd
-rwxr-xr-x 1 root root 19736 Oct 29  2013 lxc-ubuntu
-rwxr-xr-x 1 root root 10590 Oct 29  2013 lxc-ubuntu-cloud
```

Debianをインストールしてみる。
十分以上かかるので注意。

```shell-session
ubuntu@ubuntu:~$ sudo lxc-create -t debian -n debian0
No config file specified, using the default config
debootstrap is /usr/sbin/debootstrap
Checking cache download in /var/cache/lxc/debian/rootfs-squeeze-i386 ... 
Downloading debian minimal ...
I: Retrieving Release
W: Cannot check Release signature; keyring file not available /usr/share/keyrings
/debian-archive-keyring.gpg
I: Retrieving Packages
I: Validating Packages
I: Resolving dependencies of required packages...
I: Resolving dependencies of base packages...
...
```

一覧を表示すると存在している。

```shell-session
ubuntu@ubuntu:~$ sudo lxc list                                                   
RUNNING

FROZEN

STOPPED
  debian0
```

開始してみる。

```shell-session
ubuntu@ubuntu:~$ sudo lxc start debian0
INIT: version 2.88 booting
...
Starting OpenBSD Secure Shell server: sshd.

Debian GNU/Linux 6.0 debian0 console

debian0 login: root
Password: 
Linux debian0 3.2.0-24-generic-pae #39-Ubuntu SMP Mon May 21 18:54:21 UTC 2012 i686

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
root@debian0:~# 
```

distributionは異なっているが、同一カーネル上で動作していることが分かる。

```shell-session
ubuntu@ubuntu:~$ uname -a
Linux ubuntu 3.2.0-24-generic-pae #39-Ubuntu SMP Mon May 21 18:54:21 UTC 2012 i686 i686 i386 GNU/Linux
```

```shell-session
root@debian0:~# uname -a
Linux debian0 3.2.0-24-generic-pae #39-Ubuntu SMP Mon May 21 18:54:21 UTC 2012 i686 GNU/Linux
```

ちなみに、以下のコマンドでfedoraをインストールすることもできるが、debianの場合と比較して時間がかかる。1時間くらいかかるかも。
ベースシステムの相違が大きいため、いろんなrpmを別途インストールする必要があるためぽい。

```shell-session
ubuntu@ubuntu:~$ sudo lxc-create -t fedora -n fedora0

No config file specified, using the default config
...
'fedora' template installed
'fedora0' created
ubuntu@ubuntu:~$ sudo lxc-start -n fedora0

Fedora release 14 (Laughlin)
Kernel 3.2.0-24-generic-pae on an i686 (tty1)

fedora0 login: root
Password: 
Last login: Tue Jul 15 01:01:39 on console
[root@fedora0 ~]# uname -a
Linux fedora0 3.2.0-24-generic-pae #39-Ubuntu SMP Mon May 21 18:54:21 UTC 2012 i686 i686 i386 GNU/Linux
```

# What is cgroups?

- リソースの制限
    - グループ単位でメモリ割り当てを制限
- 優先順位の変動
    - グループ単位でCPU, Disk I/Oの優先順位を変更
- 監視
    - グループ単位で使用しているリソースを計上
- 各グループは階層構造を持つ
    - 子グループは親グループの属性を一定引き継ぐ

なお、以前のバージョンだとnamespaceの分離もcgroupが対応していたようですが、[消されました](http://lists.linuxfoundation.org/pipermail/containers/2011-January/026343.html)。
namespaceはカーネルの機能として独立した、ということかな。

## How to use

リソース制限についてやってみる。
まずはインストール。

```shell-session
$ sudo apt-get install cgroup-bin
```

関連コマンドは
- ``cgcreate``
- ``cgexec``
- ``cgclassify``

cgroupを作成。メモリとCPUのリソースを制限できるようにする。

```shell-session
$ sudo cgcreate -g memory,cpu:test
```

下記のsysfsで確認できる。

```shell-session
$ ls -l  -l /sys/fs/cgroup/cpu/test/
total 0
-rw-r--r-- 1 root root 0 Jul 15 13:17 cgroup.clone_children
--w--w--w- 1 root root 0 Jul 15 13:17 cgroup.event_control
-rw-r--r-- 1 root root 0 Jul 15 13:17 cgroup.procs
-rw-r--r-- 1 root root 0 Jul 15 13:17 cpu.cfs_period_us
-rw-r--r-- 1 root root 0 Jul 15 13:17 cpu.cfs_quota_us
-rw-r--r-- 1 root root 0 Jul 15 13:17 cpu.rt_period_us
-rw-r--r-- 1 root root 0 Jul 15 13:17 cpu.rt_runtime_us
-rw-r--r-- 1 root root 0 Jul 15 13:17 cpu.shares
-r--r--r-- 1 root root 0 Jul 15 13:17 cpu.stat
-rw-r--r-- 1 root root 0 Jul 15 13:17 notify_on_release
-rw-r--r-- 1 root root 0 Jul 15 13:17 tasks
```

指定cgroupでプロセスを起動。

```shell-session
$ sudo cgexec -g memory,cpu:test /bin/bash
```

指定cgroupに属していることが分かる。

```shell-session
# cat /proc/self/cgroup
5:freezer:/sysdefault
4:memory:/test
3:devices:/sysdefault
2:cpuacct:/sysdefault
1:cpu:/test
```

CPU共有の優先度を指定可能。100で10%。

```shell-session
# cat /sys/fs/cgroup/cpu/test/cpu.shares                          
1024
# echo 100 >/sys/fs/cgroup/cpu/test/cpu.shares
```

メモリ使用量の制限。これ以上のメモリを確保しようとするとスワップアウトする。

```shell-session
# cat /sys/fs/cgroup/memory/test/memory.limit_in_bytes
9223372036854775807
# echo $((1024*1024)) >/sys/fs/cgroup/memory/test/memory.limit_in_bytes
```

統計情報も見える。

```shell-session
cat /sys/fs/cgroup/cpu/test/cgroup.procs 
9239
# ps auxw | grep 9239
root      9239  0.0  0.4   6960  2216 pts/1    S    13:35   0:00 /bin/bash
```

# Docker / LXC / cgroups

なんだか似たようなシステムに思えるけど、結局これらの関係ってどうなってるの？　という疑問については[こちら](http://stackoverflow.com/questions/17989306/what-does-docker-add-to-just-plain-lxc)が詳しい。

- Dockerは下位レイヤとしてLXCを利用する
- コンテナの可搬性（LXCでは環境が異なるとコンテナの互換性がない）
- アプリの配布に最適化している
- 自動ビルド(Dockerfile)
- バージョン管理
- コンテナ再利用
- コンテナ共有
- 様々なツール/システムとの連携

機能別に分類すると、

<dl>
<dt>ファイルシステムの分離</dt>
<dd>LXC(namespace)が提供</dd>
<dt>リソースの分離</dt>
<dd>LXC(cgroup)が提供</dd>
<dt>ネットワークの分離</dt>
<dd>LXC(cgroup)が提供</dd>
<dt>ファイルシステムのCopy on Write</dt>
<dd>AUFSが提供</dd>
<dt>ロギング</dt>
<dd>Dockerが提供</dd>
<dt>ファイルの変更管理と再利用</dt>
<dd>Dockerが提供</dd>
<dt>対話的シェル</dt>
<dd>LXCが提供</dd>
</dl>