前回でコンテナの基本的な操作は一通りできるようになったと思いますので、今回と次回でその他の周辺コマンドを紹介していきます。
コンテナの削除 ~ lxc-destroy
前回、コンテナを作成するコマンドとしてlxc-create
を紹介しました。その逆でコンテナを削除するコマンドがlxc-destroy
です。
lxc-destroy
の実行は削除したいコンテナ名を指定するだけです。
ただし、コンテナが実行中の場合は削除は失敗します。
実行中でも強制的に削除したい場合は-f
を指定すると、コンテナを停止してから削除を行います。
cgroup設定の確認、変更 ~ lxc-cgroup
コンテナに設定されているcgroupの制限値を確認したり、コンテナの稼働中に値を設定したりする場合にはlxc-cgroup
を使用します。
設定されている値を確認するにはコンテナ名と共に、cgroupfsのサブシステムのファイル名を指定します。
例えばメモリの制限値を設定したり確認したりする場合、memoryサブシステムのmemory.limit_in_bytes
というファイルを使いました。lxc-cgroup
でもこの名前をそのまま指定します。
コンテナct01
には256MBの制限が設定されているようです。これを128MBに変更してみましょう。確認と同様にファイル名を指定したあと、変更したい値を指定します。
変更されましたね。設定と確認に使うファイルが同じ場合は以上のように同じファイル名を指定しますが、設定と確認に異なるファイルを使うサブシステムもありましたので注意が必要です。
例えばdevicesサブシステムの場合、確認はdevices.list
で、設定はdevices.allow
もしくはdevices.deny
ファイルで行いました。
第7回で「LXCの気になる点」として紹介したように、cgroupfsの各サブシステムにあるファイルについての知識が必要になるので少し不便ですね。
cgroupで値を設定したり確認したりする場合、第4回、第5回で説明したように直接cgroupfsのファイルを操作できますので、わざわざlxc-cgroup
を使う必要はないと思われるかもしれません。
しかし、Ubuntu 14.04 LTSではcgroupをcgmanagerというプログラムが管理しています。このため、以前紹介したように直接cgroupfsを操作する方法は使えません。/sys/fs/cgroup以下を探しても、各種サブシステムがマウントされたディレクトリ自体見つけることができません。
このためUbuntu 14.04 LTSでcgroupの確認、設定を確認するにはlxc-cgroup
を使う必要があります。cgmanagerについては次回説明する予定です。
直接cgroupfsをマウントしている環境では直接cgroupfsのファイルを操作してコンテナに対するcgroupの制限値の確認や変更ができます。例えばUbuntuでも12.04 LTSでは直接cgroupfsを操作できます。
コンテナのクローン ~ lxc-clone
lxc-clone
は文字通り存在するコンテナのクローンを作るコマンドです。コンテナに限らず仮想マシンでもクローンが使えるととても便利ですね。LXCではバックエンドストレージの特性に応じたクローンが使えるようになっていますので便利です。
まずはlxc-clone
のオプションを紹介しましょう。
表1 lxc-clone
のオプション
オプション | オプションの意味 |
-s | クローンをスナップショットで取得。btrfsとlvmとzfsの時のみ指定可能 |
-p | オリジナルのコンテナの『コンテナの保存場所』 |
-P | クローン先のコンテナの『コンテナの保存場所』 |
-B | 元のコンテナと違うバックエンドストレージを使う場合にバックエンドストーレジ形式を指定 |
-o | クローン元のコンテナ名 |
-n | クローン先のコンテナ名 |
ここでいう『コンテナの保存場所』は、前回の表1で紹介したものと同じで、コンテナの設定ファイルやコンテナイメージが保存される場所です。Ubuntuのデフォルト値は/var/lib/lxc
ですが、ここと違う場所を使用する場合は指定します。
指定する場合にはコンテナ名のディレクトリを含みません。クローン先でもコンテナ名を含みませんので、指定したディレクトリ直下にコンテナ名のディレクトリを作成して、そこにクローンを行います。
lxc-clone
はコピーもしくはスナップショットによってクローンを作成します。ただし、スナップショットはバックエンドストレージがサポートしている場合のみ選択でき、btrfs、lvm、zfsの時に選択できます。
lxc-clone
にはこの他にも多数のオプションがありますので、詳しくはman lxc-clone
で確認してください。
それではコンテナのクローンを作成してみましょう。基本的にクローン元のコンテナ名とクローンで作成したいコンテナ名を指定するだけです。クローン元のコンテナが起動中はエラーになりますので停止してから実行してください。
-s
でスナップショットを指定しないと、rsync
コマンドでコンテナイメージをコピーします。デフォルトでは特にオプションを与えなくてもクローン元のコンテナのストレージバックエンドと同じ形式でクローンを作成します。
クローンで作成されたct02
の設定ファイルを見てみましょう。
以上はコンテナ名に依存する設定のみを抜き出しました。きちんとlxc-clone
で指定したコンテナ名に書き換わっています。これだけでなく、コンテナイメージ中の/etc/hostname
(以上の例だとホストから見た場合/var/lib/lxc/ct02/rootfs/etc/hostname
)の中身も書き換えてくれます。ただし、ディストリビューションによっては別のファイルにホスト名が書かれていたりしますので、必ずしもコンテナイメージ中のホスト名が書き換わるわけではありません。また/etc/hosts
など、他のファイルは書き換わりませんので、自分で修正が必要です。
バックエンドストレージがスナップショット機能をサポートしている場合は-s
を指定すると、バックエンドストレージ側のスナップショット機能を使ってクローンを作成します。
色々なバックエンドストレージを使ったLXCの活用については、この連載の後の回で紹介する予定です。
コンテナのスナップショットの取得 ~ lxc-snapshot
lxc-snapshot
はコンテナのある時点のイメージをスナップショットとして保存します。あとでコンテナイメージをスナップショット時点のイメージに戻したり、スナップショットから新しいコンテナを作成したりできます。
それではlxc-snapshot
のオプションを見てみましょう。
表2 lxc-snapshot
のオプション
オプション | オプションの意味 |
-c / --comment | 指定したファイルに書かれたコメントをスナップショットのコメントとして設定する |
-d / --destroy | 指定した名前のスナップショットを削除する |
-L / --list | スナップショットをリスト表示する |
-C / --showcomments | リスト表示の際にコメントを表示する |
-r / --restore | 指定したスナップショットを使ってリストアを行う |
-d / --destroy
オプションはバージョン1.0.5のmanには出てきませんがきちんと機能します※。
それではスナップショットを取得してみましょう。コンテナが起動している状態ではエラーになりますので停止してから実行してください。
警告が出ていますね。これはバックエンドストレージがdir形式のコンテナのスナップショットを取得しているからです。dirバックエンドストレージでオプションを指定しないでスナップショットを取得すると、スナップショットは単にこの時点のコンテナイメージのコピーとなります。
-L
オプションを使ってスナップショットを確認してみましょう。
snap0
という名前でスナップショットが作成されています。このあと同様にスナップショットを作成するとsnap1
、snap2
と通し番号が増加していきます。
リスト表示で表示されているようにスナップショットは/var/lib/lxcsnaps
ディレクトリにコンテナ名のディレクトリを作成し、その下のスナップショット名のディレクトリに保存されます。
スナップショットディレクトリの下を少しのぞいてみましょう。
通常のコンテナディレクトリと同様のconfig
ファイルとrootfs
ディレクトリ以外にts
というファイルがあります。
ts
ファイルの中を見てみると、リスト表示で表示されていたスナップショット作成のタイムスタンプが保存されています。
それでは-r
オプションを使ってスナップショットからリストアを実行してみましょう。同時に、きちんとスナップショットから戻っているかも簡単に確認してみたいと思います。
コンテナを起動せずにホストOSからコンテナイメージを触って試しているのでちょっと手抜きですが、コンテナを起動して同様に実行しても結果は同じになります。
以上のリストアの例はスナップショット取得元のコンテナに上書きでリストアしています。スナップショット元のコンテナはそのまま置いておきたいという場合、コンテナ名を指定すれば別のコンテナを新たに作成できます。
ct01
コンテナのスナップショットsnap0
を元にct02
コンテナが作成されました。
最後にスナップショットを削除しましょう。-d
オプションでスナップショット名を指定します。
ここでの例ではdirストレージバックエンドを使っているため、スナップショットと言っても単なるコピーが行われているだけでした。一方、btrfsのようなスナップショット機能を持ったストレージバックエンドを使ったり、aufsやoverlayfsなどの重ね合わせができるストレージバックエンドを使うと、それぞれのストレージバックエンドが持つ特長を生かしてスナップショットを作成できます。色々なストレージバックエンドを使ったスナップショットの例は、この連載の後の回で紹介する予定です。
なお、LXC 1.1からはスナップショットはコンテナのディレクトリ(Ubuntuの場合/var/lib/lxc/(コンテナ名)
)以下に保存されるようになります(/var/lib/lxcsnaps
が存在すれば互換性維持のためにそちらを使います)。つまりct01
のsnap0
は/var/lib/lxc/ct01/snap0
に保存されます。
また、執筆時点では LVM がストレージバックエンドの場合、スナップショットがうまく動いていないようです。このため修正されるまではLVMがストレージバックエンドのコンテナはスナップショットが取れないようにバージョン1.0.6で変更されるようです。
まとめ
今回はコンテナを便利に使うコマンドをいくつか紹介しました。lxc-clone
とlxc-snapshot
はこの連載の後の回でも取り上げて、より便利に使う方法を紹介する予定です。
次回は前回と今回で紹介できなかったコマンドと、Ubuntu 14.04 LTSでcgroupを管理するために採用されたcgmanagerについて紹介する予定です。