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

第18回 Linuxカーネルのコンテナ機能 [7] ─ overlayfs

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

今回からはLXCがコンテナイメージを置く領域に使えるいろいろなストレージバックエンドを利用し,LXCを便利に使う方法を紹介していきます。

LXCでいろいろなストレージバックエンドを利用する方法を紹介する前に,今後コンテナでの利用が増えそうな,3.18カーネルで新たに追加されたoverlayfsについて紹介しておきましょう。

タイトルは「Linuxカーネルのコンテナ機能」としていますが,これまでの機能と同様にoverlayfsもコンテナ専用として使う機能ではありません。名前空間やCgroup以上にコンテナ以外でさまざまなシーンで使えそうですね。

overlayfsとは

overlayfsはunion filesystemの実装の1つで,ディレクトリを重ね合わせて1つのディレクトリツリーが構成できます。

話題のDockerが持つ特長として,よくコンテナイメージの差分管理ができることが挙げられます。この差分管理を行うための手段のひとつとしてunion filesystemの実装であるaufsが用いられており,Dockerが急激に話題になり始めたころはaufsが良く紹介されていました。

Ubuntuなどの一部のディストリビューションではaufsが使えますが,aufsはカーネルソースに対するパッチという形で提供されているため一部のディストリビューションでしか使えません。一方,overlayfsは3.18カーネルでマージされましたので,今後はどのディストリビューションでも使えるようになっていき,それに伴いコンテナでの利用が増えていくでしょう。

Ubuntuでは3.18でカーネルにマージされる前の12.04 LTSや14.04 LTSの時点でパッチを適用してoverlayfsが使えるようになっていました。他にSUSEやopenSUSEでも以前からoverlayfsが利用できていたようです。

Ubuntuで対応していたためか,LXCでもかなり前からaufsだけでなくoverlayfsにも対応していました。

3.18カーネルでマージされたことを受けて,overlayfsが使える環境が増えてきました。

Dockerでは1.4.0でoverlayfsに対応しました

さらに,Docker関連で良く話題になるCoreOSも最近ファイルシステムとしてbtrfsの代わりにoverlayfsを使用するという提案が行われ,執筆時点でのAlphaリリースである561.0.0でファイルシステムがext4+overlayfsへ変更されているようです。

overlayfsを使ってみる

union filesystemとか「重ね合わせ」と言われてもピンと来ない方もいらっしゃるでしょうから,ここで簡単にoverlayfsの動きを見ておきましょう。

まずはUbuntu 14.04 LTSでの使い方や動きを紹介して,overlayfsがどのようなファイルシステムであるかを理解してみましょう。Ubuntu 14.10でも同様の動きになるはずです。

overlayfsのマウント

まずは必要なディレクトリを作成します。重ねあわせの下層にするディレクトリ,上層にするディレクトリ,重ねあわせてマウントするためのディレクトリを作成します。

$ mkdir lower upper overlay
$ ls -F
lower/  overlay/  upper/

以上のように普通にディレクトリを作成しました。では早速マウントしてみましょう。

overlayfsのマウントにはオプションが必要です。

lowerdir
重ねあわせの下層側のディレクトリ
upperdir
重ねあわせの上層側のディレクトリ
$ sudo mount -t overlayfs -o lowerdir=lower,upperdir=upper overlayfs overlay
$

何事もなくmountコマンドが終了しました。成功したようですね。一応,マウントされているか確認してみましょう。

$ mount -l | grep overlayfs
overlayfs on /home/ubuntu/overlay_test/overlay type overlayfs (rw,lowerdir=lower,upperdir=upper)

確かにマウントされています。では,このマウントしたディレクトリにファイルとディレクトリを作成してみましょう。

$ touch overlay/testfile_overlay
$ mkdir overlay/testdir_overlay
$ ls -F overlay/
testdir_overlay/  testfile_overlay

当たり前ですが普通にディレクトリとファイルができましたね。では,この時のlowerupperはどうなっているか確認してみましょう。

$ ls -F lower/ (下層側ディレクトリの確認)
$ ls -F upper/ (上層側ディレクトリの確認)
testdir_overlay/  testfile_overlay

以上のようにlowerには何もありませんが,upperには先ほど作成したファイルとディレクトリがあります。このように重ねあわせた上層であるディレクトリに変更が加えられていきます。

ここでさらにいろいろ試すために,一旦アンマウントします。

$ sudo umount overlay
$ mount -l | grep overlayfs
$

元から上層と下層にファイルが存在する状態でマウント

それではマウントされていない状態で下層であるlowerと上層であるupperにファイルとディレクトリを置いてみましょう。

$ touch lower/testfile_lower(下層にファイルを作成)
$ mkdir lower/testdir_lower (下層にディレクトリを作成)
$ touch upper/testfile_upper(上層にファイルを作成)
$ mkdir upper/testdir_upper (上層にディレクトリを作成)
$ ls -F lower/ (下層側ディレクトリの確認)
testdir_lower/  testfile_lower
$ ls -F upper/ (上層側ディレクトリの確認)
testdir_overlay/  testdir_upper/  testfile_overlay  testfile_upper

lowerにはファイルとディレクトリがひとつずつ,upperには先ほどoverlayfsをマウントした状態で作ったファイルとディレクトリに加えて,今作ったファイルとディレクトリが存在する状態です。

それでは再度マウントしてみましょう。

$ sudo mount -t overlayfs -o lowerdir=lower,upperdir=upper overlayfs overlay
$ ls -F overlay/ (マウントしたディレクトリの確認)
testdir_lower/    testdir_upper/  testfile_overlay
testdir_overlay/  testfile_lower  testfile_upper

先ほどマウントした状態で作ったファイル,ディレクトリと,マウントしない状態で作ったファイル,ディレクトリが全て見えますね。つまり下層と上層それぞれのディレクトリの内容が重ねあわせて見えるようになるわけです。これがunion filesystemです。

著者プロフィール

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

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

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

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

コメント

コメントの記入