LXCで学ぶコンテナ入門 -軽量仮想化環境を実現する技術

第9回 LXCの基本操作[2]

この記事を読むのに必要な時間:およそ 4 分

前回でコンテナの基本的な操作は一通りできるようになったと思いますので,今回と次回でその他の周辺コマンドを紹介していきます。

コンテナの削除 ~ 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を使用します。

設定されている値を確認するにはコンテナ名と共に,cgroupfsのサブシステムのファイル名を指定します。

例えばメモリの制限値を設定したり確認したりする場合,memoryサブシステムのmemory.limit_in_bytesというファイルを使いました。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.listで,設定はdevices.allowもしくはdevices.denyファイルで行いました。

# 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回「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で確認してください。

それではコンテナのクローンを作成してみましょう。基本的にクローン元のコンテナ名とクローンで作成したいコンテナ名を指定するだけです。クローン元のコンテナが起動中はエラーになりますので停止してから実行してください。

# 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/hostname(以上の例だとホストから見た場合/var/lib/lxc/ct02/rootfs/etc/hostnameの中身も書き換えてくれます。ただし,ディストリビューションによっては別のファイルにホスト名が書かれていたりしますので,必ずしもコンテナイメージ中のホスト名が書き換わるわけではありません。また/etc/hostsなど,他のファイルは書き換わりませんので,自分で修正が必要です。

バックエンドストレージがスナップショット機能をサポートしている場合は-sを指定すると,バックエンドストレージ側のスナップショット機能を使ってクローンを作成します。

色々なバックエンドストレージを使ったLXCの活用については,この連載の後の回で紹介する予定です。

著者プロフィール

加藤泰文(かとうやすふみ)

2009年頃にLinuxカーネルのcgroup機能に興味を持って以来,Linuxのコンテナ関連の最新情報を追っかけたり,コンテナの勉強会を開いたりして勉強しています。英語力のない自分用にLXCのmanページを日本語訳していたところ,あっさり本家にマージされてしまい,それ以来日本語訳のパッチを送り続けています。

Plamo Linuxメンテナ。ファーストサーバ株式会社所属。

Twitter:@ten_forward
技術系のブログ:http://tenforward.hatenablog.com/

コメント

コメントの記入