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

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

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

コンテナのスナップショットの取得 ~ 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には出てきませんがきちんと機能します

※)
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という名前でスナップショットが作成されています。このあと同様にスナップショットを作成するとsnap1snap2と通し番号が増加していきます。

$ 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/lib/lxcsnapsディレクトリにコンテナ名のディレクトリを作成し,その下のスナップショット名のディレクトリに保存されます。

スナップショットディレクトリの下を少しのぞいてみましょう。

$ 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ストレージバックエンドを使っているため,スナップショットと言っても単なるコピーが行われているだけでした。一方,btrfsのようなスナップショット機能を持ったストレージバックエンドを使ったり,aufsやoverlayfsなどの重ね合わせができるストレージバックエンドを使うと,それぞれのストレージバックエンドが持つ特長を生かしてスナップショットを作成できます。色々なストレージバックエンドを使ったスナップショットの例は,この連載の後の回で紹介する予定です。

なお,LXC 1.1からはスナップショットはコンテナのディレクトリ(Ubuntuの場合/var/lib/lxc/(コンテナ名)以下に保存されるようになります/var/lib/lxcsnapsが存在すれば互換性維持のためにそちらを使います⁠⁠。つまりct01snap0/var/lib/lxc/ct01/snap0に保存されます。

また,執筆時点では LVM がストレージバックエンドの場合,スナップショットがうまく動いていないようです。このため修正されるまではLVMがストレージバックエンドのコンテナはスナップショットが取れないようにバージョン1.0.6で変更されるようです。

まとめ

今回はコンテナを便利に使うコマンドをいくつか紹介しました。lxc-clonelxc-snapshotはこの連載の後の回でも取り上げて,より便利に使う方法を紹介する予定です。

次回は前回と今回で紹介できなかったコマンドと,Ubuntu 14.04 LTSでcgroupを管理するために採用されたcgmanagerについて紹介する予定です。

著者プロフィール

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

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

Plamo Linuxメンテナ

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