前回説明したように、lxc-start-ephemeral
コマンドはLXCの持つフック機能をコンテナの準備と後始末に利用していました。lxc-start-ephemeral
コマンドが使っていたフックは3つだけでしたが、
今回は、
フックの仕様
LXCで使用できるフックの一覧を表1に示します。
フック |
説明 | 実行される名前空間 |
---|---|---|
lxc. |
コンテナのTTY、 |
ホスト |
lxc. |
コンテナのrootfsがマウントされる前に実行 | コンテナ |
lxc. |
マウントが完了後、 |
コンテナ |
lxc. |
lxc. |
コンテナ |
lxc. |
コンテナのinitが実行される直前に実行 | コンテナ |
lxc. |
コンテナがシャットダウンされた後に実行 | ホスト |
lxc. |
新しいコンテナにクローンされる際に実行 | コンテナ |
lxc.
以外は、
コンテナのフックが実行される際に、
- コンテナ名
- セクション
(常に'lxc') - フックのタイプ
- 追加の引数
(クローン時のみ)
またフック実行時には表2の環境変数が設定されます。
環境変数 | 内容 |
---|---|
LXC_ |
コンテナ名 |
LXC_ |
rootファイルシステムをマウントする/ |
LXC_ |
コンテナ設定ファイルのパス |
LXC_ |
クローン時、 |
LXC_ |
lxc. |
コンテナのルートファイルシステムのマウント処理
ここで、LXC_
に関係します。
コンテナのルートファイルシステムは、lxc.
により設定されます。Ubuntuの場合、lxc.
の値は/var/
となります。
しかし、lxc.
を別のディレクトリにバインドマウントします。このrootfsをマウントするディレクトリはlxc.
に設定されたディレクトリが使われます。このlxc.
の値がフックでLXC_
という環境変数で参照できます。
前回説明したlxc.
は、
lxc.
は特に設定しなければコンパイル時のデフォルト値が使われます。Ubuntuのx86_/usr/
です。
このマウントが済んだ後に、
lxc.
とlxc.
は、
それではコンテナを開始する前、
コンテナ開始前のフック
コンテナを開始させる前にはいくつかの場面でフックを指定できます。コンテナ"ct01"を作成し、
lxc.hook.pre-start = /var/lib/lxc/ct01/hook
/var/
は以下のような内容です。引数を順番に表示し、
#!/bin/bash
cat << EOF > /var/log/ct.log
The number of args: $#
Container name: $1
Section: $2
Hook type: $3
Additional arg: $4
LXC_ROOTFS_MOUNT: $LXC_ROOTFS_MOUNT
LXC_CONFIG_FILE: $LXC_CONFIG_FILE
LXC_SRC_NAME: $LXC_SRC_NAME
LXC_NAME: $LXC_NAME
LXC_ROOTFS_PATH: $LXC_ROOTFS_PATH
EOF
これでコンテナを起動してみましょう。
$ sudo lxc-start -n ct01 -d $ sudo lxc-ls -f NAME STATE IPV4 IPV6 AUTOSTART ----------------------------------------- ct01 RUNNING 10.0.3.87 - NO
lxc.
はコンテナのルートファイルシステムが設定されるよりも前ですので、/var/
はホストOSから見たパスになります。ホスト上で見てみましょう。
$ sudo cat /var/log/ct.log The number of args: 3 Container name: ct01 Section: lxc Hook type: pre-start Additional arg: LXC_ROOTFS_MOUNT: /usr/lib/x86_64-linux-gnu/lxc LXC_CONFIG_FILE: /var/lib/lxc/ct01/config LXC_SRC_NAME: LXC_NAME: ct01 LXC_ROOTFS_PATH: /var/lib/lxc/ct01/rootfs
先に説明した通り、
コンテナ開始前に実行されるlxc.
、lxc.
、lxc.
、lxc.
は、
ただしlxc.
だけはホストOSの名前空間で実行されますので、lxc.
以降はコンテナの名前空間上での実行になりますので、
コンテナ起動時のフックのうちlxc.
だけは、/var/
にスクリプトを置いてもコンテナからは見えませんので、
実際に見てみましょう。
$ sudo ls -lF /var/lib/lxc/ct01/rootfs/hook (コンテナのルート以下にスクリプトを置く) -rwxr-xr-x 1 root root 286 Mar 31 18:33 /var/lib/lxc/ct01/rootfs/hook* $ sudo grep 'lxc.hook.start' /var/lib/lxc/ct01/config (hookの指定はコンテナ内のパスで記述) lxc.hook.start = /hook
以上のように、
$ sudo lxc-start -n ct01 -d (コンテナの起動) $ sudo lxc-ls -f (コンテナの起動を確認) NAME STATE IPV4 IPV6 AUTOSTART ----------------------------------------- ct01 RUNNING 10.0.3.87 - NO $ sudo lxc-attach -n ct01 -- cat /var/log/ct.log (コンテナ内の/var/log/ct.logを確認) The number of args: 3 Container name: ct01 Section: lxc Hook type: start Additional arg: LXC_ROOTFS_MOUNT: /usr/lib/x86_64-linux-gnu/lxc LXC_CONFIG_FILE: /var/lib/lxc/ct01/config LXC_SRC_NAME: LXC_NAME: ct01 LXC_ROOTFS_PATH: /var/lib/lxc/ct01/rootfs
コンテナイメージ内に置いたスクリプト/hook
が実行され、
コンテナ終了後のフック
コンテナ終了時はフックは一つだけです。ホストOSの名前空間とホストOS上でのパスでフックが実行されます。lxc-start-ephemeral
で設定されていたように、
コンテナ開始時と同じスクリプトを実行させると、
コンテナのクローン時のフック
クローン元となるコンテナにあらかじめフックを設定しておくと、
クローン時にはコンテナ開始時と終了時のフックで使えた引数、lxc.
に先ほどのスクリプトを与えてみましょう。
lxc.hook.clone = /var/lib/lxc/ct01/hook
以上のように設定した上で、lxc-clone
コマンドに追加の引数"test"を与えて実行してみます。
$ sudo lxc-clone -o ct01 -n clone01 -s -B overlayfs -- test Created container clone01 as snapshot of ct01
出力されたファイルを見てみましょう。
$ sudo cat /var/log/ct.log The number of args: 4 Container name: clone01 Section: lxc Hook type: clone Additional arg: test LXC_ROOTFS_MOUNT: /usr/lib/x86_64-linux-gnu/lxc LXC_CONFIG_FILE: /var/lib/lxc/clone01/config LXC_SRC_NAME: ct01 LXC_NAME: clone01 LXC_ROOTFS_PATH: overlayfs:/var/lib/lxc/ct01/rootfs:/var/lib/lxc/clone01/delta0
コンテナ開始時は引数が3つでした。一方、
overlayfsを使ったクローンですので、LXC_
の値はクローン先でoverlayfsを使う場合のlxc.
の値になっています。
まとめ
今回はLXCで指定できるフックを紹介しました。また、
フックはコンテナの起動時のいくつかの場面と、lxc-start-ephemeral
コマンドのように、
フックを使う場合は、
LXC 1.1.2
今回の記事を書いている途中にLXC 1.