ある日、sysctl -a を眺めていると面白そうなパラメータを見つけた。
vfs.devfs.rule_depth
devfs らしいからカーネルのソースを読んでみる。
このパラメータが導入されたのは src/sys/fs/devfs/devfs.c の 1.16 の時。
コミットログをざっくりと意訳するとこんな感じ。
前は "include" を処理する時に "running" マークを付けることで無限再帰を防いでいたんだけど、 このやり方だと DEVFS のインスタンスが2つある時に race condition を起こして効果がない時があった。 だからその代りに sysctl vfs.devfs.rule_depth で再帰の深度を制限することにしたよ!
なるほど。つまり、id:m-bird:20081213 みたいに /etc/devfs.rules で
[devfsrules_jail=4] add include $devfsrules_hide_all add include $devfsrules_unhide_basic add include $devfsrules_unhide_login [devfsrules_vpnjail=5] add include $devfsrules_jail add path 'tap*' unhide
こう、多重 include をするためには、
sysctl vfs.devfs.rule_depth=2
ってやって階層を増やしておく必要があるわけだ。
で、階層をオーバーした時は?と思ってソースを読むとコメントで…
ところで、制限をオーバーする include があったらどうする? 戻り値は実際のデバイス作成から時間がたち過ぎてて意味がないし、 printf するとノイズが多すぎる上にシステムに負荷がかかるし。 rate-limited message が使えるといいなぁ。
なんか愚痴ってた。
とりあえず現状では何もしてないので、id:m-bird:20081213 の例で設定を忘れていると
devfsrules_jail の include は展開されるけどもそれ以外が展開されないので結局
add path 'tap*' unhide
しか残らなくて、何も hide していない残念な設定で devfs が動くわけですね、はい。
で、これが man に載るのはいつでしょうか。