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()あたりを読めば、確かに上に書いた通りの実装になってそう。これが実装上の都合なのか、ちゃんと意味があるのかまでは追えてない。