Difference between revisions of "Udev (简体中文)"

From ArchWiki
Jump to: navigation, search
(update. remove rc.conf.)
(问题解决: Add run HAL info.)
Line 72: Line 72:
 
==== Udev无法启动 ====
 
==== Udev无法启动 ====
 
请确定您的内核版本大于或等于2.6.32。较早的内核没有udev自动装载所需要的 uevent 功能。
 
请确定您的内核版本大于或等于2.6.32。较早的内核没有udev自动装载所需要的 uevent 功能。
 +
 +
== Running HAL ==
 +
 +
Some programs still require HAL (like Flash DRM content). Hal can be installed from {{AUR|hal}} and {{AUR|hal-info}}.
 +
 +
Using Systemd: one can start and stop the hal service using the following systemd commands:
 +
 +
Start HAL:
 +
{{ic|# systemctl start hal.service}}
 +
 +
Stop HAL:
 +
{{ic|# systemctl stop hal.service}}
 +
 +
Alternatively, one can use the following script:
 +
{{bc|<nowiki>
 +
#!/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
 +
</nowiki>}}

Revision as of 09:43, 12 April 2013

udev 代替了hotplughwdetect两个工具.

“udev是 Linux 内核的设备管理器。总的来说,它取代了 devfs 和 hotplug,负责管理 /dev 中的设备节点,。这意味着 udev 要管理/dev目录以及用户空间中所有的硬件添加删除操作。” 摘自: Wikipedia:Udev

与传统的顺序加载不同,udev 可以并行加载内核模块,具有潜在的性能优势。异步加载模块的方式也有一个天生的缺点:无法保证每次加载模块的顺序,如果机器具有多个块设备,那么它们的设备节点可能随机变化。例如如果有两个硬盘,/dev/sda 可能会随机变成/dev/sdb。后面有更详细的信息。

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>=171 开始 OSS 模拟模块(snd_seq_oss, snd_pcm_oss, snd_mixer_oss) 默认不会自动装载。

多个同类型设备(网卡,声卡)每次启动的都不同

因为udev同时加载所有模块,所以一些设备可能初始化顺序不同。例如同时有两个网卡时,它们总是在eth0eth1之间变来变去。

常用的解决办法是在您的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