bindと名前空間

bindの挙動は「bind遊び」などで書いてきたけど、今日、9fansを読んで知った事実について。

二つのディレクトリfooとbarがあるとする。

term% ls foo
foo/a
term% ls bar
bar/b

通常のbindだと、

term% bind foo bar
term% ls bar
bar/a
term% ns
    :
bind /usr/oraccha/tmp/foo /usr/oraccha/tmp/bar
term% unmount foo bar

barがfooに置き換えられる。

さて、ここでユニオンディレクトリを作ると、nsによって返される名前空間がちょっと意外な結果になる。

term% bind -a foo bar
term% ls bar
bar/a
bar/b
term% ns
    :
bind  /usr/oraccha/tmp/bar /usr/oraccha/tmp/bar 
bind -a /usr/oraccha/tmp/foo /usr/oraccha/tmp/bar

最後から2行目、tmp/bar自身にbindしているのだ。これは何だろうか?

さらに、unmount foo barしてもこれは残る。

term% unmount foo bar
term% ns
    :
bind  /usr/oraccha/tmp/bar /usr/oraccha/tmp/bar
term% unmount bar

そもそも、bind -a or -bとは、既存のマウントポイント(?)に何かを加えるという意味だ。今回の例だと、ディレクトリbarにディレクトリfooのファイルをユニオンする。しかし、ユニオン先のbarがマウントポイントでない(まだbindされていない)場合は、それを用意する必要がある。それで余分な一行が存在する必要がある。

カーネルのsysbind() -> bindmount() -> namec()あたりを読めば、確かに上に書いた通りの実装になってそう。これが実装上の都合なのか、ちゃんと意味があるのかまでは追えてない。