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

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

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

上層側への変更

それでは存在するファイルに変更を加えてみましょう。先ほどマウントした状態では上層にファイルができましたし,上層に存在するファイルに変更を加えた時の動きは容易に想像がつくのではないでしょうか。

$ echo "test" > overlay/testfile_upper (上層側ファイルを変更)
$ cat overlay/testfile_upper (マウントしたディレクトリでファイルを確認)
test
$ cat upper/testfile_upper(上層側ディレクトリでファイルを確認)
test

上層にあるファイルに変更を加えると,そのまま上層にあるファイルが変更されています。上層にあるディレクトリに変更を加えても同様にそのまま上層が変更されます。

$ touch overlay/testdir_upper/testfile (上層側ディレクトリにファイルを作成)
$ ls overlay/testdir_upper/ (マウントしたディレクトリでファイルを確認)
testfile
$ ls -F upper/testdir_upper/ (上層側ディレクトリでファイルを確認)
testfile

上層に存在するディレクトリ内にファイルを作ると,そのまま上層であるディレクトリupper/testdir_upper以下にファイルが作成されました。

下層側への変更

それでは下層側に存在するファイルやディレクトリに変更を加えるとどうなるのでしょうか? 早速変更して下層側を確認してみましょう。

$ echo test > overlay/testfile_lower  (下層側ファイルを変更)
$ touch overlay/testdir_lower/testfile(下層側ディレクトリにファイルを作成)
$ cat lower/testfile_lower (下層側ディレクトリでファイルを確認)
$ ls lower/testdir_lower/  (下層側ディレクトリでディレクトリを確認)
$

下層側に存在するファイルは元通りで変更は加えられていませんし,ディレクトリにファイルは存在しません。上層側を確認してみましょう。

$ ls -F upper/ (上層側ディレクトリの確認)
testdir_lower/    testdir_upper/  testfile_overlay
testdir_overlay/  testfile_lower  testfile_upper
$ cat upper/testfile_lower  (上層側にできたファイルの確認)
test
$ ls -F upper/testdir_lower/(上層側にできたディレクトリの確認)
testfile

先ほどまでは上層には存在しなかったtestdir_lowertestfile_lowerが存在していますね。ファイルの中身は先ほど書き込んだ中身になっていますし,出現したディレクトリ内には先ほど作成したファイルが存在します。

このことから,変更は常にupperdirオプションで指定した上層側ディレクトリ以下になされることがわかります。ディレクトリやファイルが下層にも上層にも存在する場合は上層側のものが見えます。

ファイルやディレクトリの消去

ここまではファイルの作成や変更を見てきました。それではファイルやディレクトリを削除した場合はどうなるでしょう?

上層側に存在するファイルやディレクトリの場合はわかりやすいと思います。上層側に存在するファイルが消去されます。

$ rm overlay/testfile_overlay   (マウントしたディレクトリでファイルを削除)
$ rmdir overlay/testdir_overlay/ (マウントしたディレクトリでディレクトリを削除)
$ ls -F overlay/(マウントしているディレクトリで確認)
testdir_lower/  testdir_upper/  testfile_lower  testfile_upper
$ ls -F upper/ (上層側ディレクトリで確認)
testdir_lower/  testdir_upper/  testfile_lower  testfile_upper

先ほどまで上層側に存在していたtestdir_overlaytestfile_overlayがマウントされたディレクトリでも上層側のディレクトリでも消去されていますね。

では,下層側のファイルやディレクトリを消去した場合はどうなるでしょう?

$ ls -F overlay/
testdir_lower/  testdir_upper/  testfile_lower  testfile_upper
$ rm overlay/testfile_lower(下層側ファイルをマウントしたディレクトリで削除)
$ ls -F overlay/(マウントしたディレクトリで確認)
testdir_lower/  testdir_upper/  testfile_upper
$ ls -F lower/ (下層側ディレクトリで確認)
testdir_lower/  testfile_lower
$ ls -F upper/ (上層側ディレクトリで確認)
testdir_lower/  testdir_upper/  testfile_lower@  testfile_upper

下層にも上層にも存在していたtestfile_lowerファイルを消してみました。すると,下層側にはそのままの状態でファイルが残っているようですが,上層側では先ほどまでファイルとして存在していたtestfile_lowerがシンボリックリンクになっています。もう少し詳しく見てみると,

$ ls -lF upper/testfile_lower
lrwxrwxrwx 1 root root 18 Jan 19 20:29 upper/testfile_lower -> (overlay-whiteout)

ご覧にように上層側ディレクトリ以下に存在したtestfile_lowerは"(overlay-whiteout)"へのシンボリックリンクになっています。つまり消去をした場合は上層側に変更が加えられ,⁠削除した」という印のために"(overlay-whiteout)"へのシンボリックリンクになります。下層に存在するファイルを上層で修正するために"whiteout(白の修正液)"というわけです。

ディレクトリも消去してみましょう。

$ rm -rf overlay/testdir_lower/(下層側に存在するディレクトリをマウントしたディレクトリで削除)
$ ls -F lower/(下層側ディレクトリで確認)
testdir_lower/  testfile_lower
$ ls -lF upper/*_lower(上層側ディレクトリで確認)
lrwxrwxrwx 1 root root 18 Jan 19 20:37 upper/testdir_lower -> (overlay-whiteout)
lrwxrwxrwx 1 root root 18 Jan 19 20:29 upper/testfile_lower -> (overlay-whiteout)

ディレクトリでも同様になりましたね。

ところで,上記の例では表面的には見えていませんが,"(overlay-whiteout)"へのシンボリックリンクが張られた際,同時に拡張ファイル属性"trusted.overlay.whiteout"に"y"がセットされるようです。これも確認しておきましょう。

$ sudo getfattr -h -n "trusted.overlay.whiteout" upper/testdir_lower
# file: upper/testdir_lower
trusted.overlay.whiteout="y"

$ sudo getfattr -h -n "trusted.overlay.whiteout" upper/testfile_lower
# file: upper/testfile_lower
trusted.overlay.whiteout="y"

まとめると,

  • 変更は常にupperdirオプションで指定した上層側ディレクトリ以下になされる
  • lowerdirオプションで指定した下層側に存在するファイルに加えられた変更は上層側になされる。変更対象であるファイルやディレクトリが上層側にない場合は作成される
  • 下層側に存在するファイルやディレクトリを削除すると"(overlay-whiteout)"へのシンボリックリンクが作成され,拡張ファイル属性"trusted.overlay.whiteout"が"y"に設定される

となります。

非常にシンプルでわかりやすい動きですね。

著者プロフィール

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

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

Plamo Linuxメンテナ

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