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

第20回 LXCの構築・活用 [6] ─いろいろなストレージバックエンドの利用(2:Btrfs)

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

前回はLXCでサポートされているストレージバックエンドのうち,重ねあわせのできるUnion Filesystemであるoverlayfsとaufsを使ったクローンを紹介しました。

今回も引き続きLXCがサポートしているストレージバックエンドを使ったLXCの使用方法を紹介していきます。

今回はBtrfsをストレージバックエンドとして使う場合を取り上げましょう。なお,ここではBtrfsが持つ詳細な機能や操作については説明しません。Btrfsについては公式サイトなどの文書を参考にしてください。

Btrfsをストレージバックエンドとして使う場合の準備

BtrfsをLXCコンテナのストレージバックエンドとして使う場合には準備が必要です。

当然,コンテナの保存場所として使うディレクトリがBtrfs上になければいけませんので,まずはBtrfsで構築された領域が必要ですね。

$ sudo apt-get install btrfs-tools (Btrfs用のツールをインストール)
$ sudo mkfs -t btrfs /dev/vdc1 (Btrfsファイルシステムの作成)

ここの例ではパーティション/dev/vdc1をBtrfs用に利用しています。

LXC 1.0系列を使う場合の準備

LXC 1.0系列を使っている場合は,Btrfsの領域を準備したあと,ちょっとした準備が必要な場合があります。この準備はlxc-snapshotコマンドを使ってコンテナのスナップショットを作成する場合に必要です。lxc-snapshotを使わないのであれば特に以下で紹介する操作は不要です。

lxc-snapshotコマンドは,ストレージバックエンドとしてBtrfsを使っているコンテナの場合,Btrfsのスナップショット機能を使ってコンテナのスナップショットを作成します。このスナップショットはコンテナの保存場所が/var/lib/lxcの場合は/var/lib/lxcsnaps以下に保存されます。

たとえばコンテナ名がct01の場合,スナップショットは/var/lib/lxcsnaps/ct01以下に保存されます。

Btrfsでその領域のスナップショットを保存するにはスナップショット先も同じボリューム上になくてはいけませんので,たとえば/var/lib/lxcを独立したBtrfsでマウントしているような場合は/var/lib/lxcsnapsへスナップショットを保存できません。

そこで/var/lib/lxc/var/lib/lxcsnapsを同じBtrfs配下のサブボリュームとして準備しておく必要があります。

$ sudo mount /dev/vdc1 /mnt (作成したBtrfsを一旦/mntにマウント)
$ cd /mnt
$ sudo btrfs sub create lxc (lxcという名前でサブボリュームを作成)
$ sudo btrfs sub create lxcsnaps (lxcsnapsという名前でサブボリュームを作成)
$ sudo mkdir /var/lib/lxcsnaps (lxcsnapsディレクトリの作成)
$ sudo mount -o subvol=lxc /dev/vdc1 /var/lib/lxc
(サブボリュームlxcを/var/lib/lxcにマウント)
$ sudo mount -o subvol=lxcsnaps /dev/vdc1 /var/lib/lxcsnaps
(サブボリュームlxcsnapsを/var/lib/lxcsnapsにマウント)

上記の例では/dev/vdc1に作成したファイルシステムを一旦/mntにマウントしたあとで,サブボリュームとしてlxclxcsnapsを作成しています。

そして,マウントはそれぞれのサブボリュームをマウントするようにします。これで同じボリューム上に/var/lib/lxc/var/lib/lxcsnapsが存在しますので,/var/lib/lxc以下のサブボリュームを/var/lib/lxcsnapsにスナップショットできます。

マウントできることが確認できたら,/etc/fstabに記述しておきましょう。

$ echo "/dev/vdc1 /var/lib/lxc btrfs subvol=lxc 0 0" \
> | sudo tee -a /etc/fstab
/dev/vdc1 /var/lib/lxc btrfs subvol=lxc 0 0
$ echo "/dev/vdc1 /var/lib/lxcsnaps btrfs subvol=lxcsnaps 0 0" \
> | sudo tee -a /etc/fstab
/dev/vdc1 /var/lib/lxcsnaps btrfs subvol=lxcsnaps 0 0

これでホストOSをリブートしても/var/lib/lxc/var/lib/lxcsnapsがマウントされますね。

$ cat /proc/mounts | grep lxc
/dev/vdc1 /var/lib/lxc btrfs rw,relatime,space_cache 0 0
/dev/vdc1 /var/lib/lxcsnaps btrfs rw,relatime,space_cache 0 0

LXC 1.1系列の場合

上記で説明したLXC 1.0系列の仕様は少し不便ですね。そこでLXC 1.1系列ではlxc-snapshotを使った場合のスナップショットの保存場所が,コンテナ用のディレクトリ以下に変更されました。

たとえば,コンテナの保存場所が/var/lib/lxcで,スナップショット対象のコンテナがct01の場合は/var/lib/lxc/ct01/snaps以下にスナップショットが保存されるようになりました。

この仕様だと,特にサブボリュームをマウントする必要はなく,/var/lib/lxcがBtrfsであるだけで良いですね。

ただし,1.0からの移行の場合が考慮されていますので,/var/lib/lxcsnapsが存在する場合は,このディレクトリが引き続き使われます。

Btrfsを使ったコンテナの作成

準備ができたところでコンテナを作ってみましょう。作成はこの連載のこれまでに何度も出てきた操作と同じでlxc-createコマンドを使い,ストレージバックエンドを指定する-Bオプションにbtrfsを指定します。

$ sudo lxc-create -t download -n btrfs01 -B btrfs -- -d ubuntu -r trusty -a amd64

このように作成すると,コンテナのrootfsがBtrfsのサブボリュームとなります

$ sudo btrfs sub list /var/lib/lxc | grep btrfs01
ID 264 gen 57 top level 259 path btrfs01/rootfs

サブボリュームにコンテナイメージが保存されますので,コンテナのクローンやスナップショットの際にBtrfsの機能を便利に使えます。

このため,Btrfsをストレージバックエンドに使うと,rsyncによるコピーを行うディレクトリバックエンドのクローンやスナップショットに比べて,処理がかなり速く済み,ディスク容量も消費しません。コンテナの削除はサブボリュームを削除するだけなので一瞬です。

コンテナの設定に特にBtrfsであることがわかる記述はありません。これは少し不便かも知れませんね。

$ sudo grep -v '^#' /var/lib/lxc/btrfs01/config 

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

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

lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = lxcbr0
lxc.network.hwaddr = 00:16:3e:e2:fc:35

コンテナを保存する場所がBtrfsであっても,lxc-createコマンドで-B btrfsを指定しないと普通のディレクトリバックエンドとなってしまいますので注意が必要です。

$ sudo lxc-create -t download -n ct01 -- -d ubuntu -r trusty -a amd64
(-B btrfsなしでコンテナを作成)
$ sudo btrfs sub list /var/lib/lxc (ct01のrootfsはサブボリュームになっていない)
ID 259 gen 69 top level 5 path lxc
ID 260 gen 69 top level 5 path lxcsnaps
ID 264 gen 66 top level 259 path btrfs01/rootfs

前回の表1で紹介した"best"を-Bオプションに与えるとBtrfs,ZFS,LVM,ディレクトリの順に試してくれますので,常に-B bestlxc-createを実行すると良いかも知れませんね。

$ sudo lxc-create -t download -n ct01 -B best -- -d ubuntu -r trusty -a amd64
(-B bestを指定してコンテナを作成)
$ sudo btrfs sub list /var/lib/lxc | grep ct01
ID 266 gen 74 top level 259 path ct01/rootfs (←rootfsがサブボリュームになっている)

以上のように自動的に適切なストレージバックエンドを使ってコンテナを作成してくれます。

著者プロフィール

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

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

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

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

コメント

コメントの記入