NAME¶
lxc - Linux コンテナ
クイックスタート¶
急いでいて、この man
  ページすら読みたくないという場合は、いいでしょう、
  保証はないですが、あらかじめ準備されている設定テンプレートを使ったコンテナ内でシェルを動かすためのコマンドを紹介しましょう。
  
/usr/bin/lxc-execute -n foo -f
  /usr/share/doc/lxc/examples/lxc-macvlan.conf /bin/bash
コンテナ技術は、メインストリームの
  linux kernel
  で活発に開発が進んでいる技術です。
  コンテナ技術は、process
  container
  という名前でも知られる
  control groups
  の機能を使って、リソース管理を提供し、名前空間を使って、リソースの隔離を提供します。
linux コンテナ ( 
lxc)
  は、ユーザースペースのコンテナオブジェクトを提供するための新しい機能を使う事を目指しています。
  この新しい機能とは、アプリケーションやシステムでの利用を目的とした、完全なリソースの隔離やリソースコントロールを提供する機能です。
このプロジェクトの第一の目的は、コンテナプロジェクトに参加するカーネル開発者の作業を快適にすることと、特に新機能である
  Checkpoint/Restart
  機能への取り組みを続ける事です。
  
lxc
  コマンドは、シンプルなコマンドでコンテナの管理を簡単に行えるように小さく、他の目的のために使うのに充分な機能を持っています。
必要条件¶
lxc
  は、カーネルが提供するいくつかの機能に依存しており、その機能がアクティブになっている必要があります。
  機能が足りない場合は、
  
lxc
  は、いくつかの機能が制限されるか、単純に動作が失敗します。
以下のリストは、コンテナの全機能を有効にするために、カーネルで有効にする必要のある機能の一覧です。
	    * General setup
	      * Control Group support
	        -> Namespace cgroup subsystem
	        -> Freezer cgroup subsystem
	        -> Cpuset support
	        -> Simple CPU accounting cgroup subsystem
	        -> Resource counters
	          -> Memory resource controllers for Control Groups
	      * Group CPU scheduler
	        -> Basis for grouping tasks (Control Groups)
	      * Namespaces support
	        -> UTS namespace
	        -> IPC namespace
	        -> User namespace
	        -> Pid namespace
	        -> Network namespace
	    * Device Drivers
	      * Character devices
	        -> Support multiple instances of devpts
	      * Network device support
	        -> MAC-VLAN support
	        -> Virtual ethernet pair device
	    * Networking
	      * Networking options
	        -> 802.1d Ethernet Bridging
	    * Security options
	      -> File POSIX Capabilities
      
2.6.27
  以上のバージョンが採用されているディストリビューションならば、
  
lxc
  は動作するでしょう。
  機能的には若干少ない形ですが、充分に楽しめるはずです。
  2.6.29
  カーネルであれば、
  
lxc
  は完全に機能します。
  ヘルパースクリプトの
  
lxc-checkconfig
  を使って、あなたのカーネルの設定に関する情報を取得できるでしょう。
lxc
  を使う前に、システムがファイルに対するケーパビリティーをえられるように設定するか、もしくは
  
lxc コマンドを root
  で実行する必要があるでしょう。
control group
  は、どこにでもマウント可能です。
  例えば、 
mount -t cgroup cgroup /cgroup
  のようにです。
  もし、異なる場所で、異なるオプションでマウントされた別々の
  cgroup
  を持ち、一つの場所の
  
lxc
  コマンドを使うための、特定の
  
lxc のための専用の cgroup
  のマウントポイントを提供したければ、lxc
  という名前でマウントポイントにバインドすることが出来ます。例えば以下のようにです。
  
mount -t cgroup lxc /cgroup4lxc or 
mount -t cgroup
  -ons,cpuset,freezer,devices lxc /cgroup4lxc
機能仕様¶
コンテナは、コンテナ内で実行されているシステムやアプリケーションに対するホストのリソースのいくつかが、隔離されているオブジェクトです。
アプリケーション/システムは、あらかじめ作成された設定もしくは開始コマンドのパラメータで指定された設定で、コンテナ内で実行されます。
どうやってコンテナ内でアプリケーションを実行するのでしょう?
アプリケーションを実行する前に、隔離したいリソースについて知っておくべきです。
  デフォルトの設定では、pid、sysv
  ipc、マウントポイントが隔離されます。
  コンテナ内でシンプルなシェルを実行したい場合で、特に
  rootfs
  を共有したい場合、基本的な設定が必要です。
  もし、 
sshd
  のようなアプリケーションを実行したい場合、新しいネットワークスタックと、新しいホスト名を準備しなくてはなりません。
  もし、同じファイル (
  
/var/run/httpd.pid 等)
  の衝突を避けたい場合、空の
  
/var/run/
  を再度マウントしなければなりません。
  どんな場合でも、衝突を避けたい場合、コンテナ専用の
  rootfs
  を指定することができます。
  rootfs
  はディレクトリツリーとなる事も可能で、前もって元の
  rootfs を bind
  マウントし、しかし、自身の
  
/etc や
  
/homeを使って。自身のディストリビューションを使うことが可能です。
ここで、 
sshd
  のためのディレクトリツリーのサンプルを示しましょう。
 
	
[root@lxc sshd]$ tree -d rootfs
	
rootfs	
|-- bin	
|-- dev	
|   |-- pts
|   `-- shm
|       `-- network
|-- etc	
|   `-- ssh
|-- lib	
|-- proc
|-- root
|-- sbin
|-- sys	
|-- usr	
`-- var	
    |-- empty
    |   `-- sshd
    |-- lib
    |   `-- empty
    |       `-- sshd
    `-- run
        `-- sshd
      
 
そして、それに対応するマウントポイントのファイルは以下のようになります。
 
	[root@lxc sshd]$ cat fstab
	/lib /home/root/sshd/rootfs/lib none ro,bind 0 0
	/bin /home/root/sshd/rootfs/bin none ro,bind 0 0
	/usr /home/root/sshd/rootfs/usr none ro,bind 0 0
	/sbin /home/root/sshd/rootfs/sbin none ro,bind 0 0
      
コンテナ内でシステムを実行する方法は?
コンテナ内でシステムを実行するのは、逆説的ではありますが、アプリケーションを実行するよりも簡単です。
  それは、隔離するリソースについて考える必要がないからで、全てを隔離する必要があるからです。
  他のリソースは、コンテナが設定を行うので、設定なしで隔離されるように指定されます。
  例えば、IPv4
  アドレスはコンテナの
  init
  スクリプトでシステムによってセットアップされるでしょう。
  以下に、(システムを実行するときの)
  マウントポイントファイルを示します。
 
	[root@lxc debian]$ cat fstab
	/dev	/home/root/debian/rootfs/dev none bind 0 0
	/dev/pts /home/root/debian/rootfs/dev/pts  none bind 0 0
      
 
設定を手助けするために、コンテナに更なる情報を追加することも可能です。
  例えば、ホスト上に存在する
  resolv.conf
  ファイルをコンテナからアクセス可能にするには、以下のようにします。
 
	/etc/resolv.conf /home/root/debian/rootfs/etc/resolv.conf none bind 0 0
      
コンテナのライフサイクル¶
コンテナが作成されるとき、コンテナは設定情報を含みます。
  プロセスが生成されるとき、コンテナは開始し、実行されるでしょう。
  コンテナ内で実行されている最後のプロセスが終了したとき、コンテナは停止します。
コンテナの初期化時の失敗の場合は、(以下の図の)
  中断の状態を通ります。
   ---------
  | STOPPED |<---------------
   ---------                 |
       |                     |
     start                   |
       |                     |
       V                     |
   ----------                |
  | STARTING |--error-       |
   ----------         |      |
       |              |      |
       V              V      |
   ---------    ----------   |
  | RUNNING |  | ABORTING |  |
   ---------    ----------   |
       |              |      |
  no process          |      |
       |              |      |
       V              |      |
   ----------         |      |
  | STOPPING |<-------       |
   ----------                |
       |                     |
        ---------------------
      
コンテナは設定ファイル経由で設定します。設定の書式は以下で説明しています。
  
lxc.conf(5)
コンテナの生成と終了
  (持続性のコンテナ)¶
持続性のコンテナオブジェクトは
  
lxc-create
  コマンドで作成することができます。
  コマンドにはコンテナ名をパラメータとして、オプションで設定ファイルとテンプレートを指定します。
  ここで指定する名前は、他のコマンドからこのコンテナを参照する際に使います。
  
lxc-destroy
  コマンドはコンテナオブジェクトを破壊します。
 
	  lxc-create -n foo
	  lxc-destroy -n foo
	
揮発性のコンテナ¶
コンテナを開始する前にコンテナオブジェクトを作成する必要はありません。
  コンテナを設定ファイルのパラメータで指定して直接開始することができます。
コンテナの開始と終了¶
コンテナが作成されると、アプリケーションもしくはシステムとして実行することができます。
  このために使用するのが
  
lxc-execute と 
lxc-start
  コマンドです。
  アプリケーションが開始する前にコンテナが作成されなかった場合、コンテナはコマンドへ与えるパラメータを取得するのに設定ファイルを使うでしょう。
  もし、このようなパラメータもない場合は、デフォルトで指定されている通りに隔離されます。
  アプリケーションが終了した場合、コンテナも停止しますが、実行中のアプリケーションを停止するには
  
lxc-stop
  を使用する必要があります。
コンテナ内のアプリケーションの実行は、正確にはシステムとして実行するのとは異なります。
  そのような理由で、コンテナ内でアプリケーションを実行するためのコマンドには、2
  種類の違ったものがあります。
 
	  lxc-execute -n foo [-f config] /bin/bash
	  lxc-start -n foo [-f config] [/bin/bash]
	
lxc-execute
  コマンドは、
lxc-init
  プロセス経由で、コンテナ内で特定のコマンドを実行します。
  lxc-init
  はコマンドを実行した後、(コンテナ内でのデーモンの実行をサポートするために)
  実行したコマンドと生成された全てのプロセスが終了するのを待ちます。
  言いかえると、コンテナ内では
  
lxc-init は pid 1
  を持ち、アプリケーションの最初のプロセスは
  pid 2 をもちます。
lxc-start
  コマンドは、コンテナ内の特定のコマンドを直接実行します。
  最初のプロセスの pid が
  1 となります。
  もし、実行するコマンドが指定されない場合は、
  
lxc-start は 
/sbin/init
  を実行します。
まとめると、 
lxc-execute
  はアプリケーションを実行するためのコマンドであり、
  
lxc-start
  はシステムを実行するのにより適したコマンドです。
もしアプリケーションの反応がなくなった場合や、アクセスできなくなった場合、自分で終了することができない場合は、荒っぽいですが、
  
lxc-stop
  コマンドがコンテナ内の全てのプロセスを容赦なく停止させてくれるでしょう。
利用可能な TTY
  への接続¶
コンテナが tty
  を持つように設定されているならば、tty
  を通してコンテナにアクセスすることができます。
  それは以下のコマンドが使う
  tty
  がコンテナで利用可能に設定されているか次第です。
  tty
  が失われたとき、再度のログインなしでその
  tty
  に再接続することが可能です。
 
	  lxc-console -n foo -t 3
	
コンテナの凍結と解凍¶
ジョブスケジューリングなどで、コンテナに属する全てのプロセスを停止する事が役に立つときがあります。
  コマンド
 
	  lxc-freeze -n foo
	
 
は、全てのプロセスを中断不可能な状態に置きます。そして、
 
	  lxc-unfreeze -n foo
	
 
その全てのプロセスを再開します。
この機能は、カーネルで
  cgroup freezer
  機能が有効になっている場合に使用可能です。
コンテナに関する情報の取得¶
多数のコンテナが存在する場合、それらが実行されたり破壊されたりすること、何が実行されていて、特定のコンテナ内で実行されている
  pid
  が何であるかをフォローするのは大変です。
  このような時には、以下のようなコマンドが役に立つかもしれません。
 
	  lxc-ls
	  lxc-info -n foo
	
lxc-ls
  は、システムのコンテナを一覧します。
lxc-info
  は、指定したコンテナに関する情報を取得します。
ここで、以上のコマンドを組み合わせて、どのようにしたら全てのコンテナのリストと、それぞれの状態が得られるかの例を示します。
 
	  for i in $(lxc-ls -1); do
	    lxc-info -n $i
	  done
	
コンテナのモニタリング¶
時々、コンテナの状態を追跡することが出来ると便利な事があります。
  例えば、状態をモニタリングしたり、スクリプト内で特定の状態を待ったりするような場合です。
lxc-monitor
  コマンドは、一つもしくはいくつかのコンテナをモニタリングします。
  このコマンドのパラメータは、正規表現を受け付けます。例えば
 
	  lxc-monitor -n "foo|bar"
	
 
は 'foo' と 'bar'
  という名前のコンテナの状態をモニタリングします。そして、
 
	  lxc-monitor -n ".*"
	
 
は全てのコンテナの状態をモニタリングします。
コンテナ 'foo'
  が開始され、いくつか処理を行い、終了した場合、出力は以下のようになります。
 
	  'foo' changed state to [STARTING]
	  'foo' changed state to [RUNNING]
	  'foo' changed state to [STOPPING]
	  'foo' changed state to [STOPPED]
	
lxc-wait
  コマンドは指定した状態を待って、終了します。
  これは、コンテナの開始や終了に同期したいスクリプトで役に立ちます。
  パラメータは、異なった状態の論理和
  (OR) を指定します。
  以下の例は、バックグラウンドで実行されたコンテナをどのようにして待つかを示します。
 
	  # launch lxc-wait in background
	  lxc-wait -n foo -s STOPPED &
	  LXC_WAIT_PID=$!
	  # this command goes in background
	  lxc-execute -n foo mydaemon &
	  # block until the lxc-wait exits
	  # and lxc-wait exits when the container
	  # is STOPPED
	  wait $LXC_WAIT_PID
	  echo "'foo' is finished"
	
コンテナの CONTROL GROUP
  の設定 ¶
コンテナは control group
  と結合しています。
  コンテナが開始すると
  control group
  が生成され、それと結びつけられます。
  control group
  のプロパティは、lxc-cgroup
  コマンドを使って、コンテナが実行中に読み取ったり、変更したりすることができます。
lxc-cgroup
  コマンドは、コンテナと結びつけられている
  control group
  サブシステムを設定したり、取得したりするのに使います。
  サブシステム名の指定はユーザが行ない、このコマンドはサブシステム名の文法チェックは一切行ないません。
  もし、指定したサブシステム名が存在しない場合は、コマンドの実行は失敗します。
	  lxc-cgroup -n foo cpuset.cpus
	
 
は、このサブシステムの内容を表示します。
 
	  lxc-cgroup -n foo cpu.shares 512
	
 
は、このサブシステムに指定した値を設定します。
lxc
  はまだ開発中です。
  従って、コマンドの文法や
  API
  は変更される可能性があります。
  バージョン 1.0.0
  がそれらを凍結するバージョンとなるでしょう。
SEE ALSO¶
lxc(7), 
lxc-create(1), 
lxc-destroy(1), 
lxc-start(1),
  
lxc-stop(1), 
lxc-execute(1), 
lxc-console(1),
  
lxc-monitor(1), 
lxc-wait(1), 
lxc-cgroup(1),
  
lxc-ls(1), 
lxc-info(1), 
lxc-freeze(1),
  
lxc-unfreeze(1), 
lxc-attach(1), 
lxc.conf(5)
Daniel Lezcano <daniel.lezcano@free.fr>