ほっしーの技術ネタ備忘録

技術ネタの備忘録です。基本的に私が忘れないためのものです。他の人の役にも立つといいなぁ。

vfs.devfs.rule_depth の謎


ある日、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 に載るのはいつでしょうか。