Mar
18th
Thu
18th
というわけでgithub.com/ruby/ruby.gitにpushしているローカルのマシンがUbuntu Lucid Lynx + lxcになった。
lxc: Linux Container
コンテナである。仮想化と呼ぶには若干の抵抗がある。Solarisのzones、FreeBSDのjail、LinuxだとOpenVZとかの仲間。
- OpenVZとの比較
- まずlxcはmainlineに入ってるのでKernelを弄らなくてよい
- lxcに商用サポートとかはないので転んでも泣かない
- というか商用とか以前にドキュメントすげえ少ない。マゾヒストとRubyユーザーにちょうおすすめ
- rootのfsがただのchrootなので同じファイルが無駄にたくさん必要
- でも逆に普通のdebootstrapで作ったディレクトリでいいので、らくちんではある
- KVMとの比較
- QEMU不要
- ディスクイメージ不要
- いろいろなオーバーヘッドが少ないのできびきび
- しかしコンテナなので逆立ちしてもWindowsは走らない
インストール
Kernelはmainlineなのでよほど古いdistro以外は普通に入ってると思われるので、Userlandだけあればよい。
% sudo aptitude install lxc
とかでOK(Ubuntuなど)。再起動も不要。
ただしlxcではリソースの管理と制限にcgroupを使っているので、cgroupが見えてないといけない。fstabに
cgroup /cgroup cgroup default 0 0
とか突っ込んでおくこと。マウントポイントはどこでもよい(mount -t cgroupを見ているので)
作ってみる
- とりあえずlucidだと/usr/share/doc/lxc/examplesにlxc-sshdとかlxc-fedora.gzとかがあるのでとても参考になる(ただのシェルスクリプトだ)
- 基本はrootになるディレクトリとlxc.confを作ってからlxc-start
(上にも書いたけど)debootstrapすると楽
/usr/share/doc/lxc/examples/lxc-debian.gzを解凍してftp.debian.org と直書きされてるとろをftp.jp.debian.orgとかに書き換えてから、
% sudo env TERM=vt100 LANG=C bash ./lxc-debian -p /some/path % sudo lxc-start -n foo -f /some/path/configでいきなり動くのであまりに簡単すぎて感動できる
- 止めたくなったらlxc-stop
ネットワークまわり
ネットワークは仮想化とかいうよりは多重化? 設定としては
- empty: loopbackのみ、のはずだが現在動かない http://www.mail-archive.com/lxc-users@lists.sourceforge.net/msg00153.html
- veth: 仮想ethernetデバイスがポンと生成されるだけ、lxcの外側でブリッジして使う
- vlan: プロトコルVLANっぽい感じ
- macvlan: 物理マシンのethNとかに二番目のMACアドレスを割り振ってMACアドレスベースVLAN、簡単なのでおすすめだが物理マシンのeth0とかはpromiscus modeになっちゃうので注意
- phy: すでにある物理層をそのまま使う、etherの口が余ってる人向け? 使ってみたことがないので人柱希望
があるけど、vethにせよmacvlanにせよべつにlxc独自というわけではなくて、普通にKernelに入ってる機能だよな。
仕組み
ネットワークまわりの見え方からも分かるとおり、lxcのレイヤはとても薄い。uerlandのPID空間とかネットワークとかが他と分離してるだけだもんね。で、それはclone(2)のフラグにCLONE_NEWPIDとかCLONE_NEWNETとか指定するとそうなるのかな。そんだけかよって感じ。
ドキュメント
- そんなもなぁねえ
- まあmanくらいはある。man読むだけでも多くの事が分かる
- とはいえだいたい「こうだろうな」と思ったとおりに動く感じ。そうじゃない所はバグとかだったり
- あと http://lxc.sf.net/ からlwnのエントリを読むと中の実装はなんとなくこうなってるんだろうなあというのは想像できる
- あとはマシン一個作っていろいろ遊ぶと見えてくる感じ