udev,hald,dbusを極めよう

概要

Fedoraインストール後にまずやることはサービスを止めることなんだけど、いつも、udev,hald,dbusを止めていいのかどうか迷うことと思います。

だから何?

ここでは、そこらへんの周辺の話を書いていこうと思います。今後、Fedoraをインストールしたあとの作業時に参考にしていただければ幸いです

(Linuxのここらへんの話は大変流動的なようで、来週にはここに書いてあることが無駄になるかもしれません : 2007-7-15(Sun))

全体像

かつて混沌としていたLinuxのドライバまわり(自分でinsmod書いたりhotplugとかmurasameとかdevfsとか懐かしいなー。嘘ですdevfs全然知らない。)。 しかし、そういった話は大体思い出の中だけの話で、今ではLinuxでも大体のものはそれなりにうまく動いてる。

さて、ここらへんを支えている技術のひとつが、udevとか、そういう系なのだけど、ここらへんはもうちょっと理解してから書く

ドライバがロードされるまで

atodekaku !

おげーわからん。ちょっと読めばわかると思ったのだけど。

/lib/modules/uname-r/modules.* を見てなんかやってるのがあるのだと思う(誰が?)

カーネルからユーザ空間へ

udevdの挙動を簡単に説明すると、なんかデバイスが見つかると、適切なノードを/dev以下に作る、といったところだろうか

これを実現するには、デバイスが見つかったときに、そのことがカーネルからudevdに通知されなければならない。

udevdはどうやってこのタイミングを通知してもらってるのだろうか。また、デバイスによっては、さらにいくつか必要な情報があるだろうけど、udevdはをどうやってカーネルから取得してるのだろうか

uevent

カーネルがユーザ空間にイベントを通知する仕組みとして、ueventというのがある。

netlinkのソケットを通じて、デバイスが繋がった、外された、等のイベントが文字列として送られてくるだけ。

↓以下のプログラムで動作が確認できる(要root)

#include <sys/socket.h>
#include <linux/netlink.h>
#include <string.h>

int
main()
{
        struct sockaddr_nl snl;
        char buf[512];
        int r;
        int fd;

        memset( &snl, 0, sizeof(snl) );

        snl.nl_family = AF_NETLINK;
        snl.nl_pid = getpid();
        snl.nl_groups = 1;

        fd = socket( PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT );
        if ( fd < 0 )
                perror("socket");

        r = bind( fd, (struct sockaddr*)&snl, sizeof(snl) );
        if ( r < 0 )
                perror("bind");

        while ( 1 ) {
                int len = recv( fd, buf, sizeof(buf), 0 );
                if ( len < 0 )
                        break;
                puts( buf );
        }
}

sysfs

udevdは、カーネルからueventが通知されると、その情報を使って/dev以下にノードを作る…のだけど、実際、 (atodekaku)

誰か教えて

namedevてなに

リンク集

僕があとで読む用

http://wiki.flowernet.gr.jp/?UdhHowto : 概要

http://www.gentoo.org/doc/ja/udev-guide.xml : Gentooでの設定

http://opentechpress.jp/kernel/03/06/05/2134218.shtml: namedev