先日、OverlayFSについて 調べたので、今回は実際に使ってみて挙動を確かめてみた。
OverlayFSの基礎
ドキュメントには色々書いているが、Overlayfsの基本的な考え方は以下の通り
- Readonlyな下の層と、Writableな上の層を重ね合わせ1つのファイルシステムに見せる
- このとき、ディレクトリは重ね合わされ、ファイルは上から見ていく
- コンフリクトしていたらファイルだと上が優先され、ディレクトリだとマージされる
- 下(readonly)にしかないファイルを編集すると上にコピーが作成される
実験環境
最新のCoreOSはOverlayFSがマージされたKernel 3.18が入っているので、これのvagrantを使う
$ git clone https://github.com/coreos/coreos-vagrant
$ cd coreos-vagrant
$ vagrant up
$ vagrant ssh
念のため、CoreOSの中でKernelのバージョンを確認しておこう。
core@core-01 ~ $ uname -r
3.18.2
OverlayFSの実験
overlayfsを行うためには、以下の4つのディレクトリが必要
-
work
: ワーキングディレクトリ。upperと同じファイルシステムであり、空である必要がある -
lower
: 下の層のディレクトリ。読み込み専用で、様々なファイルシステムが使用できる -
upper
: 上野層のディレクトリ。書き込み可能であり、readdirのd_typeを適切に返す必要がある。このためNFSは使用できない -
merged
: overlayfsのマウント先のディレクトリ
準備
$ mkdir work
$ mkdir upper
$ mkdir lower
$ mkdir merged
$ echo "upper" >> upper/both
$ echo "upper" >> upper/only_upper
$ echo "lower" >> lower/both
$ echo "lower" >> lower/only_lower
必要な4つのディレクトリを作り、挙動を確かめるため以下の3種類のファイルを準備:
-
both
: 上下両方に存在するファイル -
only_upper
: 上のみに存在するファイル -
only_lower
: 下のみに存在するファイル
overlayfsでマウント
$ sudo mount -t overlay overlay -o lowerdir=lower,upperdir=upper,workdir=work merged
-t
オプションにoverlay
と指定することでoverlayfsでマウントすることを示す
-o
は、-t
で指定したファイルシステムに必要なパラメータを指定する部分。lowerdir
,upperdir
,workdir
のすべての指定が必要。
workdirとかなくても大丈夫だろとたかをくくっていると、悪いところの可能性が豊富すぎるよくわからないエラーが出るので注意。
$ sudo mount -t overlay overlay -o lowerdir=lower,upperdir=upper merged
mount: wrong fs type, bad option, bad superblock on /home/core/overlay,
missing codepage or helper program, or other error
In some cases useful info is found in syslog - try
dmesg | tail or so.
挙動の確認
lsをするとちゃんと3つのファイルが見えている:
$ ls merged
both only_lower only_upper
それぞれのファイルの中身を見ると、両方にあるファイルboth
の中身は上のものの中身になっている:
core@core-01 ~ $ cat merged/only_lower
lower
core@core-01 ~ $ cat merged/only_upper
upper
core@core-01 ~ $ cat merged/both
upper
下のみにしか無いファイルをeditすると、上にファイルがコピーされ、それが編集される:
$ ls upper
both only_upper
$ vi merged/only_lower
$ ls upper
both only_lower only_upper
補足
本来overlayfsは何層にも重ねることができ、てっぺんの層以外はReadOnlyでよい。
この時、overlayfs でのマウントのupperdirにもNFSが使える。
このようにする際にはmount
の-r --read-only
オプションを使えばよい。