LXCで学ぶコンテナ入門 -軽量仮想化環境を実現する技術

第29回 LXC 1.1[1]

この記事を読むのに必要な時間:およそ 5.5 分

lxc-topコマンドのバイナリ化

1.0系ではluaで書かれていたlxc-topコマンドが,1.1でC言語を使って書き直されました。

luaで書かれていたためか,Ubuntu 14.04 LTSではlxc-topコマンドはパッケージでLXCを入れてもインストールされませんでした。一方,Ubuntu 15.04でインストールされるLXC 1.1系のパッケージではインストールされるようになっています。

$ sudo lxc-top
Container               CPU      CPU      CPU      BlkIO        Mem
Name                   Used      Sys     User      Total       Used
ct01                   0.36     0.23     0.16    0.00      16.09 MB
ct02                   0.38     0.33     0.15    0.00      16.00 MB
ct03                   0.37     0.26     0.15    0.00      16.00 MB
TOTAL 3 of 3           1.11     0.82     0.46    0.00      48.09 MB

コンテナ作成時にテンプレートの指定が必須に

1.0.7までではlxc-createコマンドはコンテナ名を指定することのみが必須で,テンプレートを指定せずに実行すると,空のコンテナが作成されました。

1.1系では,-tオプションを指定することが必須となりました。1.0.7まででテンプレートを指定せずに実行した場合と同じように,空のコンテナを作成したい場合は,-t noneのように指定します。

また1.0系でも,1.0.8でバグ修正として1.1と同じように-tオプションが必須になりました。空のコンテナを作成する際には-t noneと指定をするのも同じです。

$ sudo lxc-create -t none -n empty
$ sudo lxc-ls -f
NAME   STATE    IPV4  IPV6  GROUPS  AUTOSTART  
---------------------------------------------
empty  STOPPED  -     -     -       NO
$ sudo ls -F /var/lib/lxc/empty/
config

以上のようにコンテナディレクトリが作成され,ディレクトリには設定ファイルのみが作成されます。設定ファイルは以下のように作成時にコンテナに設定される,コンテナのデフォルト設定ファイルがコピーされただけの状態になっています。

$ sudo cat /var/lib/lxc/empty/config
lxc.network.type=veth
lxc.network.link=lxcbr0
lxc.network.flags=up

ただし,Ubuntu 15.04にインストールされている1.1.2では,バグのために-t noneを指定してもエラーになるようです。

lxc-config lxc.cgroup.* の表示

第28回「lxc-configの改良」で紹介したように,lxc-configでcgroup関係のシステム設定が表示されるようになりました。

lxc-start-ephemeral --cdir オプション

第23回で説明した通り,lxc-start-ephemeralコマンドは既存のコンテナの一時的なコピーを使ってコンテナを作成し,起動するコマンドです。

このコマンドのオプションにホスト上のディレクトリをコンテナ内にバインドマウントするための--bdirというオプションがありました。

LXC 1.1では,--bdirに加えて,バインドマウントでなく,ホスト上のディレクトリを下層側のディレクトリとして,コンテナ用に作成したディレクトリを上層側ディレクトリとしてoverlayfsでマウントするための--cdirオプションが追加されました。

--bdirだとホスト上に存在するディレクトリやファイルが直接操作されてしまいます。新しく追加された--cdirを使うと,ホスト上のディレクトリやファイルをコンテナ内で使いたいけれども,変更はしたくない場合に使えます。

試してみましょう。

$ sudo lxc-ls -f
NAME  STATE    IPV4  IPV6  GROUPS  AUTOSTART  
--------------------------------------------
ct01  STOPPED  -     -     -       NO         
$ touch /home/ubuntu/gihyo-test

lxc-start-ephemeralコマンドで起動するコンテナの元となるコンテナを作成します。そしてホスト上に/home/ubuntu/gihyo-testというファイルを作りました。準備ができたので一時的なコンテナを起動しましょう。

$ sudo lxc-start-ephemeral -o ct01 --cdir /home -d -k
setting rootfs to .%s. /var/lib/lxc/ct01-9dcya3fq/rootfs
The ephemeral container is now started.

You can enter it from the command line with: lxc-console -n ct01-9dcya3fq
The following IP addresses have be found in the container:
 - 10.0.3.169

上記の例のように--cdir /homeと指定して,ホストの/homeがコンテナ内でも見えるようにしています。起動したところでlxc-attachコマンドでコンテナ内に入ってみます。

$ sudo lxc-attach -n ct01-9dcya3fq
root@ct01-9dcya3fq:~# cat /proc/mounts | grep overlay
none / overlay rw,relatime,lowerdir=/var/lib/lxc/ct01/rootfs,upperdir=/var/lib/lxc/ct01-9dcya3fq/tmpfs/delta0,workdir=/var/lib/lxc/ct01-9dcya3fq/tmpfs/work0 0 0
none /home overlay rw,relatime,lowerdir=/home,upperdir=/var/lib/lxc/ct01-9dcya3fq/tmpfs/delta1,workdir=/var/lib/lxc/ct01-9dcya3fq/tmpfs/work1 0 0

コンテナ内で/proc/mountsを確認してみると,第23回で説明したように/がoverlayfsでマウントされている以外に,--cdir /homeで指定した通り/homeがoverlayfsでマウントされていることがわかります。

コンテナ内の/homeを,下層ディレクトリとしてホストの/homeを使い,上層ディレクトリとしてコンテナディレクトリ内に作られたtmpfs内のdelta1というディレクトリを使い,workdirとしてtmpfs内のwork1を使い,overlayfsマウントして準備しているのがわかります。

root@ct01-9dcya3fq:~# ls /home/ubuntu
gihyo-test (ホストの/home/ubuntuの内容が見えている)
root@ct01-9dcya3fq:~# touch /home/ubuntu/container (/home/ubuntuにファイルを作成)
root@ct01-9dcya3fq:~# ls /home/ubuntu
container  gihyo-test

コンテナ内で/home/ubuntuを見てみると,確かにホスト上で作ったファイルが見えています。ここで新たにコンテナ内でファイルを作ってみましょう。コンテナ内では当然作成したファイルが見えていますね。

ここでホスト上で/home/ubuntuを確認してみましょう。

$ ls /home/ubuntu
gihyo-test (ホスト上は元のファイルしかない)

上記のようにコンテナ内で作ったファイルはありません。コンテナ用の上層ディレクトリ内を確認してみると,以下のようにコンテナ内で作成したファイルが存在しています。

$ sudo ls -F /var/lib/lxc/ct01-9dcya3fq/tmpfs/delta1/ubuntu
container (コンテナ内で作成したファイルはoverlayfsのupperdirに作成されている)

まとめ

今回はLXC 1.1の新機能や変更点のうち,主にコマンドの動きに関わる変更点を紹介しました。

次回も引き続きLXC 1.1の新機能や変更点を紹介します。

著者プロフィール

加藤泰文(かとうやすふみ)

2009年頃にLinuxカーネルのcgroup機能に興味を持って以来,Linuxのコンテナ関連の最新情報を追っかけたり,コンテナの勉強会を開いたりして勉強しています。英語力のない自分用にLXCのmanページを日本語訳していたところ,あっさり本家にマージされてしまい,それ以来日本語訳のパッチを送り続けています。

Plamo Linuxメンテナ

Twitter:@ten_forward
技術系のブログ:http://tenforward.hatenablog.com/