ネームスペース
Rev.2を表示中。最新版はこちら。
mount処理ではフラグ、デバイス名およびマウントポジションのパラメータチェックをして、マウントパラメータによりdo_remount,do_loopback,o_change_type,do_move_mount,do_new_mountのどれかが呼ばれます。通常のマウントはdo_new_mountです。do_new_mountのdo_kern_mountでデバイスのスーパブッロクで初期化されたvfsmount構造体で作成され、マウントツリーに追加をし、do_add_mountでnamespace構造体のマウントツリーに追加されるという流れです。
Linuxカーネル解読室によるとネームスペースという概念はカーネル2.6から導入されたそうで、マウントツリーはそのネームスペースでのみ有効だ。ということです。namespaceは複数作成することができます。これは複数のマウントツリーをシステムで有することができるということです。マウントツリーは直接task_structに紐ずかすnamespace構造体を解して紐ずいています。プロセスはinitを親としてそのtask_structを通常は同じnamespaceをポイントする形で複製して作成されます。すなわちどれかのプロセスでmountしたり、unmountするとすべてのプロセスに反映されるというわけです。
はてなのnaoya?さんが詳しく解説されていますが、プロセスの複製はcloneで行います。その時パラメータとしてCLONE_NSを引数で呼び出すと、namespaceを新規の作成しそれをtask_strucのnamespaceとして紐づかせます。するとこのプロセス親として作成されるプロセスは、そうでないプロセスと独立したファイルシステムを持つということです。
具体的な話としては、あるユーザAのbashはnamespace-Aを、別のユーザBのbashにはnamespace-Bをもたせたとします。するとユーザAがあるファイルシステムをmountとしても、ユーザBには影響しないということです。
bashにcloneのパラメータを指定して起動するようなオプションってあるのだろうか?自分でclone呼び出しの起動プロセス記述しないとだめなのかな? それよりこの機能どのようなケースで使うのかな?