2015/08/13

lxcを入れてVM構築

LinuxContainers.org Infrastructure for container projects というLinuxカーネルのコンテナ技術を使って軽量VM環境を構築できるらしいものを最近知りました。

VMWare、Xen、KVM、もっと大きなのでは AWS とかが、VMの世界だと思っておりましたが、それら全部が openstack (cloud softwre) ファミリーだったのね。

ということで、軽量でメモリもディスクもあまり使わなそうな lxc でVMっぽいものをやってみた。
lxcの先には Docker とかいうものが控えているようだけれど、まずは基礎から。

lxcの勉強には LXCで学ぶコンテナ入門 を参考にさせてもらいました。

lxcインストール

$ sudo apt-get install lxc

すると
 /etc/lxc/ 設定
 /usr/share/lxc/ ディストーション設定やテンプレート
 /var/lib/lxc/ ルート権限のコンテナ格納場所
 /etc/init/lxc-**.conf 自動起動やらネットワーク設定やら
が作られて
 upstart-file-bridge
 upstart-socket-bridge
 upstart-udev-bridge
 cgmanager
 dnsmasq
がデーモンで動き始めました。

ifconfig すると、lxcbr0 っていうコンテナのネットワークをブリッジするインターフェースが追加されているのを確認。

root権限でコンテナ作って動かしてみる
$ sudo lxc-create -t ubuntu -n uc01

/var/lib/lxc/uc01にuc01という名前のubuntuが作られた。

起動!
$ sudo lxc-start -n uc01

動いた~。デフォルトのubuntuユーザでログインしてみた。ふむふむ。sshが出来る状態なのね。
えーと、コンソールから抜けるのは??? Ctrol+a qだそうな。やってみたけど抜けられぬ。。

停止(ホスト側で)
$ sudo lxc-stop -n uc01

コンソールから抜けられなかったので、外から殺しました。

デーモン起動して
$ sudo lxc-start -n uc01 -d

コンソール起動
$ sudo lxc-console -n uc01

おぉ? 今度は Ctrl+a q で抜けられた!まあいいか。次へ進む。
どうやらlxc-startをフォアグラウンドで起動した時のコンソールではダメで、lxc-consoleで起動したコンソールならば抜けられるようだ。

ネットワークタイプをmacvlanへ変更
デフォルトだと、仮想ネットワークが構築されて、それがホストに作られたブリッジインターフェース経由で外に出られるようになっていて、ホストから ssh 接続ができる状態。
これだと、外から uc01 へsshしたりは出来ない。

/var/lib/lxc/uc01/configを以下のように変更
 lxc.network.type = veth
 lxc.network.link = lxcbr0
 ↓
 lxc.network.type = macvlan
 lxc.network.link = em1 ← 普通はeth0とかになるところ。自分のShuttleではem1なのだ。

ホストの物理インターフェースに接続される。dhcpもいつものルータが担う。
ホストと同じように固定IP設定も普通にできる。

再起動
$ sudo lxc-stop -r -n uc01

確認
$ sudo lxc-ls -f
ふむ。IPアドレスが 192.168.1.31 とかになった。
コンテナから外に出れる。外部から コンテナ(uc01)へssh出来る。
ただし! ホストからはsshもpingも出来ない。
macvlanモード設定でコンテナ同士でのアクセスは出来るようになる。が、ホストはダメです。

コンテナ削除
$ sudo lxc-destroy -n uc01

なくなりました。
ここまでは全然何の問題もないっすね。あっけない。けど、裏ではものすごい技術の集合体です。

----

ユーザ権限でコンテナ作成

いくつかホスト側で設定が必要らしいが、ubuntu 14.04 だとそのほとんどは済んでいて、簡単な設定ファイルを用意するだけでよいようだ。

ユーザホームディレクトリ
$ mkdir .config/lxc
$ cp /etc/lxc/default.conf .config/lxc
$ echo "lxc.id_map = u 0 100000 65536" >> .conifig/lxc/default.conf
$ echo "lxc.id_map = g 0 100000 65536" >> .conifig/lxc/default.conf

lxc.id_mapへは、/etc/subuid と /etc/subgid に書かれているユーザのサブIDを設定する。
このsubuidとかはubuntuでは普通にユーザを作成すると作られている情報。

/etc/lxc/lxc-usernet ファイルに追記
$ sudo echo "user veth lxcbr0 10" >> /etc/lxc/lxc-usernet

"user"にvethでlxcbr0を使うコンテナを10個作れる。という特権を与える設定。
vethしかダメらしい。

作成(ユーザコンテナの場合、テンプレートには download しか選べない)
$ lxc-create -n ubu01 -t download

すると、どのディストリビューション入れる?って対話で聞いてくるので、それにそって入れても良いし、分かっているなら以下のようにオプション指定してもいい。

$ lxc-create -n ubu01 -t download -d ubuntu -r trusty -a amd64
ってな感じ。
ダウンロードイメージは毎日ビルドされているものをwgetで取得してくるようだ。

起動
$ lxc-start -n ubu01 -d

$ ps aux でプロセスを見てみると、UIDが100000位上のプロセスが10数個立つ。これがユーザコンテナのプロセスだろう。lxcはホストのカーネルプロセスの一部として動くので混ざるわけだ。

実はこの時ちゃんと起動しなくて、cgmanagerがエラーを出してクラッシュした。
何か設定が悪いのか?と調べてみたところ、lxcかcgmanagerのちょっとしたバグ?なのだろうか
ホストを再起動したら、直った。

起動してもログイン出来ないよ
ルート用テンプレートとは違い、sshdも入らないし、ubuntuユーザに初期パスワード設定されていないので、起動してもログイン出来ないのだ。これはセキュリティのための対処らしい。

ubuntuユーザにパスワード設定
$ lxc-attach -n ubu01 -- sudo passwd ubuntu

lxc-attachはコンテナにデフォルトユーザでログインしたつもりで外からコマンドを実行出来る。
親切にもダウンロードコンテナ作成するとその辺のガイドとかが表示される。

書いておきながら何だけど、デフォのubuntuユーザは触らずに、新たに作ったほうがいいと思う。

$ lxc-attach -n ubu01 -- sudo adduser user1
$ lxc-attach -n ubu01 -- sudo adduser user1 sudo

な感じで。

因みに、ユーザ起動コンテナのネットワークタイプはデフォルトの veth じゃないとだめらしい。
外に出れる。ホストからアクセスできる。が、外からはアクセス出来ないってこと。
セキュリティ的には良いが、外からアクセス出来ないとちょっとつまらないので、何とかしよう。

0 件のコメント:

コメントを投稿