LXCは、
この仕組みはlxc-autostart
コマンドから使います。このコマンドを使って、
今回の実行例はUbuntu 14.
設定
この仕組みはコンテナの設定ファイルで設定して使用します。まずはこの自動起動の仕組みに関係するコンテナの設定項目を紹介しましょう。
設定項目 | 設定項目の説明 | デフォルト値 |
---|---|---|
lxc. |
コンテナlxc-autostart の対象にするかどうかを設定。0 |
0 |
lxc. |
コンテナが属するコンテナグループ名 | |
lxc. |
コンテナを起動させた後、 |
0 |
lxc. |
対象のコンテナが複数ある場合の起動順。整数を指定する |
lxc.start.auto
lxc-autostart
で処理を行いたいコンテナは、lxc.
を1に設定します。デフォルトではlxc.
は0なのでlxc-autostart
の処理対象にはなりません。
lxc.group
lxc.
を使ってコンテナをグループ分けできます。このグループはlxc-autostart
でのみ使われ、
lxc.
には複数の値を指定できます。以下の例のようにスペースで区切って複数の値を指定します。また、lxc.
を複数回指定しても構いません。
# lxc-autostartの対象とする
lxc.start.auto = 1
# コンテナは group01 と group02 に属する
lxc.group = group01 group02
# 更に group03 に属する
lxc.group = group03
以上のように設定したコンテナ"ct01"は"group01"、
$ sudo lxc-ls -f ct01 NAME STATE IPV4 IPV6 AUTOSTART ---------------------------------------------------------- ct01 STOPPED - - YES (group01, group02, group03)
lxc.
を指定していないコンテナは、
lxc.start.delay
lxc-autostart
を使って複数のコンテナを起動する際、lxc.
を設定します。lxc.
を設定したコンテナが起動した後、
lxc.start.order
lxc.
はlxc-autostart
で指定したグループに属するコンテナの起動順を指定する必要がある場合に指定します。この順番はあくまで同じグループ内に属するコンテナ間の順序を決めます。別のグループに属するコンテナとの間の起動順は、
lxc.
に指定する値は整数で、
ただし、
現時点では、
lxc-autostartコマンドの実行
設定について一通り紹介が済んだ所で、lxc-autostart
を使ったコンテナの起動を見ていきましょう。
まずはlxc-autostart
コマンドのオプションを見ておきましょう。
オプション | オプションの説明 |
---|---|
-r,--reboot | コンテナのリブート |
-s,--shutdown | コンテナのシャットダウン |
-k,--kill | コンテナの強制終了 |
-t,--timeout | コンテナ停止時のタイムアウト時間の指定 |
-g,--group | グループの指定 |
-L,--list | 実際の処理は行わず対象のコンテナのリストを表示する |
-a,--all | lxc. |
-r
、-s
、-k
、-t
という停止に関係するオプションは第8回で説明したlxc-stop
マンドのオプションと同じです。
グループを指定したlxc-autostartコマンドの実行
それでは、lxc-autostart
コマンドでグループを指定して複数のコンテナを起動してみましょう。
グループの指定ではカンマ区切りで複数のグループを指定できます。また-g
オプションを複数回指定できます。複数のグループを指定した場合は、
たとえば、
$ sudo lxc-ls -f NAME STATE IPV4 IPV6 AUTOSTART ---------------------------------------- ct01 STOPPED - - YES (group01) ct02 STOPPED - - YES (group02) ct03 STOPPED - - YES (group03)
ここで"group01"と"group02"を指定してlxc-autostart
コマンドを実行します。
$ sudo lxc-autostart -g group01,group02 (group01,group02に属するコンテナの起動) $ sudo lxc-ls -f NAME STATE IPV4 IPV6 AUTOSTART ---------------------------------------------- ct01 RUNNING 10.0.3.87 - YES (group01) ct02 RUNNING 10.0.3.241 - YES (group02) ct03 STOPPED - - YES (group03) $ sudo lxc-autostart -g group01,group02 -s (group01,group02に属するコンテナの停止)
指定したグループに属するコンテナのみ起動していますね。以上の例ではカンマ区切りでグループを指定しましたが、-g
を複数回指定することもできます。
$ sudo lxc-autostart -g group01,group02 -g group03 (group01,group02,group03に属するコンテナの起動) $ sudo lxc-ls -f NAME STATE IPV4 IPV6 AUTOSTART ---------------------------------------------- ct01 RUNNING 10.0.3.87 - YES (group01) ct02 RUNNING 10.0.3.241 - YES (group02) ct03 RUNNING 10.0.3.20 - YES (group03) $ sudo lxc-autostart -g group01,group02 -g group03 -s (group01,group02,group03に属するコンテナの停止)
1つ目の-g
で2つグループを指定し、-g
で1つグループを指定してみましたが、
全てのコンテナに対するlxc-autostartコマンドの実行
-a
オプションを使い、lxc.
が設定されたコンテナ全てを処理対象にできます。
$ sudo lxc-autostart -a (lxc.start.auto=1が設定された全てのコンテナの起動) $ sudo lxc-ls -f NAME STATE IPV4 IPV6 AUTOSTART ---------------------------------------------- ct01 RUNNING 10.0.3.87 - YES (group01) ct02 RUNNING 10.0.3.241 - YES (group02) ct03 RUNNING 10.0.3.20 - YES (group03) $ sudo lxc-autostart -a -s (lxc.start.auto=1が設定された全てのコンテナの停止)
NULLグループの指定
先に説明した"NULL"グループに属するコンテナを-g
オプションでどのように指定するのかを紹介しましょう。
$ sudo lxc-ls -f NAME STATE IPV4 IPV6 AUTOSTART ---------------------------------------- ct01 STOPPED - - YES ct02 STOPPED - - YES (group02) ct03 STOPPED - - YES (group03)
以上のようにコンテナ"ct01"のみグループに属していません。ここで"ct01"のみを指定するには以下のように空文字列を指定します。
$ sudo lxc-autostart -g "" (NULLグループを指定してコンテナを起動) $ sudo lxc-ls -f NAME STATE IPV4 IPV6 AUTOSTART --------------------------------------------- ct01 RUNNING 10.0.3.87 - YES ct02 STOPPED - - YES (group02) ct03 STOPPED - - YES (group03) $ sudo lxc-autostart -g "" -s (NULLグループを指定してコンテナを停止)
ただし、-g
オプションを指定せずにlxc-autostart
コマンドを実行しても同じです。
$ sudo lxc-autostart (-gオプションを指定せずに実行) $ sudo lxc-ls -f NAME STATE IPV4 IPV6 AUTOSTART --------------------------------------------- ct01 RUNNING 10.0.3.87 - YES ct02 STOPPED - - YES (group02) ct03 STOPPED - - YES (group03) $ sudo lxc-autostart -s (-gオプションを指定せずにコンテナを停止)
"NULL"グループを含む複数のグループも指定できます。
$ sudo lxc-autostart -g "" -g group02 (NULLグループとgroup02を指定してコンテナを起動) $ sudo lxc-ls -f NAME STATE IPV4 IPV6 AUTOSTART ---------------------------------------------- ct01 RUNNING 10.0.3.87 - YES ct02 RUNNING 10.0.3.241 - YES (group02) ct03 STOPPED - - YES (group03) $ sudo lxc-autostart -g "" -g group02 -s (NULLグループとgroup02を指定してコンテナを停止)
"NULL"グループの指定は次のようにも指定できます。
$ sudo lxc-autostart -g ,group02 (グループ指定をカンマから始める) $ sudo lxc-autostart -g group02, (グループ指定をカンマで終わる) $ sudo lxc-autostart -g group02,,group03 (カンマを2つ続ける)
対象コンテナのリスト表示
ここまではlxc-autostart
コマンドを使って、
これが-L
オプションです。このオプションを使うと、lxc.
の設定も反映した順でコンテナ名とlxc.
の値がリスト表示されます。
"ct01"、lxc.
と設定した同じグループに属するコンテナに対して-L
オプションを付けると以下のように出力されます
$ sudo lxc-autostart -L ct01 1 ct02 1 ct03 1
Ubuntu起動時のlxc-autostartの使用
一通りlxc-autostart
コマンドの使い方を見た所で、lxc-autostart
コマンドがどのように使われているのかを見てみましょう。
Ubuntuでlxcパッケージをインストールすると、
$ dpkg -L lxc | grep /etc/init/ /etc/init/lxc.conf /etc/init/lxc-instance.conf /etc/init/lxc-net.conf
このうち、lxc-net.
は第8回で説明したUbuntuで設定されるLXC用のネットワークを作成するための定義ファイルです。
これ以外の2つのファイル内で、
コンテナの自動起動と停止は、lxc-autostart
を直接使ってるのかと思って確認してみましたが、
まず、/etc/
で定義されています。
$ grep LXC_AUTO /etc/default/lxc # LXC_AUTO - whether or not to start containers symlinked under LXC_AUTO="true"
このLXC_
がtrue
になっているときだけ、
続いて/etc/
を見てみましょう。
:(略)
4: start on runlevel [2345]
5: stop on starting rc RUNLEVEL=[016]
6:
7: env LXC_AUTO="false"
:(略)
16: env BOOTGROUPS="onboot,"
:(略)
33: pre-start script
34: [ -f /etc/default/lxc ] && . /etc/default/lxc
:(略)
45: [ "x$LXC_AUTO" = "xtrue" ] || exit 0
46:
47: if [ -n "$BOOTGROUPS" ]
48: then
49: BOOTGROUPS="-g $BOOTGROUPS"
50: fi
51:
52: # Process the "onboot" group first then the NULL group.
53: lxc-autostart -L $OPTIONS $BOOTGROUPS | while read line; do
54: set -- $line
55: (start lxc-instance NAME=$1 && sleep $2) || true
56: done
57: end script
自動起動に関係する行だけ抜き出しましたので簡単にみていきましょう。
- 先に紹介した
LXC_
がAUTO true
の時のみ、自動起動が実行されるようになっています (7,34,45行目) - OS起動時に自動起動するコンテナとして"onboot"グループに属するコンテナと"NULL"グループに属するコンテナが指定されています
(16, 49行目) - "onboot"グループ、
"NULL"グループの順で対象コンテナをリストアップして、 コンテナ名を1つずつ順に与えながら"lxc-instance"というジョブを開始させ、 その後 lxc.
で指定した秒数だけsleepしていますstart. delay (53〜56行目)
ジョブ"lxc-instance"は/etc/
で定義されており、
:(略)
4: stop on stopping lxc
:(略)
10: kill signal SIGPWR
:(略)
13: instance $NAME
:(略)
16: pre-start script
17: lxc-wait -s RUNNING -n $NAME -t 0 && { stop; exit 0; } || true
18: end script
19:
20: script
21: exec lxc-start -n $NAME
22: end script
"lxc-instance"ジョブは以下のように動くように定義されています。
- "lxc"ジョブが停止する時
(runlevel 0,1,6に入る時) に停止します (4行目) - 停止の際はプロセスに
SIGPWR
シグナルを送ります。つまりコンテナのinitにSIGPWRを送っていることになります(10行目) - 対象のコンテナが既に起動している時はジョブを停止し、
ジョブの処理部分は実行しません (16~18行目) - 引数
NAME
で与えられた値を引数にlxc-start -n $NAME
コマンドを実行します。つまりジョブ"lxc"から与えられたコンテナ名を引数にコンテナを起動しています(20~22行目)
つまりホストOS起動時はlxc-autostart -L
で対象コンテナをリストアップして、lxc-start
しているわけですね。停止の時はlxc-autostart -s
もlxc-stop
も使わずに直接コンテナのinitプロセスにシャットダウン用のシグナルを送っています。
ここではホストOSがUbuntuで、
LXCに同梱されているスクリプトをベースにしているディストリビューションでは、
まとめ
今回は複数のコンテナをまとめて起動できるlxc-autostart
コマンドを紹介しました。このコマンドを使ってホストOS起動時に同時にコンテナを起動したり、
Ubuntuではlxc-autostart
を使ってホストOS起動時にコンテナを起動できるようになっています。その仕組みについても簡単に紹介しました。お使いのディストリビューションでも、