# udev (简体中文)

udev 代替了`hotplug` 和 `hwdetect`两个工具.

“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同时加载所有模块，所以一些设备可能初始化顺序不同。例如同时有两个网卡时，它们总是在`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 hal and hal-info.

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

Categories:

- 简体中文
- Hardware detection and troubleshooting (简体中文)