まとめて束ねるUnionFSの不思議な世界

こんにちは、鈴木です。

UnionFS をご存知でしょうか?

Docker を使い始めてから UnionFS の存在を知ったのですが、ちょっと面白い動きをするのでご紹介します。

 

UnionFS とは

UnionFS (Union FileSystem) を使用すると、複数のファイルシステムを一つの場所にマウントすることができます。

例えば、taro と jiro というディレクトリがあるとして、それぞれ以下のファイルを持っているとします。

これを hanako というディレクトリにまとめて、以下のように見せることができます。

 

UnionFS を使ってみる

以下は Ubuntu で試しました。unionfs-fuse というパッケージがあるので、これをインストールします。

次に taro と jiro というディレクトリを作成し、それぞれの中に適当なファイルを作成します。

それではいよいよ、複数のディレクトリを一つのマウントポイントに束ねてみます。

hanako というディレクトリを作成し、そこに taro と jiro をマウントしてみましょう。

unionfs-fuse コマンドでマウントすることができます。引数は taro と jiro を一つにまとめて hanako にマウントする(どちらも RW=読み書き可能)という意味です。

tree コマンドで確認すると、taro と jiro が一つに束ねられて、hanako にマウントされたことが分かります。

読み書き可能としてマウントしたので、hanako ディレクトリ内のファイルを変更することができます。マウント時に「RW」ではなく「RO」を指定すれば、読み取り専用としてマウントすることができます。

それでは一度マウントを解除しましょう。

 

Copy on Write

次は Copy on Write を試してみましょう。

新しく changed というディレクトリを作成し、taro と jiro と changed をまとめて hanako にマウントします。ただし、taro と jiro は読み取り専用、changed だけ書き込み可能としてマウントします。

この状態で各ディレクトリの内容を確認すると、以下のようになっています。

hanako/hoge の内容を変更してみましょう。

もう一度各ディレクトリの内容を確認すると、以下のようになります。

そして各ディレクトリにあるファイル hoge の内容を確認すると、次のようになります。

hanako/hoge の内容を "change!" に変更したので hanako/hoge の内容が "change!" となっているのは当然ですが、元々の hoge ファイルがあった taro/hoge の内容を確認すると、変更前の "hoge" のままになっています。そして読み書き可能である changed ディレクトリに hoge というファイルが作成され、内容は "change!" になっています。

このように元のファイルは読み取り専用として、変更された場合は別のディレクトリ(今回は changed ディレクトリ)に変更されたファイルを保存させる、といったことが可能です。ファイルの移動や削除をした場合も、マウント元ディレクトリにあるファイルは変更されず、changed ディレクトリに変更されたファイルが現れます。

このような性質を利用すると、マウント元を変更させたくない or 読み取り専用メディアにあるので変更できない、という場合にも活用できそうです。

Docker の内部でこのような面白い技術が使われていると分かると、なんだか楽しくなってきますね。

 

Comments are closed, but you can leave a trackback: Trackback URL.