今回からはLXCがコンテナイメージを置く領域に使えるいろいろなストレージバックエンドを利用し、
LXCでいろいろなストレージバックエンドを利用する方法を紹介する前に、
タイトルは
overlayfsとは
overlayfsはunion filesystemの実装の1つで、
話題のDockerが持つ特長として、
Ubuntuなどの一部のディストリビューションではaufsが使えますが、
Ubuntuでは3.
Ubuntuで対応していたためか、
3.
Dockerでは1.
さらに、
overlayfsを使ってみる
union filesystemとか
まずはUbuntu 14.
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
当たり前ですが普通にディレクトリとファイルができましたね。では、lower
とupper
はどうなっているか確認してみましょう。
$ 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
先ほどマウントした状態で作ったファイル、
上層側への変更
それでは存在するファイルに変更を加えてみましょう。先ほどマウントした状態では上層にファイルができましたし、
$ 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/
以下にファイルが作成されました。
下層側への変更
それでは下層側に存在するファイルやディレクトリに変更を加えるとどうなるのでしょうか? 早速変更して下層側を確認してみましょう。
$ 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_
とtestfile_
が存在していますね。ファイルの中身は先ほど書き込んだ中身になっていますし、
このことから、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_
とtestfile_
がマウントされたディレクトリでも上層側のディレクトリでも消去されていますね。
では、
$ 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_
ファイルを消してみました。すると、testfile_
がシンボリックリンクになっています。もう少し詳しく見てみると、
$ ls -lF upper/testfile_lower lrwxrwxrwx 1 root root 18 Jan 19 20:29 upper/testfile_lower -> (overlay-whiteout)
ご覧にように上層側ディレクトリ以下に存在したtestfile_
は"(overlay-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)
ディレクトリでも同様になりましたね。
ところで、
$ 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"に設定される
となります。
非常にシンプルでわかりやすい動きですね。
3.18カーネルのoverlayfs
さて、
しかし、
使い方として現れる変更点は以下です。
workdir
オプションが必要になりました。workdir
はupperdir
で指定するディレクトリと同じファイルシステムに存在する空のディレクトリである必要があります。- 下層側に存在するファイルやディレクトリを削除した場合、
上層側にはデバイスノード番号が"0,0"であるキャラクタデバイスファイルが作成されます。これは"whiteout"のために新たに3. 18で導入された 機能です。 - ファイルシステムのタイプ名が"overlayfs"から"overlay"に変更されました。overlayfsをカーネルモジュールにしている場合はモジュール名が"overlay"になります。
ファイルシステムのタイプ名が変更された理由はコミットログに書かれています。UbuntuやSUSEでは3.
タイプ名を変更することにより、
また、
タイプ名を変更しておくと、/proc/
内で"overlay"という行が存在するか、
それではUbuntu 14.
ここではPlamo Linux 5.
# mkdir lower upper overlay work (workdir用にworkという名前でディレクトリを作成) # touch lower/testfile_lower upper/testfile_upper (テスト用ファイルの作成) # mkdir lower/testdir_lower upper/testdir_upper (テスト用ディレクトリの作成) # mount -t overlayfs -o lowerdir=lower,upperdir=upper,workdir=work overlay overlay ("overlayfs"というタイプ名でマウント) mount: unknown filesystem type 'overlayfs' ("overlayfs"というタイプ名だとエラー) # mount -t overlay -o lowerdir=lower,upperdir=upper,workdir=work overlay overlay ("overlay"というタイプ名でマウント) # mount -l | grep overlay (マウントの確認) /root/overlay_test/overlay on /root/overlay_test/overlay type overlay (rw,lowerdir=lower,upperdir=upper,workdir=work) # ls -F overlay/ (マウントしたディレクトリの確認) testdir_lower/ testdir_upper/ testfile_lower testfile_upper
テスト用にファイルやディレクトリを作成したあと、
マウントしたディレクトリ内で下層側と上層側それぞれに存在するファイル、
それではマウントした状態で、
# echo "test" > overlay/testfile_lower(下層側ファイルを変更) # touch overlay/testdir_lower/testfile(下層側ディレクトリにファイルを作成) # cat lower/testfile_lower(下層側ファイルの確認) # cat upper/testfile_lower(上層側にできたファイルの確認) test # ls lower/testdir_lower/(下層側ディレクトリの確認) # ls upper/testdir_lower/(上層側にできたディレクトリの確認) testfile
以上のようにUbuntu 14.
それではいよいよ、
# rm overlay/testfile_lower (下層側ファイルの削除) # rm -rf overlay/testdir_lower/ (下層側ディレクトリの削除) # ls -F overlay/ testdir_upper/ testfile_upper (消去された) # ls -lF upper/*_lower (上層側ディレクトリの確認) c--------- 1 root root 0, 0 1月 20日 19:26 upper/testdir_lower c--------- 1 root root 0, 0 1月 20日 19:26 upper/testfile_lower
Ubuntu 14.
拡張ファイル属性も見ておきましょう。
# getfattr -n trusted.overlay.whiteout upper/testdir_lower upper/testdir_lower: trusted.overlay.whiteout: No such attribute # getfattr -n trusted.overlay.whiteout upper/testdir_lower upper/testdir_lower: trusted.overlay.whiteout: No such attribute
拡張属性はついていません。
opaque(不透明)ディレクトリ
overlayfsにはopaqueディレクトリという機能があります。これはどのバージョンのoverlayfsでも使えるはずです。
通常のoverlayfsでは上層側と下層側が透過的に重ねあわせられますが、
簡単に見てみましょう。ここでは3.
# mkdir lower upper overlay work # mkdir lower/opaquetest upper/opaquetest (上層、下層側ディレクトリにディレクトリを作成) # touch lower/opaquetest/testfile_lower upper/opaquetest/testfile_upper (作成したディレクトリにファイルを作成)
以上のようにopaquetest
というディレクトリを上層側と下層側のディレクトリに作成します。その中にそれぞれファイルを作成します。
このままovarlay
ディレクトリにマウントすると、overlay/
の下には2つのファイルが見えるはずです。
# mount -t overlay -o lowerdir=lower,upperdir=upper,workdir=work overlay overlay
# ls overlay/opaquetest/ (マウントしたディレクトリの確認)
testfile_lower testfile_upper
# umount overlay
期待通り2つファイルが存在しますね。確認したら一度アンマウントします。
そして、
# setfattr -n "trusted.overlay.opaque" -v "y" upper/opaquetest/ # getfattr -n "trusted.overlay.opaque" upper/opaquetest/ # file: upper/opaquetest/ trusted.overlay.opaque="y" #
拡張ファイル属性が設定されているのを確認してマウントします。
# mount -t overlay -o lowerdir=lower,upperdir=upper,workdir=work overlay overlay
# ls overlay/opaquetest/
testfile_upper (上層側に存在するファイルしか見えない)
先ほどと違って、
overlayfsを使う上での注意
現時点でoverlayfsを使う場合には注意すべき点があります。
3.
以下はほとんど当てはまる人はいないと思いますが、/proc/
を使ったoverlayfsの仕様の判定ができませんので注意してください。この間のoverlayfsはタイプ名が"overlayfs"である一方、
overlayfsの将来
overlayfsは今後も仕様が変わっていくようです。
overlayfsのリポジトリにある"overlayfs-next"というブランチを見ていると、
筆者の手元で3.
下層用にディレクトリを3つ作成し、
# ls -F lower1/ lower2/ lower3/ overlay/ upper/ work/ # ls -F lower?/* lower1/testfile_lower1 lower2/testfile_lower2 lower3/testfile_lower3
ここでlowerdir
オプションで3つのディレクトリを":"で連結してマウントしてみると、overlay
ディレクトリ以下にはtestfile_
、testfile_
、testfile_
という3つのファイルが存在するように見えます。
# mount -t overlay -o lowerdir=lower1:lower2:lower3,upperdir=upper,workdir=work overlay overlay # mount -l | grep overlay (マウントの確認) /root/overlay/overlay on /root/overlay/overlay type overlay (rw,lowerdir=lower1:lower2:lower3,upperdir=upper,workdir=work) # ls -F overlay (マウントしたディレクトリの確認) testfile_lower1 testfile_lower2 testfile_lower3
lowerdir
のみを指定してupperdir
を指定しないでマウントできるようにもなるようで、
この変更がいつの時点でカーネルにマージされるのかはわかりません。将来マージされて複数の下層ディレクトリが使えるようになるとコンテナの差分管理がさらに便利になりそうですね
まとめ
今回は、
コンテナ以外でも面白い使い方ができそうなファイルシステムです。皆さんも面白い使い方を考えてみてはいかがでしょうか?
次回以降はoverlayfsを含め、