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

第11回LXCの設定[1]

前回まででLXCに付属しているコマンドの説明が済みましたので、今回からはLXCの設定について説明していきたいと思います。

LXCの設定は2つに分かれます。システムの設定とコンテナの設定です。

システムの設定
LXCがシステム全体で共通して使用する値を設定します。コンテナの保存場所やストレージバックエンドの設定などです。
コンテナの設定
各コンテナの動作を決定する設定です。コンテナごとに設定ファイルが存在します。

Ubuntuにおけるシステム設定が書かれたファイルや、システム設定で設定される各種の値については第8回で紹介しました。

設定ファイルの書式

LXCの設定ファイルの書式はシンプルです。

  • 設定は『設定項目名 = 設定値』という形式で1行につき1つ設定します("="の前後のスペースはなくても構いません)
  • 行頭が "#" で始まる場合、その行はコメントとなります
  • 各設定項目名の頭には "lxc." が付きます

以下のように設定行の途中で "#" を記載してコメントは書けません。

# この行はコメントです
lxc.arch = x86_64 # このようなコメントは許されません

設定項目の頭に必ず "lxc." と付けなければいけないのは少し冗長に思えますね。

システムの設定

システムの設定で設定できる項目は前回紹介したlxc-configコマンドで一覧できます。

# lxc-config -l
lxc.default_config
lxc.lxcpath
lxc.bdev.lvm.vg
lxc.bdev.lvm.thin_pool
lxc.bdev.zfs.root

このコマンドで設定可能な項目が一覧できるはずなのですが、実はこれ以外にも設定項目があり、以下のような項目でcgroup関係の設定ができます。

  • lxc.cgroup.use
  • lxc.cgroup.pattern

現時点のlxc-configコマンドにはなぜかその設定を確認する実装がされていません[1]⁠。

lxc.default_config

lxc.default_configで指定したファイルの内容は、lxc-createコマンドを使ってコンテナを作成した場合に、生成されるコンテナの設定ファイルにコピーされます。

Ubuntuの場合、lxc.default_configの値は/etc/lxc/default.confに設定されており、内容は以下のようにネットワーク関係の設定が書かれています。

# lxc-config lxc.default_config
/etc/lxc/default.conf
# cat /etc/lxc/default.conf
lxc.network.type = veth
lxc.network.link = lxcbr0
lxc.network.flags = up
lxc.network.hwaddr = 00:16:3e:xx:xx:xx

この設定がlxc-createで作成したコンテナにコピーされている様子は第8回lxc-createを使ったコンテナの作成を説明したところで紹介しました。

ネットワークの設定以外にも作成するコンテナに自動で設定したい項目がある場合はlxc.default_configで指定されているファイルに記載すると良いでしょう。

lxc.path

lxc.path第8回で紹介した通り「コンテナの保存場所」です。

デフォルト値はコンパイル時に指定した値になります。このパスを変更したい場合は指定すると良いでしょう。

Ubuntu の場合、この値は/var/lib/lxcとなっています。

lxc.cgroup.use

LXCで使用するcgroupのサブシステムを指定します。執筆時点の1.0.5ではcgmanagerを使ってcgroupを管理している場合は無視されます。

たとえば以下のように指定すると、指定したcpu、cpuset、memoryサブシステムのみを使ってコンテナを起動します。

lxc.cgroup.use = cpu,cpuset,memory

lxc.cgroup.pattern

コンテナを起動する際にcgroupfsに作成するLXCコンテナ用のグループのパターンを指定します。

デフォルトではこの値はlxc/%nとなっています。%nはコンテナ名に置き換わります。

このデフォルトの設定で、cpuサブシステムが/sys/fs/cgroup/cpuにマウントされているときにct01というコンテナを起動すると/sys/fs/cgroup/cpu/lxc/ct01ct01用のグループを作成します。

lxc.cgroup.pattern = hoge/%n

と設定すると、上記の例でのct01用のグループは/sys/fs/cgroup/cpu/hoge/ct01に作成されます。


システム設定のうちlxc.bdev.で始まる設定はストレージバックエンドの設定です。これらの設定については、この連載の後の回で解説します。

システム設定の詳細についてはman lxc.system.confでご覧になれます。

コンテナの設定

システムの設定は、デフォルト値のまま使用することも多いでしょうし、一度設定すれば頻繁に変更するものでもありません。

それに対してコンテナの設定は本格的にコンテナを運用する場合には変更する場合も多いでしょう。こちらは設定項目もかなりの数にのぼります。

コンテナの設定についてはman lxc.container.confで詳細を調べられます。

lxc-createでコンテナを作成した際に自動的に作られる設定ファイルやLXCが標準で準備する設定ファイルにある項目から順に見ていきましょう。

設定ファイルのinclude ~lxc.include

lxc.includeは文字通り他に準備した設定ファイルをincludeする設定です。LXCは共通で使用する推奨の設定があらかじめ準備されており、lxc-createではそれをincludeする設定が作成されます。

Ubuntuコンテナを作成した場合は以下のような設定がなされ、指定したファイルに書かれた設定が読み込まれます。

lxc.include = /usr/share/lxc/config/ubuntu.common.conf

コンテナのアーキテクチャの設定 ~lxc.arch

lxc.archでコンテナのアーキテクチャを設定します。x86_64やamd64という64ビットのアーキテクチャのホストでは32bitのバイナリも実行できますので、その場合i686などと設定します。

コンテナのルートファイルシステム ~lxc.rootfs

コンテナイメージが保存されているルートファイルシステムを指定します。

ストレージバックエンドがディレクトリであるとき、コンテナの'/'(ルート)にあたるディレクトリのホス トOS上でのパスを指定します。他にイメージファイルやブロックデバイスも指定できます。

lxc.rootfs = /var/lib/lxc/ct01/rootfs

コンテナのホスト名 ~lxc.utsname

lxc.utsnameでコンテナのホスト名を指定します。コンテナ起動時に新しいUTS名前空間が作成され指定したホスト名が設定されます。

コンテナ内でのマウント

コンテナ内でマウントしたいエントリを指定できます。コンテナ起動時にはマウント名前空間を作成しますので、コンテナ内でマウントしてもホストや他のコンテナからそのマウントは見えません。

マウントを指定するにはエントリを設定ファイル内に書く方法と、別ファイルに書いておいてそれを読み込む方法があります。

マウントを指定する書式はfstabと同じ形式です。マウントポイントはlxc.rootfsで指定したコンテナのルートからの相対パスで書けます。たとえば

proc proc proc nodev,noexec,nosuid 0 0

のように書くと、コンテナの/procにprocファイルシステムがマウントされます。

ホストのディレクトリやファイルをバインドマウントしたい場合は、バインドマウント対象のホストOS上でのフルパスをマウント対象として指定します

/sys/fs/fuse/connections sys/fs/fuse/connections none bind,optional 0 0

以上のように指定するとホストの/sys/fs/fuse/connectionsがコンテナ内の同じ場所にバインドマウントされます。

各マウントエントリの指定 ~lxc.mount.entry

設定ファイル内でマウントエントリを指定する場合はlxc.mount.entryを指定します。複数のマウントを行う場合はこのエントリを繰り返し書きます。

先に紹介したprocファイルシステムをマウントする場合は以下のように書きます。

lxc.mount.entry = proc proc proc nodev,noexec,nosuid 0 0

LXCがインストールするUbuntu用共通設定ファイル/usr/share/lxc/config/ubuntu.common.confにはこの設定が複数書かれています。参考にしてください。

マウントを指定したファイルの読み込み ~lxc.mount

マウントエントリが複数あって設定ファイルから分離したい場合は、fstabと同じ書式のファイルを別に準備してlxc.mountでそのファイルのホストOS上でのフルパスを指定します。

lxc.mount = /var/lib/lxc/ct01/fstab

コンテナ内での自動的なマウント ~lxc.mount.auto

procやsysfsやcgroupといった、Linuxで標準的にマウントするカーネル関連のファイルシステムは、先に紹介したlxc.mountlxc.mount.entryを使ってマウントするかわりに、簡単な設定で通常マウントするパスにマウントできます。このようなときに使う設定がlxc.mount.autoです。

lxc.mount.autoはproc、sys、cgroupのうちから必要なファイルシステムをスペースで区切って複数指定できます。

lxc.mount.auto = proc sys cgroup

procsyscgroupのいずれも、コロン(":")に続けてどのようにマウントするかをオプションで指定できます。

proc

lxc.mount.autoを使ってprocファイルシステムをマウントする場合はprocproc:mixedproc:rwのいずれかを指定します。

proc:mixedまたはproc
/proc が読み書き可能でマウントされます。ただし、/proc/sys/proc/sysrq-triggerだけが読み込み専用でマウントされます。
proc:rw
/procを読み書き可能でマウントします。

sys

lxc.mount.autoを使ってsysfsをマウントするには、syssys:rosys:rwのいずれかを指定します。

sys:roまたはsys
/sysは読み込み専用でマウントされます。
sys:rw
/sysを読み書き可能でマウントします。

cgroup

cgroupに関する指定をすると、コンテナ内の/sys/fs/cgroup以下に自身に関係するcgroupfsが現れます。

lxc.mount.autoでcgroupを指定する場合、cgroupと指定するか、cgroup-fullと指定するかによって、cgroupの階層構造のマウント方法が異なります。

cgroup:mixed/sys/fs/cgroupをtmpfsでマウントし、そのコンテナ自身を管理するcgroupとその階層構造をすべて作成します。そしてコンテナ自身を管理するホスト上のcgroupをバインドマウントします。コンテナ自身を管理するcgroup以外の階層は読み込み専用でディレクトリのみ存在します。つまりコンテナ自身を管理するcgroupだけが見えていて、そこのファイルだけ読み書きができます。

たとえば、"plamo01"というコンテナをlxc.mount.auto = cgroup:mixedという設定で起動した場合、コンテナ内の/sys/fs/cgroupは以下のようになります。

# tree -d /sys/fs/cgroup/
/sys/fs/cgroup/
|-- blkio           (ディレクトリのみ。読み込み専用)
|   `-- lxc         (ディレクトリのみ。読み込み専用)
|       `-- plamo01 (cgroupfsのファイルが存在する。読み書き可能)
|-- cpu             (ディレクトリのみ。読み込み専用)
|   `-- lxc         (ディレクトリのみ。読み込み専用)
|       `-- plamo01 (cgroupfsのファイルが存在する。読み書き可能)
    :(以下略: 各サブシステムのディレクトリが同様に作成される)

cgroup:rocgroup:mixedと同様にマウントされます。しかしすべてのディレクトリが読み込み専用となります。

cgroup:rwcgroup:roと逆にすべてのディレクトリが読み書き可能となります。ただし、コンテナ自身を管理するcgroup以外のディレクトリはcgroupfsのディレクトリのように各種ファイルがあるわけではなく空のディレクトリですので、コンテナの親cgroup上で何かが制御できるわけではありません。

cgroupのようにオプションの指定がない場合は、コンテナがCAP_SYS_ADMINケーパビリティを持っている場合はcgroup:rwと同じに、持っていない場合はcgroup:mixedと同じになります。

cgroup-full:mixedcgroup:mixedと違って、コンテナ自身を管理するcgroupに至るまでの親ディレクトリもすべてホストOSのcgroupfsと同様にcgroupfsのファイルが存在しています。ただし、コンテナ自身を管理するcgroup以外は読み込み専用となっています。

たとえば、"plamo01"というコンテナをlxc.mount.auto =cgroup-full:mixedという設定で起動した場合は以下のようになります。

# tree -d /sys/fs/cgroup/
/sys/fs/cgroup/
|-- blkio           (cgroupfsのファイルが存在する。読み込み専用)
|   `-- lxc         (cgroupfsのファイルが存在する。読み込み専用)
|       `-- plamo01 (cgroupfsのファイルが存在する。読み書き可能)
|-- cpu             (cgroupfsのファイルが存在する。読み込み専用)
|   `-- lxc         (cgroupfsのファイルが存在する。読み込み専用)
|       `-- plamo01 (cgroupfsのファイルが存在する。読み書き可能)
    :(以下略: 各サブシステムのディレクトリが同様に作成される)

cgroup-full:rocgroup-full:mixedと同様にマウントされますが、すべてのディレクトリが読み込み専用となります。

cgroup-full:rwcgroup-full:mixedと同様にマウントされますが、すべてのディレクトリが読み書き可能となります。

cgroup-fullのようにオプションの指定がない場合は、コンテナがCAP_SYS_ADMINケーパビリティを持っている場合はcgroup-full:rwと同じに、持っていない場合はcgroup-full:mixedと同じになります。

このようにlxc.mount.autoによってcgroupのマウントの細かい制御ができます。しかし、今のところホストOSがcgmanagerによってcgroupを管理している場合は、ホストOSの/sys/fs/cgroup以下には実際のサブシステムがマウントされていないため、lxc.mount.autoを使ってもコンテナ内にcgroupがマウントされません。

端末関連

コンテナにログインする際に使用するコンソールについて設定できます。

コンソール出力 ~lxc.console

コンテナをフォアグラウンドで起動した場合のコンソールを割り当てるデバイスのパスを指定します。通常は指定する必要はあまりないと思います。コンソールを無効にしたい場合は'none'を指定します。

バックグラウンド起動した場合に起動時などのコンソール出力を見たい場合は、lxc-start-Lオプションを使えばファイルに保存できます。

# lxc-start -n ct01 -d -L /path/to/console.log

LXC 1.0.6からはlxc.console.logpathという設定が新設され、-Lオプションを指定したときと同じことが設定ファイルで指定できるようになります。

lxc.console.logpath = /path/to/console.log

使用可能なTTY数 ~lxc.tty

lxc-consoleコマンドで接続するコンソールをコンテナ内で作成できる数を指定します。実際にはコンソールはinitから起動されるgettyなどのプログラムが作成しますが、ここに設定した数以上には作成できません。

lxc.tty = 4

同様にコンテナで使用できる疑似端末の上限を設定できるlxc.ptsが存在しますが、実際に制限するコードはまだ実装されていません。

cgroup 関連

cgroupを使ってリソースを制限したい場合はlxc.cgroup.に続けてcgroupfs内に存在するファイルの名前をそのまま指定します。ホストOSのカーネルでサポートされていなかったり、マウントされていないという理由で存在しないサブシステムのファイル名は当然使えません。

# devicesサブシステムのdevices.denyに"a"を設定する
lxc.cgroup.devices.deny = a
# memoryサブシステムのmemory.limit_in_bytesに128Mを設定する
lxc.cgroup.memory.limit_in_bytes = 128M

/dev ディレクトリ

LXCはコンテナが起動する際に/dev以下にfdstdinstdoutstderrを作成しますが、その他は特に何もしません。

しかし、コンテナ内でsystemdが動作する場合に必要な最小限のデバイスファイルを作成するオプションとしてlxc.autodevという設定が存在します。デフォルトは0に設定されていて無効になっていますが、systemd環境のコンテナを使う場合は1に設定します。

lxc.autodev = 1

systemdベースのディストリビューションのコンテナをlxc-createを使って作成する場合は、この設定が書かれた設定ファイルをincludeするか、テンプレートが設定ファイルに設定するようになっています。

まとめ

今回はLXCのシステム設定とコンテナの設定の一部を紹介しました。次回はセキュリティ関係とネットワーク関係の設定を紹介する予定です。

今回は設定項目を淡々と説明するだけになりましたが、次回は設定した場合の実際の動きも紹介しながら解説する予定です。

LXC 1.0.6

9月24日にLXC 1.0.6がリリースされました。このバージョンではlxc-startに新たにフォアグラウンド起動を指定する-Fオプションが新設されました。

1.0系列ではフォアグラウンドがデフォルトなのでわざわざ指定する必要はありません。しかし、1.1ではバックグラウンドがデフォルトになる予定なので、スクリプト内でlxc-startを呼び出している場合に動きが変わらないように今から準備できるようにするためです。

その他も多数の修正がされています。変更点は公式サイトのNewsにあり、日本語訳も公開していますので興味がある方はご覧ください。

おすすめ記事

記事・ニュース一覧