Help us understand the problem. What is going on with this article?

実践! OverlayFS

More than 5 years have passed since last update.

先日、OverlayFSについて 調べたので、今回は実際に使ってみて挙動を確かめてみた。

OverlayFSの基礎

ドキュメントには色々書いているが、Overlayfsの基本的な考え方は以下の通り

  1. Readonlyな下の層と、Writableな上の層を重ね合わせ1つのファイルシステムに見せる
  2. このとき、ディレクトリは重ね合わされ、ファイルは上から見ていく
    • コンフリクトしていたらファイルだと上が優先され、ディレクトリだとマージされる
  3. 下(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オプションを使えばよい。

awakia
検索とか推薦とかやってきたエンジニア。早稲田の山名研出身。大学院の頃、論文を書こうとしない僕を見かねた教授に、北京のMSRAに追放されるが3ヶ月後無事帰還。 大学を卒業後、エンジニアのブラックホールとの別名を持つGoogleに吸収されそうになるが1年2ヶ月後無事生還。 現在は、Wantedly(https://www.wantedly.com/ )の4番目のエージェントとして救出活動に専念。
http://awakia-n.hatenablog.com/
wantedly
「シゴトでココロオドル」ためのビジネスSNS「Wantedly」の開発・運営をしています。
https://wantedlyinc.com/ja/presentations
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away