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