bind遊び

なかなか先に進まない名前空間のコード読みだが,具体的なイメージをつけるために,実際にコマンドを使って挙動を追ってみる.
例としてディレクトリaとbを作り,それぞれの直下にhello.txtというファイルを用意する.a/hello.txtには"Hello,world!\n"と書き込み,b/hello.txtは空ファイルとする.

term% mkdir a b
term% cat > a/hello.txt
Hello,world
term% touch b/hello.txt
term% ls -l a
--rw-rw-r-- M 8 oraccha oraccha 13 Apr  6 11:17 a/hello.txt
term% ls -l b
--rw-rw-r-- M 8 oraccha oraccha 0 Apr  6 11:17 b/hello.txt

ここで,bind(1)コマンドを使ってbをaで置きかえる.

term% bind a b
term% ls -l a
--rw-rw-r-- M 8 oraccha oraccha 13 Apr  6 11:17 a/hello.txt
term% ls -l b
--rw-rw-r-- M 8 oraccha oraccha 13 Apr  6 11:17 b/hello.txt
term% cat b/hello.txt
Hello,world!
term% unmount a b

予想通りの結果だ.

続いて,ユニオンディレクトリを試してみる.bよりaのファイルを優先する場合は-bオプションをつける.

term% bind -b a b
term% ls -l a
--rw-rw-r-- M 8 oraccha oraccha 13 Apr  6 11:17 a/hello.txt
term% ls -l b
--rw-rw-r-- M 8 oraccha oraccha  0 Apr  6 11:17 b/hello.txt
--rw-rw-r-- M 8 oraccha oraccha 13 Apr  6 11:17 b/hello.txt
term% cat b/hello.txt
Hello,world!
term% unmount a b

catの結果は予想通りだけど,b/hello.txtが二つ見える!へぇ.

も一つ,-aオプションの場合も.

term% bind -b a b
term% ls -l a
--rw-rw-r-- M 8 oraccha oraccha 13 Apr  6 11:17 a/hello.txt
term% ls -l b
--rw-rw-r-- M 8 oraccha oraccha 13 Apr  6 11:17 b/hello.txt
--rw-rw-r-- M 8 oraccha oraccha  0 Apr  6 11:17 b/hello.txt
term% cat b/hello.txt
term% unmount a b

lsの表示が逆になったな.名前空間の検索順序とlsの表示は対応しているんだろうか?

ちなみにこの状態にディレクトリbにファイルを生成しようとすると,許可できないとエラーになる.もちろんディレクトリaにファイルを生成することはできる.

term% touch b/foo
touch: b/foo: cannot create: 'b/foo' mounted directory forbids creation

ユニオンディレクトリにおいてファイル生成を許すためには,-cオプションを指定する必要がある.

term% bind -bc a b

蛇足だが,rmdirというコマンドは存在せず,ディレクトリを消すときもrm(1)だ.