前回までで、LXCでいろいろなストレージバックエンドを使ったコンテナの操作を紹介しました。今回も引き続きLXCがサポートするストレージバックエンドの紹介をします。今回は"loop"ストレージバックエンドです。
LVMを使ったコンテナに対するlxc-snapshotコマンドの実行
loopを紹介する前に、前回説明していなかったLVMストレージバックエンドを使ったコンテナに対するlxc-snapshot
コマンドの実行について補足しておきます。
lxc-snapshot
は第9回で説明したように、コンテナのある時点のコンテナイメージを保存しておく機能です。
実は、LVMストレージバックエンドを使っている場合は、現時点ではバージョン1.0系列、1.1系列両方でlxc-snapshot
コマンドは実行できません。実行すると以下のようにエラーとなります。
これは、LVMをストレージバックエンドに使ったコンテナではlxc-snapshot
の実行が無効化されているのが理由です。以前、LVMを使っているとlxc-snapshot
コマンドが正常に動作しない問題が発見されたためです。修正が行われた後に再度有効にされる予定ですが、今の所修正が進んでいる様子はなさそうです。lxc-snapshot
コマンドを活用してコンテナを運用する場合は注意しましょう。
LVMをストレージバックエンドとして使って、コンテナのある時点のイメージを保存したい場合はlxc-clone
を使うなど、別の運用を考えましょう。
loopストレージバックエンドを使ったコンテナの作成
さて、それではloopストレージバックエンドの紹介に移ります。
loopは文字通りループバックデバイスのことで、イメージファイルをコンテナイメージとして使うためにループバックデバイスを使います。loopストレージバックエンドを使うには特に準備は必要ありませんので、さっそくコンテナを作成してみましょう。
現時点ではloopを使う場合も、前回紹介したクローン時の不具合と同じ原因でクローンが失敗します。そこで今回も前回と同じstable-1.0ブランチのデイリービルドパッケージをインストールした環境で実行しました。
loopを使った場合にクローンが失敗する問題は、LVMのクローン時の不具合と同じものですので1.1.0では既に修正済みです。1.0-stableブランチでも修正済みですので1.0.8のリリースで修正されるはずです。
まずはloopストレージバックエンドで使えるオプションを見てみましょう。
表1 ストレージバックエンドがloopの場合にlxc-createで使えるオプション
オプション |
オプションの説明 |
デフォルト値 |
--fstype |
ファイル内に作成するファイルシステム名 |
ext3 |
--fssize |
作成するファイルのサイズ |
1G |
実は1.0.7までと1.1.0のマニュアルにはストレージバックエンドとしてloopを指定した場合、どういうオプションが使えるのか、デフォルトのサイズ、ファイルシステムの種類についての記載がありません。
筆者が送ったパッチがマージされたので1.1.1では説明が入っており、1.0.8でも説明が入るはずです。
それではlxc-create
コマンドで-B loop
を指定してコンテナを作成してみましょう。
作成できました。まずは設定ファイルを見ておきましょう。
loopを使う場合は、設定ファイルでlxc.rootfs
に"loop:"に続けてファイルのフルパスを記述します。上記の例でもlxc.rootfs
がloop:/var/lib/lxc/loop1/rootdev
となっていますね。それ以外は普通のコンテナと変わりありません。
/var/lib/lxc/loop1/rootdev
を見ると、デフォルト値の1GBのファイルになっています。このファイルをマウントしてみましょう。
ファイル内部はext3になっていますね。マウントしたディレクトリを見てみると、コンテナの/(ルート)のようですね。
アンマウントしてからコンテナを起動します。
起動しました。さっそくコンテナ内でマウントの様子を見てみましょう。
/dev/loop7
が/(ルート)としてマウントされており、ループバックデバイスを使ってマウントされていることがわかります。
次にオプションを指定してコンテナを作成してみましょう。ファイルシステムはbtrfs、サイズは2GBを指定してみます。
2GBでファイルが作られ、起動後にコンテナ内で見てみると確かにファイルシステムはBtrfsとなっており、ファイルシステムのサイズも2GBになっていることが確認できました。
なお、ソースコードを見る限り、-B loop
を指定してlxc-create
でコンテナを作成した場合に作成されるファイルの名前はrootdev
で固定のようです。
loopストレージバックエンドを使ったコンテナのクローンとスナップショット
loopストレージバックエンドを使った場合、コンテナイメージは単なるファイルですので、スナップショットのような特別な機能はありません。コンテナのクローンはコピーによるクローンになります。
ファイルをコピーしますので少し時間がかかります。
以上のようにコンテナイメージ用のファイルがコピーされ、空のrootfs
ディレクトリ、新しいコンテナ用の設定ファイルが作成されます。
クローンしたコンテナの設定ファイルはinclude
を使わない形で作成されます。設定内容はlxc.rootfs
が新しいコンテナ用に変わっているだけです。
lxc-snapshot
を使ったコンテナのバックアップについてもクローンと同様にコピーを使います。実行するたびにコンテナイメージ用のファイルがコピーされ、イメージファイルの分だけ容量を消費していきます。あまり現実的ではないかもしれませんね。
まとめ
今回はストレージバックエンドとしてloopを使った場合のコンテナの作成、クローン、スナップショットを紹介しました。
紹介した通り非常にシンプルなストレージバックエンドです。lxc-create
でloopを指定してコンテナを作成するより、既存のイメージファイルを使ってコンテナを起動する場合に便利なストレージバックエンドかも知れません。
LXC 1.1.1
今回の記事を執筆中にLXC 1.1.1がリリースされました。
バグフィックスが中心で、リリースアナウンス(日本語訳)にもあるように変更点はそれほど多くはありません。
ここしばらく、LXDの開発が非常に活発でリリースも頻繁なため、LXCのリリース作業に手が回らないのか、長期サポート版の次のバージョンである1.0.8がなかなかリリースされません。前回と今回の実行例を手軽に楽しめる環境がなかなか手に入りませんね。