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

第19回 LXCの構築・活用 [5] ─いろいろなストレージバックエンドの利用(1:overlayfs,aufs)

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

前回はLXCでも利用できるファイルシステムであるoverlayfsを紹介しました。

Linuxではいろいろなファイルシステムが使えますので,コンテナイメージの保存場所にいろいろなファイルシステムを使い,ファイルシステムが持つさまざまな便利な機能を直接使うことがあるでしょう。

LXCでも前回紹介したoverlayfsを始めとするいくつかのストレージバックエンドをサポートしており,コンテナイメージに関わる操作をする場合はLXCのコマンドやライブラリから直接ストレージバックエンド上のコンテナを操作できます。

具体的には以下の操作をする場合にストレージバックエンドを指定して操作できます。

  • コンテナの作成 lxc-create
  • コンテナのクローン lxc-clone

lxc-snapshotコマンドでコンテナのスナップショットを取る場合も,内部的にはストレージバックエンドを意識しますが,コマンドでの指定はありません。

いずれのコマンドも第8回第9回で簡単に説明しました。今回以降の数回で,ストレージバックエンドの使用にフォーカスを当ててもう少し細かく見ていきたいと思います。

今回の記事中では実際の操作はUbuntu 14.04 LTS上で実行しています。

ストレージバックエンドの種類

lxc-createlxc-clone共にストレージバックエンドは-Bオプションで指定します。ここで指定できるストレージバックエンドには表1に挙げるような種類があります。

表1 LXCで指定できるストレージバックエンド

名称 lxc-createでの使用 lxc-cloneでの使用 説明
aufs ×
best × btrfs,zfs,lvm,dirの順に試す
btrfs
dir ディレクトリ
lvm LVM
loop ループバックデバイス
none × dirのエイリアス
overlayfs ×
zfs

lxc-createlxc-cloneのそれぞれで「○」が付いているストレージバックエンドしか指定できません。

コピーによるクローン

それではさっそくクローンを試してみましょう。まずはコンテナの作成からです。/var/lib/lxcが普通にext4である環境でコンテナを作成しましょう。

$ sudo lxc-create -n ct01 -t download -B dir -- -d ubuntu -r trusty -a amd64

-B dirは指定しなくても同じです。ここではわかりやすいように明示的に指定しています。

クローンを実行する前にlxc-cloneのオプションを確認しておきましょう。

表2 lxc-cloneコマンドのオプション

オプション オプションの意味
-s クローンをスナップショットで取得。LVMとbtrfsとzfsの時に指定可能。aufsとoverlayfsの時に指定が必要
-p オリジナルのコンテナの『コンテナの保存場所』
-P クローン先のコンテナの『コンテナの保存場所』
-B 元のコンテナと違うバックエンドストレージを使う場合にバックエンドストーレジ形式を指定
-o クローン元のコンテナ名
-n クローン先のコンテナ名

最低限必要なオプションはクローン元を指定する-oとクローンで新たに作成するコンテナ名を指定する-nです。

また,-sスナップショットによるクローンを指定しない場合は,コンテナイメージをrsyncでコピーします。

では,一番シンプルなクローンを試してみましょう。time はクローンにかかった時間を計測するためにつけています。

$ sudo time -p lxc-clone -o ct01 -n clone01
Created container clone01 as copy of ct01
real 4.43
user 2.14
sys 1.71
$ sudo lxc-ls
clone01  ct01

lxc-cloneの終了後にlxc-lsを実行すると,clone01コンテナが作成されているのがわかります。

クローン先のコンテナの設定ファイルはlxc-cloneコマンドが自動的に作成します。クローン元のコンテナの設定ファイルを一度内部的に展開した後に必要部分を書き換えて出力しますので,クローン元でlxc.includeを使って共通ファイルをincludeしている場合でも,クローン先の設定ファイルではlxc.includeを使わずに作成されます。

たとえばクローン元のct01は以下のように非常にシンプルな記述です。

$ sudo cat /var/lib/lxc/ct01/config | grep -v "^#"

lxc.include = /usr/share/lxc/config/ubuntu.common.conf
lxc.arch = x86_64

lxc.rootfs = /var/lib/lxc/ct01/rootfs
lxc.utsname = ct01

lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = lxcbr0

一方,クローン先のclone01は以下のように全ての設定が書かれており,かなりサイズが大きくなっています。

$ sudo cat /var/lib/lxc/clone01/config
lxc.mount.entry = proc proc proc nodev,noexec,nosuid 0 0
lxc.mount.entry = sysfs sys sysfs defaults 0 0
    :(略)
lxc.utsname = clone01
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = lxcbr0
lxc.network.hwaddr = 00:16:3e:11:b2:90
lxc.cap.drop = sys_module
lxc.cap.drop = mac_admin
lxc.cap.drop = mac_override
lxc.cap.drop = sys_time
lxc.rootfs = /var/lib/lxc/clone01/rootfs
lxc.pivotdir = lxc_putold

rsyncによるコピーが行われていますので,クローン元とクローン先のコンテナイメージの容量は以下のようにほぼ同じになっています。

$ sudo du -sh /var/lib/lxc/ct01/rootfs (クローン元の容量)
379M    /var/lib/lxc/ct01/rootfs
$ sudo du -sh /var/lib/lxc/clone01/rootfs (クローン先の容量)
383M    /var/lib/lxc/clone01/rootfs

著者プロフィール

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

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

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

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

コメント

コメントの記入