- 名前: 加藤泰文
- 職場: ホスティング会社の開発部門
- OSS 関係活動
- Plamo Linux メンテナ,Web ページコンテンツ管理
- lxc man pages 翻訳
- Jetspeed2 マニュアル翻訳 (もう活動してません)
- 技評さんのムックとか SD に数回執筆
OS レベルの仮想化
プロセスをグループ化して他のグループと隔離
グループ化したプロセスに対するリソース制限
カーネルの持つ上記機能を使って仮想化を実現
Linux VServer
カーネルがコンテナ向けの機能を持たないため,膨大なパッチを適用し,コンテナ仮想化を実現していた
Linux カーネルの持つ機能のみを使ってコンテナを実現するツールとして
libvirt (のLXCコンテナドライバ) (http://libvirt.org/)
どちらも同じ "LXC" という名前を使っているが,設定ファイルは別々.機能も微妙に違っていた
あと systemd でも軽量コンテナが作れるらしい (良く知らない)
# apt-get install lxc # lxc-create -n ct01 -t ubuntu # lxc-start -n ct01 -d # lxc-console -n ct01
# apt-get install lxc # lxc-create -n ct01 -t debian : (色々質問に答える) # vi /var/lib/lxc/ct01/config (ネットワーク関係の設定の追加) # lxc-start -n ct01 (debian 標準テンプレートそのままだと起動処理途中でだんまり ><)
コンテナ内の inittab の getty 付近はこんな感じに
1:2345:respawn:/sbin/getty 38400 console c1:12345:respawn:/sbin/getty 38400 tty1 linux c2:12345:respawn:/sbin/getty 38400 tty2 linux c3:12345:respawn:/sbin/getty 38400 tty3 linux c4:12345:respawn:/sbin/getty 38400 tty4 linux
[root@localhost ~]# lxc-start -n ct01 -d -o log -l DEBUG [root@localhost ~]# lxc-info -n ct01 state: STOPPED lxc-info: 'ct01' is not running pid: -1
起動しない (^_^;)
# installpkg /path/to/contrib/Virtulization/*.txz # cd /etc/rc.d/init.d ; chmod 755 lxc-net cgroups-mount # /etc/rc.d/init.d/lxc-net # /etc/rc.d/init.d/cgroups-mount # lxc-create -n ct01 -t plamo # lxc-start -n ct01 -d # lxc-console -n ct01
比較的古くから実装されている.lxc.sourceforge.net によると
ただし,user に関しては,確かに実装はされていてカーネルの config でも USER_NS は出てくるが,この頃実装されていた機能がどのようなものでどう使われていたのか不明.(後述)
man 2 setns によると
int setns(int fd, int nstype);
ファイルディスクリプタを渡すようになっている.
typedef struct { uid_t val; } kuid_t; typedef struct { gid_t val; } kgid_t;
0 100000 10000
Namespace内のID kernel内のID 範囲
-r-------- 1 root root 0 Mar 1 15:41 ipc -r-------- 1 root root 0 Mar 1 15:41 net -r-------- 1 root root 0 Mar 1 15:41 uts
lrwxrwxrwx 1 root root 0 3月 1日 14:59 ipc -> ipc:[4026532301] lrwxrwxrwx 1 root root 0 3月 1日 15:06 mnt -> mnt:[4026532299] lrwxrwxrwx 1 root root 0 3月 1日 15:06 net -> net:[4026532304] lrwxrwxrwx 1 root root 0 3月 1日 15:06 pid -> pid:[4026532302] lrwxrwxrwx 1 root root 0 3月 1日 15:06 uts -> uts:[4026532300]
グループ化したプロセスに対してリソース制御を行う機構.
RHEL 6.0 で Cgroups サポートが入り,専用マニュアル(リソース管理ガイド)もあるので一躍メジャーに!!
制限値の登録 (同じ処理をしているプロセスに同じ値)
# echo 5000 > /sys/fs/cgroup/cpu/test1/cpu.cfs_quota_us # echo 5000 > /sys/fs/cgroup/cpu/test2/cpu.cfs_quota_us # ps aux PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 3146 karma 20 0 19104 2204 1540 R 5 0.0 0:42.52 bash 3168 karma 20 0 19104 2208 1540 R 5 0.0 0:42.50 bash
片方だけ増やす
# echo 10000 > /sys/fs/cgroup/cpu/test2/cpu.cfs_quota_us # ps aux PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 3146 karma 20 0 19104 2204 1540 R 10 0.0 2:13.11 bash 3168 karma 20 0 19104 2208 1540 R 5 0.0 2:04.39 bash
$ cat /sys/fs/cgroup/net_prio/net_prio.ifpriomap lo 0 eth1 0 eth0 0
優先度の設定
# echo "eth0 1" > /sys/fs/cgroup/net_prio/test1/net_prio.ifpriomap # echo "eth0 100" > /sys/fs/cgroup/net_prio/test2/net_prio.ifpriomap
iperf を実行した結果
[ 4] 0.0-20.5 sec 2.17 GBytes 908 Mbits/sec <= priority 100 の方 [ 5] 0.0-20.6 sec 71.2 MBytes 29.1 Mbits/sec <= priority 1 の方
net_prio.ifpriomap
# cat /sys/fs/cgroup/net_prio/test1/net_prio.ifpriomap eth0 1 # cat /sys/fs/cgroup/net_prio/test2/net_prio.ifpriomap eth0 100
a project to implement checkpoint/restore functionality for Linux in userspace.
試したのが少し前なので今はだいぶ動きが変わっているかと (開発がかなり活発な印象)
基本的な実装が済んだ印象の 0.7.5 の細かい所を色々改良した印象 + Ubuntu ならではの面白い機能
Ubuntu Weekly Recipe 第226回 LXCで軽量仮想環境の活用 (gihyo.jp)
たぶん Ubuntu 12.10 の lxc (0.8.0-rc1) も一部機能がバックポートされている
liblxc API 公開
おそらく次の LTS (もちろん Ubuntu) をターゲットに lxc-1.0 を考えてるんじゃないかなー
lxc-1.0 に向けて考えること → [lxc-devel] 0.9 final release, plans for 1.0 and Linux Plumbers 2013