一、什么是 udev?
udev 是 Linux 系统中的一个守护进程,它的主要任务是管理所有的设备节点。你可以把它想象成一个设备的“管家”,负责识别、监控和管理连接到计算机上的硬件设备。当一个新设备被连接到系统时,`udev` 会立刻识别它,并为其创建相应的文件和目录,这样其他程序就可以使用这个设备了。
二、udev的工作原理
1、设备识别
当你插入一个 USB 驱动器或其他硬件设备时,udev 会检查这个设备,并确定它的类型和特性。
2、动态创建节点
一旦识别了设备,udev 会动态地创建一个设备节点(通常在 /dev 目录下),并为这个节点分配一个合适的设备文件名。
3、加载驱动
udev还会尝试加载适合这个设备的驱动程序,确保设备能够正常工作。
4.、通知应用程序:
设备准备好后,udev会发送一个通知给系统,告诉其他程序设备已经可以使用了。
三、udev 的使用
-
查看设备列表:
你可以使用lsusb 或 lspci 命令来查看连接到系统的 USB 或 PCI 设备。这些命令会从 udev 获取设备信息。
-
查看设备信息:
对于特定的设备,你可以查看 /dev目录下的设备节点来获取更多信息。例如,cat /dev/sdX可以显示设备 sdX的信息(这里的 X是设备字母)。
-
管理设备节点:
系统管理员有时会需要手动创建、删除或修改设备节点。这可以通过编辑 udev 的规则文件(通常以 .rules结尾)来实现。
四、udev 的配置
udev
的配置是通过一系列规则文件来实现的,这些规则文件告诉 udev
如何处理特定的硬件设备。规则文件通常以 .rules
扩展名结尾,并存放在 /etc/udev/rules.d/
目录下。这些规则文件使用一种特定的语法来定义匹配模式和相应的动作
规则文件的结构
udev
规则文件由一系列条目组成,每个条目包含一个或多个匹配属性(用于识别设备)和一组要执行的动作。条目通常遵循以下格式:
ACTION=="action", ATTR{attribute}=="value", ACTION=="command"
ACTION
:指定当设备被添加("add")或移除("remove")时udev
应该执行的操作。ATTR{attribute}
:指定设备的属性,如idVendor
(厂商 ID)、idProduct
(产品 ID)等。value
:属性的值,用于匹配特定的设备。ACTION=="command"
:当匹配条件满足时,udev
执行的命令或动作,如创建符号链接、设置权限等。
规则文件示例
假设你想要为一个特定的 USB 打印机创建一个持久的设备节点,你可以创建一个如下的规则文件:
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="0x03f0", ATTR{idProduct}=="0x1a42", SYMLINK+="myprinter"
这个规则的含义是:当一个 USB 设备被添加到系统,且它的厂商 ID 是 0x03f0
,产品 ID 是 0x1a42
时,udev
会为这个设备创建一个名为 myprinter
的符号链接。
五、配置udev详细示例
假设我们有一个特定的 USB 无线网卡,我们需要为它创建一个持久的设备节点,并设置特定的权限,以便只有特定的用户组可以访问这个设备。
-
设备信息
首先,我们需要获取设备的相关信息。通常,设备的厂商 ID 和产品 ID 是配置 udev
规则所需的关键信息。我们可以使用 lsusb
命令来查看连接到系统的所有 USB 设备的信息。
lsusb
假设输出中显示我们的无线网卡具有以下信息:
Bus 002 Device 003: ID 0x0846:0x9001
这里 0x0846
是厂商 ID,0x9001
是产品 ID。
-
创建规则文件
接下来,我们创建一个新的 udev
规则文件。通常,规则文件位于 /etc/udev/rules.d/
目录下。我们可以创建一个名为 70-persistent-net.rules
的文件,其中 70
表示规则的优先级(数字越小,优先级越高)。
sudo nano /etc/udev/rules.d/70-persistent-net.rules
-
编写规则
在打开的文本编辑器中,我们将编写以下规则:
# 匹配特定的 USB 无线网卡
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="0x0846", ATTRS{idProduct}=="0x9001",
# 为设备创建一个持久的节点名
SYMLINK+="wireless网卡%n",
# 设置设备节点的权限,使得只有 "wireless" 用户组可以访问
GROUP="wireless", MODE="0660"
这个规则的含义是:
- 当一个 USB 设备被添加到系统,并且它的厂商 ID 是
0x0846
,产品 ID 是0x9001
时,udev
将执行以下操作:- 为设备创建一个名为
wireless网卡N
的符号链接,其中N
是设备实例的编号。 - 将设备的文件权限设置为
0660
,这意味着只有文件的所有者和 "wireless" 用户组的成员可以读写设备文件。 - 将设备的所属用户组设置为 "wireless"。
- 为设备创建一个名为
-
应用规则
保存并关闭规则文件后,我们需要让 udev
重新加载规则:
sudo udevadm control --reload-rules
然后,我们可以插入无线网卡并检查 udev
是否按照我们的规则创建了设备节点和符号链接:
udevadm info -a -n /dev/wireless网卡N
替换 N
为你的设备实例的实际编号。
-
验证权限
最后,我们需要验证设备节点的权限是否正确设置。可以使用 ls -l
命令查看 /dev/
目录下的设备节点:
ls -l /dev/wireless网卡N
输出应该显示设备节点的权限是 660
,并且所属组是 "wireless"。
如果设备在插入时没有立即按预期工作,尝试重启 udev
服务或者重新启动系统。