2001年に2.4カーネルでバインド(bind)マウントが、2002年の2.4.19でMount namespaceが導入されました。ただ、ユースケースによってはMount namespaceが行う分離は徹底しているので、もう少しマウントが共有されても良いシーンがあったようで、shared マウントなどのマウントプロパゲーションの考え方が2.6.15(2006 年 1 月)で導入されました。
マウントプロパゲーションの説明に入る前に、マウントプロパゲーションの説明で使う機能について説明しておきましょう。
バインドマウント
バインドマウントは、先に紹介したように2.4カーネルで導入された機能です。バインドマウントを使うと、ファイルシステム内のディレクトリツリーの一部を、どこか別の場所に再マウントできます。
例えば、次のようにディレクトリに対して実行すると、olddir
の内容とnewdir
の内容が同じになります。
$ mkdir olddir newdir
$ touch olddir/testfile (olddir内にファイルを作成する)
$ ls olddir/
testfile
$ ls newdir/ (newdirは空)
$ sudo mount --bind olddir newdir (バインドマウントする)
$ ls newdir/
testfile (olddirと同じディレクトリの内容になる)
また、バインドマウントはファイルに対しても実行できます。
$ touch a b
$ echo "test" > a (ファイルaにtestという文字列を書き込む)
$ cat a
test
$ cat b (ファイルbの中身は空)
$ sudo mount --bind a b (バインドマウントする)
$ cat b (ファイルaと同じ内容)
test
これがバインドマウントです。
Mount Namespace
Linuxが起動すると、色々なファイルシステムをシステム上で使用するためにマウント処理を行います。このマウントが行われるディレクトリをマウントポイントといいます。
例えば、/dev/sda1
というパーティションにファイルシステムを作成し、ルート(/
)としてマウントした場合は、この/
がマウントポイントです。その下のディレクトリの/home
というディレクトリに別のファイルシステムをマウントした場合、/home
もマウントポイントとなります。
これ以外にもシステムが利用する様々なファイルシステムが特定のディレクトリにマウントされます。
システムが起動する際には、デフォルトでMount Namespaceがひとつ作られます。このデフォルトのNamespaceとは別のNamespaceをシステム上に作成できます。Mount Namespaceは、このマウントポイントのリストをNamespaceごとに分離します。
新たにMount Namespaceを作った場合、新しく作られたNamespaceは、元のNamespaceのコピーとなります。このようにMount Namespaceには親子関係が生じます。
基本的には、Mount Namespaceが別になるとマウントポイントのリストが別になります。つまり、新たに作った子Namespaceでマウント操作を行った場合、そのマウントは親には影響しません。子Namespace内でのみ有効なマウントポイントとなります。
この機能を使って、コンテナでは他のコンテナとの間で独立したマウントを行っています。