转载,原帖地址:http://blog.chinaunix.net/u/6541/showart_396425.htmlhtml
由于自己从事存储行业,在工做中屡次碰到用户有这样的要求:个人linux系统中原来有一块SCSI硬盘,系统分配的设备文件是/dev/sda。如今新增长了一个外置的磁盘阵列,经过SCSI卡链接。但接上这个磁盘阵列后,/dev/sda变成了磁盘阵列的硬盘了,原来内置的SCSI硬盘变成了 /dev/sdb,我但愿将设备文件固定下来。
过去,我老是对用户说,这个比较麻烦,由于/dev/sda等文件都是linux内核自动分配的。很难固定下来,除非你更改加载SCSI卡驱动程序的顺序,让内置硬盘链接的SCSI卡比外接磁盘阵列链接的SCSI卡的驱动模块先加载到内核,这样就能保证/dev/sda老是指向内置的硬盘。但这种解决方法毕竟不太完美,并且对于其余的即插即用设备,如USB设备等都不适用。
近来,经过安装和升级linux-2.6内核,发现这个问题已经能够经过2.6内核新的sysfs文件系统和udev程序获得解决。下面就是我在学习了udev配置后的一点心得。我喜欢用FAQ的形式来讲明。
问:什么是udev?
答:udev是一种工具,它可以根据系统中的硬件设备的状态动态更新设备文件,包括设备文件的建立,删除等。设备文件一般放在/dev目录下。使用udev后,在/dev目录下就只包含系统中真正存在的设备。
问:udev支持什么内核?
答:udev只支持linux-2.6内核,由于udev严重依赖于sysfs文件系统提供的信息,而sysfs文件系统只在linux-2.6内核中才有。
问:udev是一个内核程序仍是用户程序?
答:udev是一个用户程序(user-mode daemon)。
问:udev和devfs有什么差异?
答:udev可以实现全部devfs实现的功能。但udev运行在用户模式中,而devfs运行在内核中。据称:devfs具备一些不太容易解决的先天缺陷。
问:udev的配置文件放在哪里?
答:udev是一个用户模式程序。它的配置文件是/etc/udev/udev.conf。这个文件通常缺省有这样几项:
linux
问:udev的工做过程是怎样的?
答:因为没有研究过udev的源程序,不敢贸然就说udev的工做过程。我只是经过一些网上的资料和udev的说明文档,大体猜想它的工做过程多是这样的。
shell
问:udev的规则文件的语法是怎样的?
答:udev的规则文件以行为单位,以"#"开头的行表明注释行。其他的每一行表明一个规则。每一个规则分红一个或多个“匹配”和“赋值”部分。“匹配”部分用“匹配“专用的关键字来表示,相应的“赋值”部分用“赋值”专用的关键字来表示。“匹配”关键字包括:ACTION,KERNEL,BUS, SYSFS等等,“赋值”关键字包括:NAME,SYMLINK,OWNER等等。具体详细的描述能够阅读udev的man文档。
下面举个例子来讲明一下,有这样一条规则:
SUBSYSTEM=="net", ACTION=="add", SYSFS{address}=="00:0d:87:f6:59:f3", IMPORT="/sbin/rename_netiface %k eth0"
这个规则中的“匹配”部分有三项,分别是SUBSYSTEM,ACTION和SYSFS。而"赋值"部分有一项,是IMPORT。这个规则就是说,当系统中出现的新硬件属于net子系统范畴,系统对该硬件采起的动做是加入这个硬件,且这个硬件在SYSFS文件系统中的“address”信息等于“00: 0d..."时,对这个硬件在udev层次施行的动做是调用外部程序/sbin/rename_netiface,传递的参数有两个,一个是“%k”,表明内核对该新设备定义的名称。另外一个是”eth0“。
从上面这个例子中能够看出,udev的规则的写法比较灵活的,尤为在“匹配”部分中,能够经过诸如”*“, ”?“,[a-c],[1-9]等shell通配符来灵活匹配多个匹配项。具体的语法能够参考udev的man文档。
问:udev怎样作到无论设备链接的顺序而维持一个统一的设备名?
答:实际上,udev是经过对内核产生的设备名增长别名的方式来达到上述目的的。前面说过,udev是用户模式程序,不会更改内核的行为。所以,内核依然会我行我素地产生设备名如sda,sdb等。可是,udev能够根据设备的其余信息如总线(bus),生产商(vendor)等不一样来区分不一样的设备,并产生设备文件。udev只要为这个设备文件取一个固定的文件名就能够解决这个问题。在后续对设备的操做中,只要引用新的设备名就能够了。但为了保证最大限度的兼容,通常来讲,新设备名老是做为一个对内核自动产生的设备名的符号连接(link)来使用的。
例如:内核产生了sda设备名,而根据信息,这个设备对应因而个人内置硬盘,那我就能够制定udev规则,让udev除了产生/dev/sda设备文件外,另外建立一个符号连接叫/dev/internalHD。这样,我在fstab文件中,就能够用/dev/internalHD来代替原来的 /dev/sda了。下次,因为某些缘由,这个硬盘在内核中变成了sdb设备名了,那也不用着急,udev还会自动产生/dev/internalHD这个连接,并指向正确的/dev/sdb设备。全部其余的文件像fstab等都不用修改。
问:怎样才能找到这些设备信息,并把他们放到udev的规则文件中来匹配呢?
答:这个问题比较难,网上资料很少,我只找到一篇文章来介绍如何写udev的规则。他的基本方法是经过udevinfo这个实用程序来找到那些能够做为规则文件里的匹配项的项目。有这样两种状况可使用这个工具:
第一种状况是,当你把设备插入系统后,系统为设备产生了设备名(如/dev/sda)。那样的话,你先用udevinfo -q path -n /dev/sda,命令会产生一个该设备名对应的在sysfs下的路径,如/block/sda。而后,你再用udevinfo -a -p /sys/block/sda,这个命令会显示一堆信息,信息分红不少块。这些信息实际来自于操做系统维护的sysfs链表,不一样的块对应不一样的路径。你就能够用这些信息来做为udev规则文件中的匹配项。但须要注意的是,同一个规则只能使用同一块中显示的信息,不能跨块书写规则。
第二种状况是,不知道系统产生的设备名,那就只有到/sys目录下去逐个目录查找了,反复用udevinfo -a -p /sys/path...这个命令看信息,若是对应的信息是这个设备的,那就恭喜你。不然就再换个目录。固然,在这种状况下,成功的可能性比较小。
数据库