当前位置: 首页 > news >正文

linux udev详解

1.概念介绍

1.1sysfs文件系统

Linux 2.6以后的内核引入了sysfs文件系统,sysfs被看成是与proc、devfs和devpty同类别的文件系统,该文件系统是一个虚拟的文件系统,它可以产生一个包括所有系统硬件的层级视图,与提供进程和状态信息的proc文件系统十分类似。

sysfs把连接在系统上的设备和总线组织成为一个分级的文件,它们可以由用户空间存取,向用户空间导出内核数据结构以及它们的属性。sysfs的一个目的就是展示设备驱动模型中各组件的层次关系,其顶级目录包括block、bus、dev、devices、class、fs、kernel、power和firmware
等。

block目录包含所有的块设备;devices目录包含系统所有的设备,并根据设备挂接的总线类型组织成层次结构;bus目录包含系统中所有的总线类型;class目录包含系统中的设备类型(如网卡设备、声卡设备、输入设备等)。

1.2devpath

本文的 devpath是指一个设备在 sysfs文件系统 (/sys)下的相对路径,该路径包含了该设备的属性文件。udev 里的多数命令都是针对 devpath操作的。例如:sda的 devpath是 /block/sda,sda2 的 devpath是 /block/sda/sda2。

1.3 udev工作流程

udev在用户空间中执行,动态建立/删除设备文件,允许每个人都不用关心主/次设备号而提供LSB(Linux标准规范,Linux Standard Base)名称,并且可以根据需要固定名称。工作流程如下:

1)当内核检测到系统中出现了新设备后,内核会通过netlink套接字发送uevent

2)udev获取内核发送的信息,进行规则的匹配。匹配的事物包括SUBSYSTEM、ACTION、atttribute、内核提供的名称(通过KERNEL=)以及其他的环境变量。

2.udev规则文件

2.1 规则文件存储位置

/etc/udev/rules.d/*.rules

2.2 文件规则

udev的规则文件以行为单位,以“#”开头的行代表注释行。其余的每一行代表一个规则。每个规则分成一个或多个匹配部分和赋值部分。匹配部分用匹配专用的关键字来表示,相应的赋值部分用赋值专用的关键字来表示。
匹配关键字包括:ACTION(行为)、KERNEL(匹配内核设备名)、BUS(匹配总线类型)、
SUBSYSTEM(匹配子系统名)、ATTR(属性)等,赋值关键字包括:NAME(创建的设备文件名)、SYMLINK(符号创建链接名)、OWNER(设置设备的所有者)、GROUP(设置设备的组)、IMPORT(调用外部程序)、MODE(节点访问权限)等。

2.3 匹配和赋值操作符

匹配键赋值或匹配       说明
==匹配相等比较
!=匹配不等比较
=赋值分配一个特定的值给该键,他可以覆盖之前的赋值。
+=赋值追加特定的值给已经存在的键
:=赋值分配一个特定的值给该键,后面的规则不可能覆盖它。

2.4 匹配键

说明
ACTION事件 (uevent) 的行为,例如:add( 添加设备 )、remove( 删除设备 )。
KERNEL在内核里看到的设备名字,比如sd*表示任意SCSI磁盘设备
DEVPATH内核设备路径,比如/sys/devices/*
SUBSYSTEM子系统名字,例如:sda 的子系统为 block,网卡为net
BUS总线的名字,比如IDE,USB
DRIVER设备驱动的名字,比如ide-cdrom
SYSFS{value}sysfs属性值,他可以表示任意
ENV{key}环境变量
PROGRAM可执行的外部程序,如果程序返回0值,该键则认为为真(true)
RESULT上一个PROGRAM调用返回的标准输出
NAME根据这个规则创建的设备文件的文件名。注意:仅仅第一行的NAME描述是有效的,后面的均忽略。如果你想使用使用两个以上的名字来访问一个设备的话,可以考虑SYMLINK键。
SYMLINK为/dev/下的设备文件产生符号链接。由于udev只能为某个设备产生一个设备文件,所以为了不覆盖系统默认的 udev 规则所产生的文件,推荐使用符号连接。
OWNER设备文件的属组
GROUP设备文件所在的组。
MODE设备文件的权限,采用8进制
RUN为设备而执行的程序列表或者脚本

3 udev规则需要查询信息

3.1 按照路径查询

例如查询网卡的信息:
# udevadm  info -a -p /sys/class/net/enp1s0Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.looking at device '/devices/pci0000:00/0000:00:1c.5/0000:06:00.0/net/enp1s0':KERNEL=="enp1s0"SUBSYSTEM=="net"DRIVER==""ATTR{ifindex}=="6"ATTR{netdev_group}=="0"ATTR{name_assign_type}=="4"ATTR{addr_assign_type}=="0"ATTR{gro_flush_timeout}=="0"ATTR{dormant}=="0"ATTR{dev_id}=="0x0"ATTR{iflink}=="6"ATTR{dev_port}=="0"ATTR{duplex}=="full"ATTR{flags}=="0x1003"ATTR{type}=="1"ATTR{carrier_changes}=="1"ATTR{link_mode}=="0"ATTR{carrier_up_count}=="1"ATTR{address}=="70:ca:4d:f7:0a:d8"ATTR{carrier}=="1"ATTR{proto_down}=="0"ATTR{broadcast}=="ff:ff:ff:ff:ff:ff"ATTR{operstate}=="up"ATTR{ifalias}==""ATTR{mtu}=="1500"ATTR{addr_len}=="6"ATTR{speed}=="100"ATTR{carrier_down_count}=="0"ATTR{tx_queue_len}=="1000"looking at parent device '/devices/pci0000:00/0000:00:1c.5/0000:06:00.0':KERNELS=="0000:06:00.0"SUBSYSTEMS=="pci"DRIVERS=="yt6801"ATTRS{local_cpulist}=="0-11"ATTRS{local_cpus}=="fff"ATTRS{class}=="0x020000"ATTRS{dma_mask_bits}=="48"ATTRS{ari_enabled}=="0"ATTRS{msi_bus}=="1"ATTRS{consistent_dma_mask_bits}=="48"ATTRS{max_link_width}=="1"ATTRS{current_link_speed}=="2.5 GT/s"ATTRS{driver_override}=="(null)"ATTRS{current_link_width}=="1"ATTRS{max_link_speed}=="2.5 GT/s"ATTRS{enable}=="1"ATTRS{subsystem_vendor}=="0x2066"ATTRS{revision}=="0x01"ATTRS{subsystem_device}=="0x9806"ATTRS{irq}=="17"ATTRS{device}=="0x6801"ATTRS{vendor}=="0x1f0a"ATTRS{broken_parity_status}=="0"looking at parent device '/devices/pci0000:00/0000:00:1c.5':KERNELS=="0000:00:1c.5"SUBSYSTEMS=="pci"DRIVERS=="pcieport"ATTRS{driver_override}=="(null)"ATTRS{enable}=="1"ATTRS{ari_enabled}=="0"ATTRS{subordinate_bus_number}=="6"ATTRS{max_link_speed}=="8 GT/s"ATTRS{current_link_width}=="1"ATTRS{local_cpulist}=="0-11"ATTRS{device}=="0x7abd"ATTRS{subsystem_vendor}=="0x8086"ATTRS{dma_mask_bits}=="32"ATTRS{msi_bus}=="1"ATTRS{secondary_bus_number}=="6"ATTRS{consistent_dma_mask_bits}=="32"ATTRS{subsystem_device}=="0x7270"ATTRS{current_link_speed}=="2.5 GT/s"ATTRS{vendor}=="0x8086"ATTRS{revision}=="0x11"ATTRS{class}=="0x060400"ATTRS{broken_parity_status}=="0"ATTRS{irq}=="127"ATTRS{max_link_width}=="1"ATTRS{local_cpus}=="fff"looking at parent device '/devices/pci0000:00':KERNELS=="pci0000:00"SUBSYSTEMS==""DRIVERS==""

3.2 按照设备名称查询

如果在/dev 下面的节点已经被创建,但是不知道它对应的/sys具体节点路径可以使用
"udevadm info -a -p $(udevadm info -q path -n /dev/<节点名>)” 命令反向分析。

# udevadm  info  -a -p $(udevadm info -q path -n /dev/mtd0)Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.looking at device '//devices/pci0000:00/0000:00:1f.5/mtd/mtd0':KERNEL=="mtd0"SUBSYSTEM=="mtd"DRIVER==""ATTR{subpagesize}=="1"ATTR{oobsize}=="0"ATTR{offset}=="0"ATTR{flags}=="0x800"ATTR{size}=="33554432"ATTR{ecc_step_size}=="0"ATTR{bitflip_threshold}=="0"ATTR{erasesize}=="4096"ATTR{name}=="BIOS"ATTR{type}=="nor"ATTR{oobavail}=="0"ATTR{ecc_strength}=="0"ATTR{numeraseregions}=="0"ATTR{ecc_failures}=="0"ATTR{corrected_bits}=="0"ATTR{writesize}=="1"ATTR{bad_blocks}=="0"ATTR{bbt_blocks}=="0"looking at parent device '//devices/pci0000:00/0000:00:1f.5':KERNELS=="0000:00:1f.5"SUBSYSTEMS=="pci"DRIVERS=="intel-spi"ATTRS{subsystem_vendor}=="0x8086"ATTRS{msi_bus}=="1"ATTRS{class}=="0x0c8000"ATTRS{revision}=="0x11"ATTRS{irq}=="0"ATTRS{device}=="0x7aa4"ATTRS{vendor}=="0x8086"ATTRS{dma_mask_bits}=="32"ATTRS{broken_parity_status}=="0"ATTRS{consistent_dma_mask_bits}=="32"ATTRS{local_cpus}=="fff"ATTRS{driver_override}=="(null)"ATTRS{index}=="15"ATTRS{label}=="Onboard - Other"ATTRS{subsystem_device}=="0x7270"ATTRS{ari_enabled}=="0"ATTRS{enable}=="1"ATTRS{local_cpulist}=="0-11"looking at parent device '//devices/pci0000:00':KERNELS=="pci0000:00"SUBSYSTEMS==""DRIVERS==""

4. udev规则文件示例

4.1 usb、硬盘、sd卡

###########---USB---################
#----------------------------------#
KERNEL=="sd[b-z]*", SUBSYSTEM=="block", ACTION=="add", ENV{DEVTYPE}=="partition", RUN+="/bin/systemctl start udisk-automount@%k.service"
KERNEL=="sd[b-z]*", SUBSYSTEM=="block", ACTION=="remove", ENV{DEVTYPE}=="partition", RUN+="/bin/systemctl stop udisk-automount@%k.service"##########---hard disk---#############
#----------------------------------#
KERNEL=="hd[b-z]*", SUBSYSTEM=="block", ACTION=="add", ENV{DEVTYPE}=="partition", RUN+="/bin/systemctl start udisk-automount@%k.service"
KERNEL=="hd[b-z]*", SUBSYSTEM=="block", ACTION=="remove", ENV{DEVTYPE}=="partition", RUN+="/bin/systemctl stop udisk-automount@%k.service"#########-----SD------##############
#----------------------------------#
KERNEL=="mmcblk[0-9]*", SUBSYSTEM=="block", ACTION=="add", RUN+="/bin/systemctl start udisk-automount@%k.service"
KERNEL=="mmcblk[0-9]*", SUBSYSTEM=="block", ACTION=="remove", RUN+="/bin/systemctl stop udisk-automount@%k.service"

4.2 串口软链接

KERNEL=="ttyS7" ,SUBSYSTEM=="tty", SYMLINK+="ttyACM0"

4.3 网卡名称

SUBSYSTEMS=="pci",SUBSYSTEM=="net",KERNELS=="0000:02:00.0",NAME="enp3s0"
SUBSYSTEMS=="pci",SUBSYSTEM=="net",KERNELS=="0000:03:00.0",NAME="enp4s0"
SUBSYSTEMS=="pci",SUBSYSTEM=="net",KERNELS=="0000:04:00.0",NAME="enp5s0"
SUBSYSTEMS=="pci",SUBSYSTEM=="net",KERNELS=="0000:05:00.0",NAME="enp6s0"
SUBSYSTEMS=="pci",SUBSYSTEM=="net",KERNELS=="0000:06:00.0",NAME="enp1s0"
SUBSYSTEMS=="pci",SUBSYSTEM=="net",KERNELS=="0000:07:00.0",NAME="enp2s0"

4.4 触摸屏

SUBSYSTEM=="input", KERNEL=="event[0-9]*", ATTRS{modalias}=="input:*-e0*,3,*a0,1,*18,*", SYMLINK+="input/touchscreen0"
SUBSYSTEM=="input", KERNEL=="event[0-9]*", ATTRS{modalias}=="ads7846", SYMLINK+="input/touchscreen0"

相关文章:

linux udev详解

1.概念介绍 1.1sysfs文件系统 Linux 2.6以后的内核引入了sysfs文件系统&#xff0c;sysfs被看成是与proc、devfs和devpty同类别的文件系统&#xff0c;该文件系统是一个虚拟的文件系统&#xff0c;它可以产生一个包括所有系统硬件的层级视图&#xff0c;与提供进程和状态信息…...

EventSource和websocket该用哪种技术

EventSource&#xff08;也称为Server-Sent Events, SSE&#xff09;和WebSocket都是实现实时通信的技术&#xff0c;但是它们的设计目的和使用场景有所不同。在选择使用哪种技术时&#xff0c;需要根据具体的应用需求来决定。下面是一些关键点&#xff0c;可以帮助你做出选择&…...

通信工程学习:什么是三网融合

三网融合 三网融合&#xff0c;又称“三网合一”&#xff0c;是指电信网、广播电视网、互联网在高层业务应用上的深度融合。这一概念在近年来随着信息技术的快速发展而逐渐受到重视&#xff0c;并成为推动信息化社会建设的重要力量。以下是对三网融合的详细解释&#xff1a; 一…...

自定义类型结构体(上)

目录 结构体类型的声明结构体的概念结构体的声明特殊的声明结构的自引用 结构体变量的创建和初始化结构成员访问操作符 结构体类型的声明 结构体的概念 结构体是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量 举个例子:杰克的英语只考了6…...

b站-湖科大教书匠】4 网络层 - 计算机网络微课堂

【b站-湖科大教书匠】4 网络层 - 计算机网络微课堂_湖科大的计算机网络网课-CSDN博客...

国际 Android WPS Office v18.13 解锁版

WPS Office 移动版&#xff0c;设计不断优化&#xff0c;性能再次提升&#xff01;融入Google Android最新设计标准&#xff0c;Material Design设计风格&#xff0c;完美支持沉浸式&#xff01;简化文档操作&#xff0c;全新移动办公力作。全新界面更清晰舒适&#xff0c;功能…...

【中间件学习】Git的命令和企业级开发

一、Git命令 1.1 创建Git本地仓库 仓库是进行版本控制的一个文件目录。我们要想对文件进行版本控制&#xff0c;就必须创建出一个仓库出来。创建一个Git本地仓库对应的命令是 git init &#xff0c;注意命令要在文件目录下执行。 hrxlavm-1lzqn7w2w6:~/gitcode$ pwd /home/hr…...

FTP连接池与多线程FTP上传下载算法(Java)

设计一个能够处理FTP连接池在多线程环境下,尤其是涉及到故障重连时避免竞争条件的算法,需要综合考虑线程同步、连接状态管理和重试机制。以下是一个设计思路和实现方案: 设计思路 连接池管理: 维护一个连接池,其中包含多个FTP连接对象。每个FTP连接对象需有状态标记(如…...

Spring Cloud微服务详解

Spring Cloud微服务详解 在当今的数字化时代&#xff0c;微服务架构已成为构建大型、复杂应用系统的主流方式。Spring Cloud&#xff0c;作为微服务领域的一颗璀璨明星&#xff0c;以其强大的功能和灵活的架构&#xff0c;吸引了无数开发者的目光。本文将深入探讨Spring Cloud…...

QT学习笔记1.2(QT的应用)

QT原生用于c的开发&#xff0c; 主要应用于电脑、桌面手机桌面软件的开发&#xff0c;主要是widget样式模板。 Qt Widgets、Qt Quick 和 Qt for Python 是 Qt 框架中的三种不同的技术&#xff0c;分别用于不同的应用场景。以下是它们的详细介绍和对比&#xff1a; 1. Qt Widg…...

数学建模算法与应用 第1章 线性规划

第1章 线性规划 线性规划是数学规划领域的重要分支&#xff0c;广泛应用于资源配置、生产计划、物流管理等领域。它主要用于解决如何在满足一定约束条件下&#xff0c;使目标函数&#xff08;如成本、利润等&#xff09;达到最大或最小的问题。第一章将介绍线性规划的基本概念…...

使用 systemd 设置 PHP 程序为服务

使用 systemd 设置 PHP 程序为服务 在现代 Linux 系统中&#xff0c;systemd 是用于管理和控制服务的标准工具。通过 systemd&#xff0c;我们可以轻松地将 PHP 程序配置为后台运行的系统服务&#xff0c;从而实现自动化启动、重启和日志记录等功能。本文将介绍如何为 PHP 程序…...

HRNET模型实现钢板表面缺陷检测

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有&#xff1a;中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等&#xff0c;曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝&#xff0c;拥有2篇国家级人工智能发明专利。 社区特色…...

28 基于51单片机的两路电压检测(ADC0808)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;通过ADC0808获取两路电压&#xff0c;通过LCD1602显示 二、硬件资源 基于KEIL5编写C代码&#xff0c;PROTEUS8.15进行仿真&#xff0c;全部资源在页尾&#xff0c;提供…...

SpringBootTest Mockito 虚实结合编写测试

SpringBootTest & Mockito 虚实结合测试 起因 单一使用mockito&#xff0c;会出现很多mock困难的问题&#xff0c;导致测试编写过程太长&#xff0c;太恶心 单一使用springboottest&#xff0c;会遇到需要外部接口的地方&#xff0c;这个时候就非得去真实调用才行。也很恶…...

国内外网络安全政策动态(2024年9月)

国内网络安全政策动态 ▶︎ 1.三项智能网联汽车强制性国家标准正式发布 9月4日&#xff0c;工业和信息化部组织制定的GB 44495—2024《汽车整车信息安全技术要求》、GB 44496—2024《汽车软件升级通用技术要求》和GB 44497—2024《智能网联汽车 自动驾驶数据记录系统》三项强制…...

使用Android studio进行Unit Test中遇到的问题记录

1、模块本身代码运行不起来 提示&#xff1a; Cannot resolve method ‘getVolumes’ in ‘StorageManager’ Cannot resolve method ‘registerListener’ in ‘StorageManager’ Cannot resolve method ‘unregisterListener’ in ‘StorageManager’ 查看Android 源码&…...

智能运维与问题诊断工具:提升生产环境的安全稳定性

引言 在当今复杂的IT环境中,确保生产系统的安全稳定运行是一项巨大挑战。随着技术的进步,智能运维和问题诊断工具应运而生,为IT团队提供了强大的支持。本文将介绍一系列先进的工具,这些工具利用人工智能、机器学习和自动化技术,帮助组织提高系统可靠性、加速问题解决、优…...

【MAUI】CommunityToolkit社区工具包介绍

一、为什么需要声明式开发 .NET的MVVM,始于WPF,很古典,它甚至可能是现代前端框架“声明式开发”的鼻祖。声明式开发,之所以出现,是因为命令式开发在UI层和代码层上无法解耦的问题。如下图所示: 1、命令式开发:后台代码需要调用UI层的控件(label.Text),如果更新UI层…...

【答疑解惑】图文深入详解undo和redo的区别及其底层逻辑

题记&#xff1a;最近有些人问我&#xff0c;undo和redo到底是什么关系&#xff0c;他们中不乏已经入行3-4年的同学&#xff0c;今天咱们就来深入探讨下到底什么是undo和redo&#xff0c;他们分别做什么&#xff0c;底层逻辑原理是什么等等。 1. undo 1.1 undo的存储结构 Un…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...