2015年6月10日水曜日

Ubuntu 14.04とLinuxコンテナ

前回Xenを使ってみましたが、今回はlxc(Linuxコンテナ)です。
lxcはLinux Kernelの比較的新しいバージョンに組み込まれた機能を利用しており、
Intel VTやAMD-Vのようなハードウェアによる支援も必要ないため、
ハードルは低いもののXen等よりも制約がきついという欠点があります。
ホストとゲストで同じカーネルを利用しなければならないところはOpenVZと同じですね。
またホスト上のあるディレクトリをゲストのルートファイルシステムにするchrootな発想で、
ゲストはホストに寄生するような恰好です。
まあ、だからこそ軽くていいのですが。

では早速インストールします。以下を実行します。
# apt-get install lxc
そしてゲストOSの準備です。以下を実行します。
# lxc-create -t <テンプレート名> -n <ゲスト名>
ここでテンプレート名は、"/usr/share/lxc/templates/"ディレクトリにたくさんある
"lxc-<テンプレート名>"ファイルの中から選びます。
ホストOSはUbuntu 14.04(64bit)ですし、ここ最近はUbuntuしか扱っていないので、
迷わず"ubuntu"を選びます。
長い処理の完了直前には以下のようなメッセージが出ます。
##
# The default user is 'ubuntu' with password 'ubuntu'!
# Use the 'sudo' command to run tasks as root in the container.
##
作り付けの一般ユーザが"ubuntu"、そのパスワードが"ubuntu"という情報です。

ゲストOSを起動するには以下を実行します。
# lxc-start -n <ゲスト名>
超素早く立ち上がりコンソールが現れます。
先ほどの情報でログインして好きに使いましょう。
でも作り付けのアカウントをそのままにしておくのも何なので、
新しいユーザの作成した上で削除してしまいます。以下を実行します。
$ sudo su -
# passwd
# groupadd <グループ名>
# useradd -m -g <グループ名> -s /bin/bash -N <ユーザ名>
# passwd <ユーザ名>
# userdel -r ubuntu

この時点ではゲストのネットワークはホストのlxcbr0に接続され、
NAT経由で外部にアクセスすることになります。
ゲストを使う上ではそれでも不便はないのですが、
このままだとリモートからゲストにアクセスするのが面倒です。
ということで前回Xenでやったように
ブリッジに接続してローカルネットに直接乗り入れます。
既にbr0が存在するとして、"/var/lib/lxc/<ゲスト名>/config"設定ファイルの
lxc.network.link = lxcbr0
lxc.network.link = br0
に変更してゲストを立ち上げ直すだけで、
ネットワーク上のDHCPサーバからIPアドレスがもらえます。
もし、物理PCに2つのネットワークインターフェイスがあり、
ゲストから両方につなぎたければ、"lxc.network.*"の設定を重ねます。
すなわち以下のようにします。
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
lxc.network.hwaddr = xx:xx:xx:xx:xx:xx

lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br1
lxc.network.hwaddr = xx:xx:xx:xx:xx:xx
これによりゲストのeth0とeth1がホストのbr0とbr1に接続されます。
ただし、このままだどDHCPでIPアドレスをもらえるのはeth0だけになります。
ゲスト側の"/etc/network/interfaces"設定ファイルに以下を追加すれば、
eth1も自動設定されるようになります。
auto eth1
iface eth1 inet dhcp

ゲストOSのルートファイルシステムの実体は
"/var/lib/lxc/<ゲスト名>/rootfs"ディレクトリになります。
ここには見慣れた光景があります。
当然ゲストもホストもアクセスできます。
もしゲストの作業領域を別に用意したければ、
"/var/lib/lxc/<ゲスト名>/fstab"設定ファイルに例えば
/opt3 opt2 none bind,create=dir
のように記述すると、
ゲストの"/opt2"からホスト上の"/opt3"へアクセスできます。
排他的に物理パーティションを使わなければならないXenとは正反対で、
ホストにマウントしていなければゲストから利用できません。
注意すべき点は、ホストのユーザーとゲストのユーザーは別物ということで、
共有ディレクトリ内であっても、
個別のファイルを共有するには適切にパーミッションを設定する必要があります。

以上で十分常用できる環境にはなりますが、
DVDからインストールしたUbuntu 14.04とは異なる点もあります。
とりあえず私は2点ほどに出会いました。
一つ目はパッケージ管理のための"apt-add-repository"が
ゲスト環境にはなかったことです。
これはゲスト環境で
# apt-get install software-properties-common
を実行することで解決できました。
もう一つは"apt-get install"で":i386"付きな32ビットのライブラリパッケージが
インストールできなかったことです。
しょうがないので32ビットのlib*.soをホストからコピーしてきて
ゲストの"/lib/i386-linux-gnu/"ディレクトリに置き、
ゲストで
# echo '/lib/i386-linux-gnu' > /etc/ld.so.conf.d/<ライブラリ名>.conf
# ldconfig
を実行するとなんとかなりました。
こんな小手先の技を使うのも悪くはないですが、
lxcでうまく動かなければ素直に他の仮想環境を使った方が多分楽です。

0 件のコメント:

コメントを投稿