udev (简体中文)

udev (简体中文)

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 fromhal andhal-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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值