前回はLXCでサポートされているストレージバックエンドのうち、重ねあわせのできるUnion Filesystemであるoverlayfsとaufsを使ったクローンを紹介しました。
今回も引き続きLXCがサポートしているストレージバックエンドを使ったLXCの使用方法を紹介していきます。
今回はBtrfsをストレージバックエンドとして使う場合を取り上げましょう。なお、ここではBtrfsが持つ詳細な機能や操作については説明しません。Btrfsについては公式サイトなどの文書を参考にしてください。
Btrfsをストレージバックエンドとして使う場合の準備
BtrfsをLXCコンテナのストレージバックエンドとして使う場合には準備が必要です。
当然、コンテナの保存場所として使うディレクトリがBtrfs上になければいけませんので、まずは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配下のサブボリュームとして準備しておく必要があります。
上記の例では/dev/vdc1
に作成したファイルシステムを一旦/mnt
にマウントしたあとで、サブボリュームとしてlxc
とlxcsnaps
を作成しています。
そして、マウントはそれぞれのサブボリュームをマウントするようにします。これで同じボリューム上に/var/lib/lxc
と/var/lib/lxcsnaps
が存在しますので、/var/lib/lxc
以下のサブボリュームを/var/lib/lxcsnaps
にスナップショットできます。
マウントできることが確認できたら、/etc/fstab
に記述しておきましょう。
これでホストOSをリブートしても/var/lib/lxc
と/var/lib/lxcsnaps
がマウントされますね。
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
を指定します。
このように作成すると、コンテナのrootfsがBtrfsのサブボリュームとなります。
サブボリュームにコンテナイメージが保存されますので、コンテナのクローンやスナップショットの際にBtrfsの機能を便利に使えます。
このため、Btrfsをストレージバックエンドに使うと、rsyncによるコピーを行うディレクトリバックエンドのクローンやスナップショットに比べて、処理がかなり速く済み、ディスク容量も消費しません。コンテナの削除はサブボリュームを削除するだけなので一瞬です。
コンテナの設定に特にBtrfsであることがわかる記述はありません。これは少し不便かも知れませんね。
コンテナを保存する場所がBtrfsであっても、lxc-create
コマンドで-B btrfs
を指定しないと普通のディレクトリバックエンドとなってしまいますので注意が必要です。
前回の表1で紹介した"best"を-B
オプションに与えるとBtrfs,ZFS,LVM,ディレクトリの順に試してくれますので、常に-B best
でlxc-create
を実行すると良いかも知れませんね。
以上のように自動的に適切なストレージバックエンドを使ってコンテナを作成してくれます。
Btrfsを使ったコンテナのクローン
Btrfsをストレージバックエンドに使っているコンテナを-s
オプションを付けてクローンをすると、Btrfsのスナップショット機能を使ってクローンを行います。
この実行例では-s
でスナップショットによるクローンを取得する指定をして、さらに-B btrfs
としてクローンをBtrfsを使ったコンテナにするように指定しています。どちらか片方だけの指定でもスナップショットによるクローンになります。しかし、わかりづらいので両方指定するようにした方が良いでしょう。
ここで-s
と-B btrfs
の両方とも指定せずにクローンを作成すると通常のrsyncによるコピーのクローンを作成しますので注意しましょう。ただし、この場合でもクローン先のrootfsはBtrfsのサブボリュームとなります。
以上のように-s -B btrfs
オプションを付けた場合に比べてクローンに時間がかかっています。クローンで作成されたコンテナのrootfsはサブボリュームになっていることもわかります。
Btrfsのスナップショットを使った場合、クローンの元となるコンテナの更新や削除を行っても、クローン先のコンテナに影響を与えることはありません。クローン後はクローン元のコンテナとクローン先のコンテナは別々に更新できます。それぞれのコンテナを別々に更新した場合でもBtrfsの機能でクローン前と変化のないファイルについては内部的には同じファイルを指していますからディスクの容量の節約にもなりますね。
overlayfsやaufsの時のようなクローン元のコンテナを削除できないといったような制限はありませんので、以上のようにoverlayfsやaufsの時のようにコンテナディレクトリにフラグとなるようなファイルが作られることはありません。
このようにクローン元のコンテナを削除してもクローン先のコンテナは何事もなく動作しています。
Btrfsを使ったコンテナに対するlxc-snapshotコマンドの実行
lxc-snapshot
コマンドについては第9回で簡単に説明をしました。この時は、ストレージバックエンドがディレクトリであるコンテナでの実行例を紹介しました。
lxc-snapshot
コマンドは、コンテナのある時点のコンテナイメージを保存します。あとでコンテナイメージをスナップショット時点のイメージに戻したり、スナップショットから新しいコンテナを作成を作成したりできます。
内部的にはlxc-clone
と同じ処理を行います。lxc-clone
が既存コンテナを元に新しいコンテナを作成することを目的に使うのに対し、lxc-snapshot
はある時点のコンテナイメージを保存することが目的となります。
lxc-snapshot
コマンドの実行例を紹介する前に、第9回でも紹介したlxc-snapshot
のオプションを見ておきましょう。
表1 lxc-snapshotのオプション
オプション |
オプションの意味 |
-c / --comment |
スナップショットにコメントを付けます。 |
-d / --destroy |
指定した名前のスナップショットを削除します。 |
-L / --list |
スナップショットをリスト表示します。 |
-C / --showcomments |
リスト表示の際にコメントを表示します。 |
-r / --restore |
指定したスナップショットを使ってリストアを行います。 |
それではストレージバックエンドがBtrfsであるコンテナを作成し、lxc-snapshot
コマンドを実行してみましょう。
以上のように一瞬でlxc-snapshot
の処理は終了しています。スナップショットの確認をしてみましょう。
以上のように、-L
オプションを使ってスナップショットを確認するとsnap0
という名前でスナップショットが作成されています。サブボリュームを確認してみると、snap0
のrootfsがサブボリュームとなっていることがわかります。
このようにlxc-snapshot
を使う場合は特にストレージバックエンドの形式を指定しなくても自動的にストレージバックエンドの形式を認識してスナップショットを取得します。
第9回
で紹介したように-r
オプションを使えば、取得したスナップショットの状態にリストアできます。
この例ではスナップショット元であるコンテナのrootfsをスナップショットの内容に戻しています。内部的にはbtrfs01
コンテナのrootfsのサブボリュームを削除して、スナップショットとして取得したコンテナであるsnap0
のrootfsのスナップショットをbtrfs01
コンテナのrootfsの場所に作成しているようです。
LXC 1.1系列ではlxc-snapshot
でスナップショットを取得すると、先に紹介したようにコンテナディレクトリ以下にスナップショットが保存されます。
上記のようにスナップショットを取得した後、-L
オプションで確認してみると、/var/lib/lxc/btrfs01/snaps
以下にsnap0
が作られ、その下にファイルやディレクトリができています。
まとめ
今回はコンテナのストレージバックエンドとしてBtrfsを使った場合のコンテナの作成、クローン、スナップショットを紹介しました。
LXCのBtrfsバックエンドの機能は、今回紹介したようにサブボリュームとスナップショットを使うだけのシンプルなものです。それでもLXCの操作とBtrfsの操作を別々に行うよりは、コンテナのいろいろな処理が便利に行えることがおわかりいただけたのではないでしょうか。
次回も引き続きストレージバックエンドを便利に使う方法を紹介する予定です。