2009年9月7日月曜日

udev その2

 

udev その1の続き。

増え続ける70-persistent-net.rules君を止める為に、
udevのソースを解析しています。

最初に犯人を探しに行くのは無謀な為、まずは末端から攻めます。

 

私が予想しているudevの動作は、
1.device検出時にdeviceとrulesの情報を比較
2.どれも一致しない場合は新規作成
3.最終的に一致したものにrename

renameしている部分さえ見つければ、上に追っていくだけで、
全て明らかになるはずです。

 

その場所はすぐに見つかりました。

info(event->udev, "renamed netif to '%s'\n", event->name);
こんな文があったので、間違いないでしょう。

udev_event.cのudev_event_execute_rules()の中で発見しました。

 

どうやらsysnameを取ってきて比較をし、不一致の場合は、
eventとして渡ってきた方のsysnameに上書きするようです。

sysnameってなんぞや?というのを追ってみると、
struct udev_deviceのメンバで、udev_device_new_from_subsystem_sysname()
で設定されてるようです。

/class/[subsystem]/[sysname]
の形っぽいので、きっと”eth0”とかが入ってるのでしょう。

 

あ・・・・あれ?

ってことは、比較してる時点で既にeth2とかeth3とか新しい名前が出来あがってるわけで、
新しいデバイス認識してrules更新してそうなところは全然別の場所?

・・・ってことになりますよね。

それに、/class/…の形って/sys下に出来るのやつですよね。

あれって各々ドライバで、class_create()で作ってるやつと記憶してますが、
どーやって動いてるのでしょうねぇ・・・。

sysfsの動きも完璧じゃないので少々混乱中です。

 

しょうがない、createと付くものを片っ端から洗い出して、犯人探ししますかねぇ。
足を使って捜査、古い刑事みたいだw

周りに詳しい人いないのがなぁ・・・。

 

>> その2.5

0 件のコメント:

コメントを投稿