前回でコンテナの基本的な操作は一通りできるようになったと思いますので、
コンテナの削除 ~ lxc-destroy
前回、lxc-create
を紹介しました。その逆でコンテナを削除するコマンドがlxc-destroy
です。
lxc-destroy
の実行は削除したいコンテナ名を指定するだけです。
# lxc-destroy -n ct02
ただし、
# lxc-destroy -n ct02
ct02 is running
実行中でも強制的に削除したい場合は-f
を指定すると、
# lxc-destroy -n ct02 -f
cgroup設定の確認、変更 ~ lxc-cgroup
コンテナに設定されているcgroupの制限値を確認したり、lxc-cgroup
を使用します。
設定されている値を確認するにはコンテナ名と共に、
例えばメモリの制限値を設定したり確認したりする場合、memory.
というファイルを使いました。lxc-cgroup
でもこの名前をそのまま指定します。
# lxc-cgroup -n ct01 memory.limit_in_bytes
268435456
コンテナct01
には256MBの制限が設定されているようです。これを128MBに変更してみましょう。確認と同様にファイル名を指定したあと、
# lxc-cgroup -n ct01 memory.limit_in_bytes 128M
# lxc-cgroup -n ct01 memory.limit_in_bytes
134217728
変更されましたね。設定と確認に使うファイルが同じ場合は以上のように同じファイル名を指定しますが、
例えばdevicesサブシステムの場合、devices.
で、devices.
もしくはdevices.
ファイルで行いました。
# lxc-cgroup -n ct01 devices.list
c *:* m
b *:* m
c 1:3 rwm
c 1:5 rwm
c 5:0 rwm
: (略)
# lxc-cgroup -n ct01 devices.deny "c 1:3 rwm"
# lxc-cgroup -n ct01 devices.list
c *:* m
b *:* m
c 1:5 rwm
c 5:0 rwm
c 5:1 rwm
第7回で
cgroupで値を設定したり確認したりする場合、lxc-cgroup
を使う必要はないと思われるかもしれません。
しかし、
このためUbuntu 14.lxc-cgroup
を使う必要があります
直接cgroupfsをマウントしている環境では直接cgroupfsのファイルを操作してコンテナに対するcgroupの制限値の確認や変更ができます。例えばUbuntuでも12.
コンテナのクローン ~ lxc-clone
lxc-clone
は文字通り存在するコンテナのクローンを作るコマンドです。コンテナに限らず仮想マシンでもクローンが使えるととても便利ですね。LXCではバックエンドストレージの特性に応じたクローンが使えるようになっていますので便利です。
まずはlxc-clone
のオプションを紹介しましょう。
lxc-clone
のオプションオプション | オプションの意味 |
---|---|
-s | クローンをスナップショットで取得。btrfsとlvmとzfsの時のみ指定可能 |
-p | オリジナルのコンテナの |
-P | クローン先のコンテナの |
-B | 元のコンテナと違うバックエンドストレージを使う場合にバックエンドストーレジ形式を指定 |
-o | クローン元のコンテナ名 |
-n | クローン先のコンテナ名 |
ここでいう/var/
ですが、
指定する場合にはコンテナ名のディレクトリを含みません。クローン先でもコンテナ名を含みませんので、
lxc-clone
はコピーもしくはスナップショットによってクローンを作成します。ただし、
lxc-clone
にはこの他にも多数のオプションがありますので、man lxc-clone
で確認してください。
それではコンテナのクローンを作成してみましょう。基本的にクローン元のコンテナ名とクローンで作成したいコンテナ名を指定するだけです。クローン元のコンテナが起動中はエラーになりますので停止してから実行してください。
# lxc-clone -o ct01 -n ct02
lxc_container: error: Original container (ct01) is running
clone failed (コンテナct01が実行中なので失敗した)
# lxc-stop -n ct01 (コンテナct01を停止)
# lxc-clone -o ct01 -n ct02
Created container ct02 as copy of ct01
-s
でスナップショットを指定しないと、rsync
コマンドでコンテナイメージをコピーします。デフォルトでは特にオプションを与えなくてもクローン元のコンテナのストレージバックエンドと同じ形式でクローンを作成します。
クローンで作成されたct02
の設定ファイルを見てみましょう。
lxc.utsname = ct02
lxc.rootfs = /var/lib/lxc/ct02/rootfs
以上はコンテナ名に依存する設定のみを抜き出しました。きちんとlxc-clone
で指定したコンテナ名に書き換わっています。これだけでなく、/etc/
/var/
)/etc/
など、
バックエンドストレージがスナップショット機能をサポートしている場合は-s
を指定すると、
色々なバックエンドストレージを使ったLXCの活用については、
コンテナのスナップショットの取得 ~ lxc-snapshot
lxc-snapshot
はコンテナのある時点のイメージをスナップショットとして保存します。あとでコンテナイメージをスナップショット時点のイメージに戻したり、
それではlxc-snapshot
のオプションを見てみましょう。
lxc-snapshot
のオプションオプション | オプションの意味 |
---|---|
-c / --comment | 指定したファイルに書かれたコメントをスナップショットのコメントとして設定する |
-d / --destroy | 指定した名前のスナップショットを削除する |
-L / --list | スナップショットをリスト表示する |
-C / --showcomments | リスト表示の際にコメントを表示する |
-r / --restore | 指定したスナップショットを使ってリストアを行う |
-d / --destroy
オプションはバージョン1.
- ※)
- 1.
0.6でmanに-dオプションの説明が追加されました。
それではスナップショットを取得してみましょう。コンテナが起動している状態ではエラーになりますので停止してから実行してください。
$ sudo lxc-snapshot -n ct01
lxc_container: Snapshot of directory-backed container requested.
lxc_container: Making a copy-clone. If you do want snapshots, then
lxc_container: please create an aufs or overlayfs clone first, snapshot that
lxc_container: and keep the original container pristine.
警告が出ていますね。これはバックエンドストレージがdir形式のコンテナのスナップショットを取得しているからです。dirバックエンドストレージでオプションを指定しないでスナップショットを取得すると、
-L
オプションを使ってスナップショットを確認してみましょう。
$ sudo lxc-snapshot -n ct01 -L
snap0 (/var/lib/lxcsnaps/ct01) 2014:09:02 17:42:33
snap0
という名前でスナップショットが作成されています。このあと同様にスナップショットを作成するとsnap1
、snap2
と通し番号が増加していきます。
$ sudo lxc-snapshot -n ct01
: (略)
$ sudo lxc-snapshot -n ct01 -L
snap1 (/var/lib/lxcsnaps/ct01) 2014:09:02 17:58:18
snap0 (/var/lib/lxcsnaps/ct01) 2014:09:02 17:42:33
リスト表示で表示されているようにスナップショットは/var/
ディレクトリにコンテナ名のディレクトリを作成し、
スナップショットディレクトリの下を少しのぞいてみましょう。
$ ls -F /var/lib/lxcsnaps/ct01/snap0/
config rootfs/ ts
通常のコンテナディレクトリと同様のconfig
ファイルとrootfs
ディレクトリ以外にts
というファイルがあります。
$ cat /var/lib/lxcsnaps/ct01/snap0/ts
2014:09:02 17:42:33
ts
ファイルの中を見てみると、
それでは-r
オプションを使ってスナップショットからリストアを実行してみましょう。同時に、
$ echo "0" | sudo tee /var/lib/lxc/ct01/rootfs/testfile (中身が"0"のテストファイル作成)
0
$ sudo lxc-snapshot -n ct01 (スナップショット作成)
: (略)
$ echo "1" | sudo tee /var/lib/lxc/ct01/rootfs/testfile (テストファイルの中身を書き換え)
1
$ sudo cat /var/lib/lxc/ct01/rootfs/testfile
1
$ sudo lxc-snapshot -n ct01 -r snap0 ("snap0"へのリストア)
$ sudo cat /var/lib/lxc/ct01/rootfs/testfile (スナップショット作成時点の状態に戻っている)
0
コンテナを起動せずにホストOSからコンテナイメージを触って試しているのでちょっと手抜きですが、
以上のリストアの例はスナップショット取得元のコンテナに上書きでリストアしています。スナップショット元のコンテナはそのまま置いておきたいという場合、
$ sudo lxc-snapshot -n ct01 -L
snap0 (/var/lib/lxcsnaps/ct01) 2014:09:02 18:36:59
$ sudo lxc-snapshot -n ct01 -r snap0 ct02
$ sudo lxc-ls --fancy
NAME STATE IPV4 IPV6 AUTOSTART
------------------------------------
ct01 STOPPED - - NO
ct02 STOPPED - - NO
ct01
コンテナのスナップショットsnap0
を元にct02
コンテナが作成されました。
最後にスナップショットを削除しましょう。-d
オプションでスナップショット名を指定します。
$ sudo lxc-snapshot -n ct01 -d snap0
$ sudo lxc-snapshot -n ct01 -L
No snapshots
ここでの例ではdirストレージバックエンドを使っているため、
なお、/var/
)/var/
が存在すれば互換性維持のためにそちらを使います)。つまりct01
のsnap0
は/var/
に保存されます。
また、
まとめ
今回はコンテナを便利に使うコマンドをいくつか紹介しました。lxc-clone
とlxc-snapshot
はこの連載の後の回でも取り上げて、
次回は前回と今回で紹介できなかったコマンドと、