udev机制简介
Linux 基础 – udev 和 rules 使用规则BestW2Y的博客-CSDN博客linux rules
udev 是 Linux2.6 内核里的一个功能,它替代了原来的 devfs,成为当前 Linux 默认的设备管理工具。udev 以守护进程的形式运行,通过帧听内核发出来的 uevent 来管理 /dev 目录下的设备文件。不像之前的设备管理工具,udev 在用户空间(User space)运行,而不在内核空间(kernel space)运行。
Udev(用户空间设备)是一个 Linux 系统中用于动态管理设备的设备管理器。它的主要作用是在设备插入或移除时,负责管理与这些事件相关联的设备节点以及执行相应的动作。以下是 Udev 的一些主要作用概述:
设备发现和管理: Udev 负责在 Linux 系统中检测和管理设备。当新设备插入或旧设备被移除时,Udev 负责识别这些变化,并在 /dev 目录下创建或删除相应的设备节点。
设备命名: Udev 为设备节点提供了一个规范的命名机制,以便用户和应用程序能够更容易地识别设备。这有助于确保相同类型的设备在不同系统上都有相似的设备节点名称。
热插拔支持: Udev 支持热插拔设备,即在系统运行时插入或移除设备。它可以动态地更新设备节点,而无需重新启动系统。
规则系统: Udev 使用规则文件来定义在设备事件发生时要执行的操作。这些规则可以基于设备属性、类型和其他标识符来匹配。规则允许用户执行自定义脚本、设置环境变量、创建符号链接等操作。
持久化设备节点: Udev 提供了机制,以确保设备节点的稳定性。即使设备在重新启动后未连接,Udev 仍会分配相同的设备节点名称,以便应用程序可以依赖特定的设备节点。
提供额外信息: Udev 为每个设备节点提供了大量的额外信息,例如设备类型、设备路径、驱动程序信息等。这些信息可用于用户空间的应用程序,以更好地理解和利用系统中的设备。
总体而言,Udev 是 Linux 系统中一个重要的组件,它使设备的管理变得更加动态、灵活,并支持热插拔和用户空间的定制化设备管理。
我们都知道,所有的设备在 Linux 里都是以设备文件的形式存在。在早期的 Linux 版本中,/dev 目录包含了所有可能出现的设备的设备文件。很难想想 Linux 用户如何在这些大量的设备文件中找到匹配条件的设备文件。现在 udev 只为那些连接到 Linux 操作系统的设备产生设备文件。并且 udev 能通过定义一个 udev 规则(rule)来产生匹配设备属性的设备文件,这些设备属性可以是内核设备名称、总线路径、厂商名称、型号、序列号或者磁盘大小等等。
动态管理:当设备添加/删除时,udev 守护进行帧听来自内核的 uevent,以此添加或者删除 /dev 下的设备文件,所以 udev 只为已经连接的设备产生设备文件,而不会在 /dev 下产生大量虚无的设备文件。
自定义命名规则:通过 Linux 默认的规则文件,udev 在 /dev/ 里为所有的设备定义了内核设备名称,比如 /dev/sda、/dev/hda、/dev/fd 等等。由于 udev 是在用户空间(user space)运行,Linux 用户可以通过自定义的规则文件,灵活地产生标识性强的设备文件名,比如 /dev/boot_disk、/dev/root_disk、/dev/color_printer 等等。
设定设备的权限和所有者/组:udev 可以按一定的条件来设置设备文件的权限和设备文件所有者/组。在不同的 udev 版本中,实现的方法不同,在 “如何配置和使用 udev” 中会详解。
下面的流程图显示 udev 添加/删除 设备文件的过程。

相关术语:
配置和使用udev通常涉及创建和编辑udev规则,这些规则定义了设备在系统中的行为。以下是一些配置和使用udev的基本步骤:
了解udev的基本概念: 在使用udev之前,建议了解一些基本概念,例如subsystem、KERNEL、ACTION等。这有助于理解规则的语法和规则如何匹配设备。
查看已存在的规则: 在/etc/udev/rules.d/目录下,有一些默认的udev规则文件,例如70-persistent-net.rules。查看这些文件,了解已有的规则是如何编写的。
创建或编辑规则文件: 可以通过创建新的规则文件或编辑已有的规则文件来定义udev规则。规则文件的命名约定是以数字和描述性名称开头,例如10-local.rules。数字决定了规则的优先级,数字越小,规则越早被处理。
sudo nano /etc/udev/rules.d/10-local.rules
编写规则: 规则的编写使用基于键值对的语法。以下是一个简单的规则示例:
# 当插入一个块设备并且设备的内核名是sda时,执行脚本
SUBSYSTEM=="block", KERNEL=="sda", ACTION=="add", RUN+="/bin/my_custom_script"
在这个例子中,SUBSYSTEM=="block"表示规则适用于块设备,KERNEL=="sda"表示设备的内核名是sda,ACTION=="add"表示设备被添加,RUN+="/bin/my_custom_script"表示在添加时执行/bin/my_custom_script脚本。
重新加载规则: 在编辑或创建规则文件后,需要重新加载udev规则。
sudo udevadm control --reload-rules
测试规则: 插入或移除设备,观察规则是否按照预期执行。可以使用udevadm monitor命令来监视udev事件。
sudo udevadm monitor
在另一个终端中插入或移除设备,观察监视器中的输出。
查看udev事件信息: 使用udevadm info命令来查看设备的udev信息。
sudo udevadm info --attribute-walk --path=/sys/path/to/device
替换/sys/path/to/device为实际设备的路径。
请注意,对udev的配置更改可能会影响设备的命名和系统的行为,因此在进行更改之前,请确保了解其影响。
udev(设备管理器)是Linux系统中用于管理设备的设备管理器。udev通过配置文件来定义设备规则,这些规则决定了设备在系统中的命名、权限以及其他属性。udev的配置文件通常存储在/etc/udev/目录下。
以下是udev的两个主要配置文件:
/etc/udev/udev.conf: 这个文件包含全局udev配置。其中的一些配置项包括udev的日志级别、日志位置等。可以使用文本编辑器打开此文件进行编辑。
/etc/udev/rules.d/目录: 这个目录包含设备规则文件。规则文件的命名约定是以数字和描述性名称开头,例如10-local.rules。数字的作用是确定规则的优先级,数字越小,规则越早被处理。
规则文件的内容形式为一系列的规则,每个规则描述了设备的匹配条件以及设备被插入系统时应该执行的操作。以下是一个简单的规则示例:
# 规则示例
SUBSYSTEM=="block", KERNEL=="sda", ACTION=="add", RUN+="/bin/my_custom_script"
这个规则的意思是当插入一个块设备(block subsystem)并且设备的内核名是sda时,执行名为my_custom_script的脚本。
要注意的是,修改udev配置可能会影响系统的设备命名和管理,因此在进行修改之前,请确保了解你要进行的更改并备份相关文件。
在通常的Linux系统中,udev的全局配置文件通常是/etc/udev/udev.conf。这个文件包含了udev守护进程的全局设置。你可以使用文本编辑器打开这个文件以查看或编辑其内容。
以下是一个简单的udev.conf文件的例子:
# /etc/udev/udev.conf
# udev configuration
# 关闭udev的对内核内置规则的加载,不使用/lib/udev/rules.d/目录下的规则
# KERNEL=="eth*", NAME="my_eth%n"
# 在/lib/udev/rules.d/中的规则不会加载,所以就不会有内核的eth规则了。
udev_builtin_rules="no"
# 决定对于来自内核的所有事件,是否使用/dev目录。
# 建议设置为"yes",使udev创建设备节点。
USEC_DEVFS="yes"
# 设备文件和符号链接的权限,默认是0664
# Udev允许更灵活的权限设置,例如OWNER、GROUP和MODE。
# 详细参考 man udev。
# Udev 183 以上的版本采用TAG标记来替代MODE
# MODE="0664"
TAG+="udev-acl"
在这个文件中,注释行以#开头。重要的配置项有:
udev_builtin_rules: 控制是否加载内核内置的udev规则。在某些情况下,你可能希望关闭这个选项,以便自定义规则能够完全替代内核提供的规则。USEC_DEVFS: 决定是否使用/dev目录。设置为"yes"表示使用,设置为"no"表示不使用。TAG+="udev-acl": 这是一个用于设置权限的示例。你可以使用OWNER、GROUP和MODE来设置设备文件和符号链接的权限。请注意,udev的配置可能因Linux发行版而有所不同。在更改udev的配置之前,请确保备份配置文件,并了解更改可能带来的影响。
[root@HOST_RHEL4 dev]# cat /etc/udev/udev.conf
# udev.conf
# The main config file for udev
#
# This file can be used to override some of udev's default values
# for where it looks for files, and where it places device nodes.
#
# WARNING: changing any value, can cause serious system breakage!
#
# udev_root - where in the filesystem to place the device nodes
udev_root="/dev/"
# udev_db - The name and location of the udev database.
udev_db="/dev/.udev.tdb"
# udev_rules - The name and location of the udev rules file
udev_rules="/etc/udev/rules.d/"
# udev_permissions - The name and location of the udev permission file
udev_permissions="/etc/udev/permissions.d/"
# default_mode - set the default mode for all nodes that have no
# explicit match in the permissions file
default_mode="0600"
# default_owner - set the default owner for all nodes that have no
# explicit match in the permissions file
default_owner="root"
# default_group - set the default group for all nodes that have no
# explicit match in the permissions file
default_group="root"
# udev_log - set to "yes" if you want logging, else "no"
udev_log="no"
Linux 用户可以通过改文件设置以下参数:
通过udev设置设备文件的权限通常涉及编辑udev规则文件。这些规则文件位于/etc/udev/rules.d/目录中,文件名以数字和描述性名称的组合开头。规则文件的目的是在设备插入时执行自定义操作,例如设置设备文件的权限。
以下是一个简单的udev规则文件示例,用于设置设备文件的权限:
# /etc/udev/rules.d/99-my-custom.rules
# 规则:当插入USB设备时,设置权限
ACTION=="add", SUBSYSTEM=="usb", MODE="0666"
在这个例子中:
ACTION=="add":表示当设备被添加时执行规则。SUBSYSTEM=="usb":表示该规则仅适用于USB子系统的设备。MODE="0666":表示设置权限为0666,即允许任何用户读写设备文件。请按照以下步骤操作:
udev规则文件,例如99-my-custom.rules。你可以选择一个数字前缀,确保它在其他规则文件之后加载。ACTION、SUBSYSTEM和MODE等选项。udev服务或重新插入设备。请注意,规则文件的加载顺序很重要。规则文件按照数字和字母顺序加载,因此确保你的规则文件的数字前缀足够大,以确保在其他规则之后加载。
在修改udev规则之前,请确保备份相关文件,以防止不必要的问题。
udev是Linux系统中用于设备管理的守护进程,它负责设备的动态创建、删除以及设备文件的管理。udev的配置信息保存在规则文件中,规则文件定义了在特定条件下执行的动作。以下是关于udev规则和规则文件的一些基本概念:
udev规则定义了在特定条件下执行的动作。这些条件通常基于设备属性、内核信息等。规则由键值对的形式组成,例如:
ACTION=="add", SUBSYSTEM=="usb", RUN+="/path/to/my/script.sh"
在这个例子中,规则表示当USB设备被添加时(ACTION=="add",SUBSYSTEM=="usb"),将执行/path/to/my/script.sh脚本。
规则文件是包含udev规则的文本文件。规则文件的命名通常遵循XX-descriptive-name.rules的格式,其中XX是两位数字,表示规则文件的加载顺序。规则文件中可以包含一个或多个规则。
udev规则文件通常存储在/etc/udev/rules.d/目录下。这个目录中的规则文件按照数字和字母的顺序加载,因此文件名的前缀数字决定了规则加载的顺序。
规则的语法遵循键值对的形式,包括条件和对应的动作。条件由设备属性、内核信息等组成,而动作定义了在条件满足时执行的操作。
CONDITION1=="value1", CONDITION2=="value2", ..., ACTION
规则中的动作是在条件满足时执行的命令或脚本。这些动作可以是创建设备文件、运行脚本、加载驱动程序等。例如:
RUN+="/path/to/my/script.sh"
这个规则表示在满足条件时执行/path/to/my/script.sh脚本。
在修改udev规则文件后,通常需要重新加载规则使其生效。可以通过重新启动udev服务或使用udevadm命令进行规则的重新加载。
sudo systemctl restart udev
或者
sudo udevadm control --reload-rules
这些命令将使新的规则生效。
总的来说,udev规则文件用于定义设备管理的行为,规则根据设备的属性、内核信息等条件触发相应的动作。规则文件的命名和加载顺序非常重要,因为它们决定了规则的优先级。
在Ubuntu上,udev规则文件通常存储在/etc/udev/rules.d/目录下。您可以创建自定义规则文件以定义设备管理的行为。以下是在Ubuntu上创建和使用udev规则的一般步骤:
打开终端:
打开终端应用,您可以使用快捷键Ctrl + Alt + T。
进入规则文件目录:
cd /etc/udev/rules.d/
创建规则文件:
使用文本编辑器(例如nano或gedit)创建一个新的规则文件。规则文件的命名通常遵循XX-descriptive-name.rules的格式,其中XX是两位数字。
sudo nano 99-my-custom-rule.rules
在这个例子中,99表示这个规则文件将在其他规则之后加载。my-custom-rule.rules是文件的描述性名称。
编辑规则文件:
在打开的规则文件中,添加您的udev规则。规则的语法为条件和动作的键值对。
例如,以下规则表示当USB设备插入时,在/tmp/usb_log.txt文件中写入一条日志:
ACTION=="add", SUBSYSTEM=="usb", RUN+="/bin/sh -c 'echo USB device inserted >> /tmp/usb_log.txt'"
您可以根据自己的需求添加其他规则。
保存并退出:
在nano中,按Ctrl + X,然后按Y确认保存,最后按Enter退出。
重启udev服务或重新加载规则:
重启udev服务或重新加载规则以使新规则生效。
sudo systemctl restart udev
或者
sudo udevadm control --reload-rules
请注意,重启udev服务会影响整个系统。
以上是创建和使用udev规则的基本步骤。根据您的需求,可以添加不同的规则来定义不同的设备管理行为。
规则文件是 udev 里最重要的部分,默认是存放在 /etc/udev/rule.d/ 下。
所有的规则文件必须以 “.rules” 为后缀名。
下面是一个简单的规则:
KERNEL=="sda", NAME="my_root_disk", MODE="0660"
KERNEL 是匹配键,NAME 和 MODE 是赋值键。
这个udev规则的含义是,当内核检测到一个名为sda的块设备(例如硬盘)时,将该设备的名称设置为my_root_disk,并将其访问权限设置为0660。
KERNEL=="sda":这是匹配键,指定了要匹配的设备的内核名称。在这个例子中,它匹配名称为sda的设备。
NAME="my_root_disk":这是赋值键,指定了要为设备设置的新名称。在这里,设备的名称将设置为my_root_disk。
MODE="0660":这是赋值键,指定了要为设备设置的权限模式。在这里,设备的权限将设置为0660,表示读写权限分别对所有者和组有效,没有执行权限。
总的来说,这个规则的作用是为内核中检测到的sda设备设置新的名称和权限。这对于在系统中自定义设备名称和权限方面非常有用。
在udev规则中,有两个关键的概念:匹配键(Match Key)和赋值键(Assignment Key)。这两者决定了udev规则如何匹配和处理设备。
匹配键用于指定规则匹配的条件,即在何种情况下规则会生效。一条udev规则可以有一个或多个匹配键。以下是一些常见的匹配键:
KERNEL: 匹配设备的内核名称。SUBSYSTEM: 匹配设备的子系统。DRIVER: 匹配设备的驱动程序。ATTR、ENV等:用于匹配设备属性或环境变量。赋值键用于指定规则在匹配时要执行的操作,即如何处理匹配的设备。以下是一些常见的赋值键:
NAME: 为设备指定设备文件的名称。SYMLINK: 为设备创建符号链接。MODE: 设置设备文件的权限。OWNER、GROUP: 设置设备文件的所有者和组。示例规则:
# 匹配键
KERNEL=="sda1", SUBSYSTEMS=="block", DRIVERS=="sd", ATTRS{vendor}=="ABC", ATTRS{model}=="123", ENV{ID_FS_TYPE}=="ext4"
# 赋值键
NAME="my_disk", SYMLINK+="custom_link", MODE="0666", OWNER="user", GROUP="group"
这个规则表示当设备的内核名称为sda1,子系统为block,驱动程序为sd,厂商为ABC,型号为123,文件系统类型为ext4 时,将为该设备创建一个名为my_disk的设备文件,同时创建一个名为custom_link的符号链接,设置设备文件的权限为0666,所有者为user,组为group。
udev 规则中可以使用多种操作符来定义匹配条件。以下是一些常见的操作符:
==: 等于!=: 不等于+=: 追加,用于赋值键 SYMLINK、ENV 等,表示在已有值的基础上追加新的值。:=: 覆盖,用于赋值键,表示覆盖已有的值。==?: 如果属性存在并且有非空值,匹配成功。=!: 如果属性不存在或者存在但值为空,匹配成功。示例:
# 等于
KERNEL=="sda", SUBSYSTEM=="block", ENV{ID_FS_TYPE}=="ext4"
# 不等于
KERNEL!="sdb", SUBSYSTEMS!="usb", ATTRS{serial}!="123456"
# 追加
SYMLINK+="custom_link"
# 覆盖
MODE:="0666"
# 如果属性存在且非空值
ENV{ID_MODEL}=="", GOTO="end"
# 如果属性不存在或者存在但值为空
ENV{ID_MODEL}!="", ENV{ID_SERIAL}!="", GOTO="end"
这些操作符可以组合使用,以满足更复杂的匹配条件。
Linux 的热插拔机制主要通过 Udev(用户空间设备)来实现。Udev 是 Linux 系统中用于动态管理设备的设备管理器。以下是 Udev 实现热插拔的主要机制:
设备事件监测: Udev 不断监听内核发出的事件,以便检测设备的插入和拔出。内核通过 Netlink 通信机制向 Udev 发送设备事件。
规则匹配: 当 Udev 检测到设备事件时,它会根据预定义的规则(规则文件)来匹配事件中的设备信息。规则可以基于设备的各种属性、类型、路径等进行匹配。
规则文件: Udev 的规则文件通常存储在 /etc/udev/rules.d/ 目录下。这些规则文件定义了在特定条件下要执行的操作。规则文件的命名约定通常是 XX-name.rules,其中 XX 是两位数字,用于确定规则文件的加载顺序。
执行动作: 当规则匹配成功时,Udev 将执行相关的动作。动作可以包括创建设备节点、设置环境变量、执行脚本等。例如,可以在设备插入时创建相应的设备节点、加载适当的驱动程序等。
设备节点管理: Udev 负责在 /dev 目录下创建或删除设备节点。这确保了用户和应用程序可以在一个标准位置找到设备节点,而无需关心设备插入的确切时刻。
持久化设备节点: Udev 确保设备节点的持久性,即使设备在重新启动后未连接,也会分配相同的设备节点名称。这有助于确保应用程序可以依赖特定的设备节点。
总体而言,Udev 通过规则匹配和执行动作的方式,实现了对设备事件的监听和处理,从而支持 Linux 系统的热插拔机制。这使得在系统运行时插入或拔出设备时,系统能够动态地适应这些变化。

udev是一个设备管理工具,udev以守护进程的形式运行,通过侦听内核发出来的uevent来管理 /dev目录下的设备文件。
通过侦听内核发出来的硬件数据(事件),在用户空间为这个硬件去创建对应代表该硬件的文件,应用程序例如adb就可以通过该文件操作到硬件设备。
udev在用户空间运行,而不在内核空间运行。它能够根据系统中的硬件设备的状态动态更新设备文件,包括设备文件的创建,删除等。
设备文件通常放在 /dev目录下。使用 udev后,在 /dev目录下就只包含系统中真正存在的设备。
守护进程(Daemon Process)是在计算机系统后台运行的一类进程,它们通常在系统启动时启动,不依赖于用户直接操作,一直运行在后台,不受用户登录或注销的影响。守护进程的存在主要是为了执行特定的系统任务或服务,例如服务器、网络服务、定时任务等。
以下是守护进程的一些特点和常见特征:
后台运行: 守护进程通常在后台运行,不与任何终端关联,不接受用户的直接输入。
脱离终端: 守护进程通常会调用 fork 函数创建一个子进程,并使得子进程成为新的会话组长,从而脱离与终端的关联。
文件描述符: 守护进程通常会关闭与终端相关的文件描述符,以防止被终端关闭影响进程运行。
重定向标准输入输出: 守护进程通常会将标准输入、输出、错误重定向到 /dev/null 或其他适当的文件,以防止输出信息到终端。
权限: 守护进程通常以超级用户或其他特定用户的身份运行,以便执行需要特殊权限的任务。
信号处理: 守护进程通常会捕获并处理一些特定的信号,如 SIGHUP,以便在配置文件更改或其他条件下重新加载配置。
周期性任务: 守护进程通常执行一些周期性的任务,如定时清理、日志轮转等。
示例: 常见的守护进程包括 sshd(SSH 服务器守护进程)、httpd(Apache HTTP 服务器守护进程)等。
创建守护进程的一般步骤包括:
调用 fork 函数: 创建一个子进程,父进程退出,子进程继续执行。
调用 setsid 函数: 创建一个新的会话组,使得子进程成为新的会话组长。
修改工作目录: 为了防止卸载文件系统导致守护进程找不到文件,通常需要更改工作目录。
重定向标准输入输出: 将标准输入、输出、错误重定向到适当的文件。
关闭文件描述符: 关闭不需要的文件描述符,避免占用系统资源。
处理信号: 捕获并处理一些信号,如 SIGHUP。
创建和管理守护进程需要谨慎处理,确保进程以安全和可靠的方式在后台运行。
Linux Daemon(守护进程)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务。Linux系统的大多数服务器就是通过守护进程实现的。常见的守护进程包括系统日志进程syslogd、 web服务器httpd、邮件服务器sendmail和数据库服务器mysqld等。守护进程的名称通常以d结尾
UDEV守护进程,它能够根据系统中的硬件设备的状态动态更新设备文件,包括设备文件的创建,删除等。
ps -efj 是一个用于显示进程信息的命令。具体解释如下:
ps -efj
ps: 进程状态命令。-e: 显示所有进程,而不仅仅是与终端相关的进程。-f: 以全格式显示。-j: 以作业格式显示。在这个命令中,-ef 是常用组合,用于显示所有进程的详细信息。而 -j 则以作业格式显示,包括作业控制的信息。

输出的各列含义如下:
这个命令的输出显示了当前系统上所有进程的详细信息,以及它们的层次结构和作业控制信息。
- 守护进程和终端不挂钩;后台进程能往终端上输出东西(和终端挂钩);
- 守护进程关闭终端时不受影响,守护进程不会随着终端的退出而退出;
守护进程(Daemon Process)和后台进程(Background Process)是两个不同的概念,它们有以下区别:
启动方式:
是否与终端关联:
执行环境:
继承环境:
用户交互性:
总的来说,守护进程是一种设计用于在系统后台一直运行的进程,而后台进程是一种在终端启动后被放到后台执行的进程。