udev (简体中文)
udev 代替了hotplug
和 hwdetect
两个工具.
“udev是 Linux 内核的设备管理器。总的来说,它取代了 devfs 和 hotplug,负责管理 /dev
中的设备节点,。这意味着 udev 要管理/dev
目录以及用户空间中所有的硬件添加删除操作。” 摘自: Wikipedia:Udev
与传统的顺序加载不同,udev 可以并行加载内核模块,具有潜在的性能优势。异步加载模块的方式也有一个天生的缺点:无法保证每次加载模块的顺序,如果机器具有多个块设备,那么它们的设备节点可能随机变化。例如如果有两个硬盘,/dev/sda
可能会随机变成/dev/sdb
。后面有更详细的信息。
Contents
udev规则
管理员编写的 udev 的规则保存在/etc/udev/rules.d/
,其中的文件名要以.rules
结尾。各种软件包提供的规则文件位于 /lib/udev/rules.d/
。如果两个目录中有相同名称的文件,会使用 /etc
中的文件。
要想学习写udev规则,请访问编写 udev 规则。
要得到编写规则可以使用的全部属性,请使用下面的指令:
# udevadm info -a -p [device name]
用系统中的设备替换上面的[device name]
,比如/dev/sda
或者/dev/ttyUSB0
。
udev 会自动检测规则文件的修改,所以更改不需要重启 udev 就会立即生效。但是规则不会被已有设备重新触发,所以热插拔设备(如USB设备等)可能需要重新连接才会使新规则生效。
使用技巧
问题解决
屏蔽模块
极个别情况下,udev 也会犯错或加载错误的模块。为了防止错误的发生,你可以使用模块禁用列表。只要模块加入该列表,无论是启动时,或者是运行时(如usb硬盘等)udev都不会加载这些模块。参见blacklisting.
已知的硬件问题
BusLogic
BusLogic 设备被损坏而且导致启动时死机。这是一个内核的Bug目前还没有修正。
一些移动设备不可移除
创建自定义 udev 规则,设置 UDISKS_SYSTEM_INTERNAL=0。参见 udisks 手册。
自动加载问题
声音问题和一些不能自动加载的模块
一些用户发现 /etc/modprobe.d/sound.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", ATTR{address}=="aa:bb:cc:dd:ee:ff", NAME="lan0" SUBSYSTEM=="net", ATTR{address}=="ff:ee:dd:cc:bb:aa", NAME="wlan0"
同时,您需要注意以下内容:
- 您可以通过下面的命令获得网卡的MAC地址::
udevadm info -a -p /sys/class/net/<你的网卡>
- 注意在udev规则文件中使用小写的16进制MAC地址,因为udev无法识别大写的MAC地址。
- 一些用户在使用旧的命名方式时出现问题,例如: eth0, eth1, 等等. 如果出现这个问题,试试使用 "lan"或者"wlan"之类的名字.
注意不要忘记修改其它使用ethX命名的配置文件。
自己编译内核造成的问题
Udev无法启动
请确定您的内核版本大于或等于2.6.32。较早的内核没有udev自动装载所需要的 uevent 功能。
Running HAL
Some programs still require HAL (like Flash DRM content). Hal can be installed from halAUR and hal-infoAUR.
Using Systemd: one can start and stop the hal service using the following systemd commands:
Start HAL:
# systemctl start hal.service
Stop HAL:
# systemctl stop hal.service
Alternatively, one can use the following script:
#!/bin/bash ## written by Mark Lee <bluerider> ## using information from <https://wiki.archlinux.org/index.php/Chromium#Google_Play_.26_Flash> ## Start and stop Hal service on command for Google Play Movie service function main () { ## run the main insertion function clear-cache; ## remove adobe cache start-hal; ## start the hal daemon read -p "Press 'enter' to stop hal"; ## pause the command line with a read line stop-hal; ## stop the hal daemon } function clear-cache () { ## remove adobe cache cd ~/.adobe/Flash_Player; ## go to Flash player user directory rm -rf NativeCache AssetCache APSPrivateData2; ## remove cache } function start-hal () { ## start the hal daemon sudo systemctl start hal.service && ( ## systemd : start hal daemon echo "Started hal service..." ) || ( echo "Failed to start hal service!") } function stop-hal () { ## stop the hal daemon sudo systemctl stop hal.service && ( ## systemd : stop hal daemon echo "Stopped hal service..." ) || ( echo "Failed to stop hal service!" ) } main; ## run the main insertion function