概要
コンテナ(LXC)について調べようと思っていろいろ見ていたら、いろいろ脱線してカーネルのことについて復習したのでその時の自分めもめも。
用語メモメモ
マウント
マウントコマンド
mount -t <タイプ> -o <オプション> <デバイスファイル> <マウントポイント>
マウントとは
- ファイル・システム(super_block)をシステムのディレクトリツリー(マウントポイント)に関連づけること。関連づけるとはvfsmount構造体、mount構造体に対してマウントポイント、スーパーブロックなどを設定すること。
- ファイルシステム≒デバイス
- ファイルシステムとファイルシステムを結びつける
ファイルシステムの実体
-
super_block構造体
- s_inodesかコメントに書かれているようにすべてのinodeリストに繋がっている。
OSをインストールするときに各パーティションに対してファイル・システムを決定してシステムのディレクトリツリーを割り当てる。OS起動するとメモリ上ではそのファイル・システム(システムの各部分)をシステムの対応するディレクトリツリーにマウントする。
マウントの関連性を表している構造体
-
- struct vfsmount mntでvfsmountと関連している。
- マウントポイントなどなど
これがメモリ上で構築されているのでマウント状態がわかる。
名前空間(namespace)
- カーネル2.6から導入された
- task_struct構造体(プロセスの実体)から->namespaceで辿れる。(2.6系ではあるみたいだけど、それ以降はどうもnsporxyからたどるみたい?)
- vfsmount構造体はnamespace構造体から知ることができる。
名前空間の使用
各プロセス(task_struct)はnamespace構造体を保持している。そのプロセスからforkする場合、forkされたプロセス(task_strcut)はnamespace構造体を共有する。共有せずに新たな名前空間を使用したい場合clone(CLONE_NEWSNSフラグ指定)を使用する。するとnamespase構造体は共有せずに別に独立して獲得されるみたい。
なのでunshareコマンドなんかは内部でcloneしてCLONE_NEWSNSフラグが指定されているのではないのかなぁ。
名前空間まとめ
マウントはvfsmount構造体、mount構造体に対してマウントポイントなどを設定することなので、cloneを使用して名前空間が異なるプロセスがあった場合、一つの名前空間でマウントなどを実行した場合は、もう一つの名前空間のプロセスのマウントには影響を与えない(vfsmount構造体などは独立しているので)。
なるほどー、コンテナで名前空間を使ってる意味が見えたきがします。