注意: 如果您是从DevFS升级到Udev, 请查看 DevFS to Udev.
这篇文档将介绍udev的一些新的变化。从084版开始,udev能够代替hotplug和coldplug的所有功能。正因为这样,hotplug包已经从Arch仓库中去掉了。
Contents[hide] |
<script type="text/javascript"> if (window.showTocToggle) { var tocShowText = "show"; var tocHideText = "hide"; showTocToggle(); } </script>
重要提示
...切记,在使用udev加载任何modules(内核模块)之前(无论是否是启动时自动加载),您必须在/etc/rc.conf
将MOD_AUTOLOAD
选项设置为yes ,否则您必须手动加载这些modules。您可以修改rc.conf
中的MODULES
或者使用modprobe
命令来手动加载您所需要的modules。另一种方法是用hwdetect --modules
生成系统硬件的modules
列表,然后将这个列表添加到rc.conf
中让系统启动时自动加载这些modules
。
基本需求
- 内核: 2.6.15或更高版本。
- 您将无法在fstab和bootloader设置中再使用DevFS格式的设备名称! 更多相关内容请查看DevFS to Udev。
最近更新
-
startudev
程序被取出。如果需要重新加载udev规则请使用/etc/start_udev
。 - Udev代替了
hotplug
和hwdetect
的功能。同时我们保存了hwdetect
,并且只在mkinitrd
程序生成initrd的时候用到。 - Udev可以同时加载多个模块,这样可以加快启动速度,然而,这样做的结果是她不能保证每次加载的顺序,所以当你使用多声卡或网卡的时候就会出现问题,这个问题下面将会再讨论。
模块禁用列表
udev也会犯错或加载错误的模块。为了防止错误的发生,你可以使用模块禁用列表 。一旦加入该列表的模块,无论是启动时,或者是运行时(如usb硬盘等)udev都不会加载这些模块。
只需在您在 rc.conf
的MODULES
中对应模块前加上感叹号(!)就可禁用该模块。
例如,
MODULES=(!moduleA !moduleB)
load_modules: 有用的启动参数
如果您在内核启动参数中加入load_modules=off
,那么udev会停止任何自动加载工作. 如果系统出现问题时,这个功能会十分有用。如果udev加载了有问题的模块导致系统挂起或者其它严重的问题时,你可以使用这个参数来禁用自动加载,以此来防止加载有问题的模块。
已知的硬件问题
- BusLogic设备被损坏而且导致启动时死机。
这是一个内核的Bug目前还没有修正。
- PCMCIA读卡器被认为是可移除设备.
把它们加入到/etc/pmount.allow中,使用hal的pmount来读取
自动加载带来的一些问题
CPUFreq模块
我门还没有找到一个很好的方法加载不同的CPUFreq控制器,所以我们把从自动加载进程里把它去掉了。如果您需要测量CPU频率,你必须在rc.conf
的MODULES
队列中显式的加入合适的模块。
声音问题和一些不能自动加载的模块
一些用户跟踪发现问题出在/etc/modprobe.conf
中一些旧的部分,试着去掉这些旧的部分再试试看。
多个同类型设备(网卡,声卡)每次启动的都不同
因为udev同时加载所有模块,所以一些设备可能初始化顺序不同。例如同时有两个网卡时,它们总是在eth0
和eth1
之间变来变去。
常用的解决办法是在您的rc.conf
文件中通过修改MODULES
队列来指明顺序。这个队列里的模块将在udev自动加载之前由系统加载,因此您可以控制模块在启动时加载顺序。
# 在e100之前加载8139too
MODULES=(8139too e100)
另一个解决网卡的方法是使用udev-sanctified方法为每个网卡静态命名。创建文件/etc/udev/rules.d/10-network.rules
然后将不同的网卡通过MAC地址绑定到不同的名字上:
SUBSYSTEM=="net", SYSFS{address}=="aa:bb:cc:dd:ee:ff", NAME="lan0"
SUBSYSTEM=="net", SYSFS{address}=="ff:ee:dd:cc:bb:aa", NAME="wlan0"
同时,您需要注意以下内容:
- 您可以通过下面的命令获得网卡的MAC地址::
udevinfo -a -p /sys/class/net/<你的网卡>
- 注意在udev规则文件中使用小写的16进制MAC地址,因为udev无法识别大写的MAC地址。
- 一些用户在使用旧的命名方式时出现问题,例如: eth0, eth1, 等等. 如果出现这个问题,试试使用 "lan"或者"wlan"之类的名字.
注意不要忘记修改您的/dec/rc.conf和其它使用ethX命名的配置文件。
自己编译内核造成的一些已知问题
Udev无法启动
请确定您的内核版本大于或等于2.6.15。较早的内核没有udev自动装载所需要的uevent功能。
CD/DVD符号和权限错误
如果您使用2.6.15的内核的话,您需要安装ABS的uevent补丁(它从2.6.16内核中抽取了一些uevent功能)。您可以使用abs
命令来同步ABS树,然后您就可以在/var/abs/kernels/kernel26/
下找到abs补丁。
Udev小窍门
自动加载usb设备
KERNEL=="sd[a-z]", NAME="%k", SYMLINK+="usb%m", GROUP="users", OPTIONS="last_rule"
ACTION=="add", KERNEL=="sd[a-z][0-9]", SYMLINK+="usb%n", GROUP="users", NAME="%k"
ACTION=="add", KERNEL=="sd[a-z][0-9]", RUN+="/bin/mkdir -p /mnt/usb%n"
ACTION=="add", KERNEL=="sd[a-z][0-9]", PROGRAM=="/lib/udev/vol_id -t %N", RESULT=="vfat", RUN+="/bin/mount -t vfat -o rw,noauto,sync,dirsync,noexec,nodev,noatime,dmask=000,fmask=111 /dev/%k /mnt/usb%n", OPTIONS="last_rule"
ACTION=="add", KERNEL=="sd[a-z][0-9]", RUN+="/bin/mount -t auto -o rw,noauto,sync,dirsync,noexec,nodev,noatime /dev/%k /mnt/usb%n", OPTIONS="last_rule"
ACTION=="remove", KERNEL=="sd[a-z][0-9]", RUN+="/bin/umount -l /mnt/usb%n"
ACTION=="remove", KERNEL=="sd[a-z][0-9]", RUN+="/bin/rmdir /mnt/usb%n", OPTIONS="last_rule"
把这些udev规则放到/etc/udev/rules.d/下任何一个文件名以.rules结尾的文件中,例如/etc/udev/rules.d/sda.rules。
如果想同时建立/media到/mnt符号连接,可以使用下面的版本:
KERNEL=="sd[a-z]", NAME="%k", SYMLINK+="usbhd-%k", GROUP="users", OPTIONS="last_rule"
ACTION=="add", KERNEL=="sd[a-z][0-9]", SYMLINK+="usbhd-%k", GROUP="users", NAME="%k"
ACTION=="add", KERNEL=="sd[a-z][0-9]", RUN+="/bin/mkdir -p /media/usbhd-%k"
ACTION=="add", KERNEL=="sd[a-z][0-9]", RUN+="/bin/ln -s /media/usbhd-%k /mnt/usbhd-%k"
ACTION=="add", KERNEL=="sd[a-z][0-9]", PROGRAM=="/lib/udev/vol_id -t %N", RESULT=="vfat", RUN+="/bin/mount -t vfat -o rw,noauto,sync,dirsync,noexec,nodev,noatime,dmask=000,fmask=111 /dev/%k /media/usbhd-%k", OPTIONS="last_rule"
ACTION=="add", KERNEL=="sd[a-z][0-9]", RUN+="/bin/mount -t auto -o rw,noauto,sync,dirsync,noexec,nodev,noatime /dev/%k /media/usbhd-%k", OPTIONS="last_rule"
ACTION=="remove", KERNEL=="sd[a-z][0-9]", RUN+="/bin/rm -f /mnt/usbhd-%k"
ACTION=="remove", KERNEL=="sd[a-z][0-9]", RUN+="/bin/umount -l /media/usbhd-%k"
ACTION=="remove", KERNEL=="sd[a-z][0-9]", RUN+="/bin/rmdir /media/usbhd-%k", OPTIONS="last_rule"
注意!如果你是用的其它的固定设备(例如SATA的硬盘,您可以从/etc/fstab中查看)被识别为/dev/sdX,您必须从sd[a-z] 中去掉你的那个sdX。例如,如果您的SATA硬盘被是识别为/dev/sda,您就需要把所有的“sd[a-z]”替换成“sd[b-z]”。 在规则文件的文件名前加上数字(如:010.udev.rules)是个很好的主意,这样udev在读取标准规则前,将会读取这个规则文件。 这些规则设置后不需要修改/etc/fstab文件。请查看mount命令的参数来修改权限等特性(您可以从论坛搜索查看mount命令的参数,然后根据 您的需要修改它们)。