繼續學習udev(轉)

由于在kernel启动未完成以前我们的设备文件不可用,如果使用mtd设备作为rootfs的挂载点,这个时候/dev/mtdblock
这个设备目录是不存在的,我们无法让kernel通过/dev/mtdblock/X这样的设备找到rootfs,kernel只好停在那里惊慌。
这个问题我们可以通过给kernel传递设备号的方式来解决,在linux系统中,mtdblock的主设备号是31,part号
从0开始,那么以前的/dev/mtdblock/3就等同于31:03,以次类推,所以我们只需要修改bootloader传给kernel
的cmd line参数,使root=31:03,就可以让kernel在udevd未起来之前成功的找到rootfs。

另外一种方法就是给kernel传递未经归类的设备文件名,在udev未创建之前,所有的设备实际上已经通过sysfs
建立,mtdblockX的位置相对于/sys/block/mtdblockX/dev,这个文件里存放着mtdblockX的设备号,形式与上
一种方式相同。这时由于没有相应的udev规则,所有的设备都被隐含地映射到/dev目录下,mtdblockX对应于
/dev/mtdbockX,这样我们给kernel传递root=/dev/mtdblock3,kernel发现/dev没有被建立,就自动从映射表里
查找对应关系,最后取出/sys/block/mtdblockX/dev里的设备号,完成rootfs的挂载。

 

 

>2、在rootfs/etc/udev下建立一个rules.d目录,生成一个空的配置文件touch etc/udev/rules.d/udev.conf。

这里是不是有些问题,我本机上的udev.conf文件是在/etc/udev/下的。

 

 

在udev_version.h中有以下两个定义:
#define UDEV_CONFIG_FILE "/etc/udev/udev.conf"
#define UDEV_RULES_FILE "/etc/udev/rules.d"

我想之所以采用rules.d的目录形式,其目的和rcX.d相同,可以在规则十分复杂的情况下用数字链接的方式控制
启动顺序。由于版本的不断升级,代码以及结构也越来越漂亮。

我们按照这种默认的方式来编写和存放规则文件,不失为一个好习惯。

 

 

我的/etc/udev/下有rules.d目录和udev.conf文件
我的意思是udev.conf文件是否应该在/etc/udev目录而非/etc/udev/rules.d目录下


--------------------
Ubuntu图形界面,一切尽在掌握

 

 

 

是这样的,谢谢指正!

更正如下:
========================
2、在rootfs/etc/udev下建立一个rules.d目录,生成一个空的配置文件touch etc/udev/rules.d/udev.rules
========================

兄弟确实是火眼金睛啊,这里有个笔误

 

 

 

有两个问题:
1、udevstart 后面不用 udevsettle 会不会出问题?
2、我目前使用的两个2.6机器,gentoo 和 debian 的新版本似乎都放弃了 udevstart。
gentoo 的启动脚本里面启动 udevd 之后检查 kernel 的版本,如果高于 2.6.14 则使用 udevtrigger,低于或者等于则使用 udevstart(两种情况后面都有 udevsettle);由于我现在还在使用 2.6.11 所以启动时使用的是 udevstart,udev 版本是 098。
至于 debian testing 我现在 kernel 的版本是 2.6.17,udev 版本是 100,debian 的udev安装包里已经没有 udevstart 了,启动脚本使用 udevd+udevtrigger+udevsettle。
是不是 udevstart 要被 udevtrigger 取代了?

 

 

简单看了一下udev的代码,个人以为:

1,udevstart后面不用udevsettle可能会出错。因为udevstart要启动其他的程序来完成任务,
如果不运行udevsettle,可能udevstart结束了,但/dev下的设备还没有创建。
2,udevtrigger比udevstart优化一些,功能强一些,但udevstart也可以用。
内核版本的分水岭是2.6.15,新的udev,比如udev-100,要求内核2.6.15(包含)以上。
可能udevtrigger是新的udev才有的东西

 

 

想问一下:
既然udev是user space,我在2410的linux移植中,如果选用devfs,则在引导kernel时devfs会自动建立设备包括引导需要的console或ttyS,但如果我不用devfs而选用udev,那系统就不能正常引导,而非要自己在/dev下创建console或ttyS。
另外我将udevd和udevstart按楼主所说方法移植到ARM linux中,在执行rcS内容时,提示
Starting udevd...
/etc/init.d/rcS: /etc/init.d/rcS: 7: /sbin/udevd: not found
/etc/init.d/rcS: /etc/init.d/rcS: 8: /sbin/udevstart: not found

可是在/sbin/下确实存在这两个文件,而且/etc/udev/下面的文件我也已经建好。
我在进入shell后,手动运行:
/sbin $ udevd --daemon
/bin/sh: udevd: not found
还是一样的情况。不知我的理解是否有误?还是哪里出了问题

posted @ 2008-07-25 15:46  旅人  阅读(1222)  评论(0编辑  收藏  举报