VMWare、Xen、KVM、もっと大きなのでは AWS とかが、VMの世界だと思っておりましたが、それら全部が openstack (cloud softwre) ファミリーだったのね。
ということで、軽量でメモリもディスクもあまり使わなそうな lxc でVMっぽいものをやってみた。
lxcの先には Docker とかいうものが控えているようだけれど、まずは基礎から。
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 件のコメント:
コメントを投稿