文章目录
团队博客: 汽车电子社区
1. 源码结构和文件组织
1.1 主要目录结构
src/udev/
├── 核心守护进程
│ ├── udevd.c # 主守护进程入口
│ ├── udevd.h # 守护进程头文件
│ ├── udev-manager.c/.h # 管理器核心实现
│ ├── udev-worker.c/.h # 工作进程实现
│ └── udev-ctrl.c/.h # 控制接口实现
├── 事件处理系统
│ ├── udev-event.c/.h # 事件处理核心
│ ├── udev-rules.c/.h # 规则引擎
│ └── udev-spawn.c/.h # 进程生成管理
├── 设备节点管理
│ ├── udev-node.c/.h # 设备节点创建/删除
│ └── udev-watch.c/.h # 设备监控
├── 内置命令系统
│ ├── udev-builtin.c/.h # 内置命令管理
│ ├── udev-builtin-*.c # 各种内置命令实现
│ └── udev-def.h # 类型定义和常量
├── 管理工具
│ ├── udevadm.c # 主管理工具入口
│ └── udevadm-*.c # 各种子命令实现
├── 网络设备支持
│ ├── net/ # 网络配置相关
│ ├── udev-builtin-net_*.c # 网络相关内置命令
│ └── link-config.c/.h # 链路配置
└── 硬件抽象层
├── udev-builtin-hwdb.c # 硬件数据库
├── udev-builtin-input_id.c # 输入设备识别
├── udev-builtin-usb_id.c # USB设备识别
└── udev-builtin-path_id.c # 路径识别
1.2 核心文件功能
| 文件 | 主要功能 | 重要性 |
|---|---|---|
udevd.c | 守护进程入口点,初始化和主循环 | ★★★★★ |
udev-manager.c | 管理器实现,事件队列和工作进程管理 | ★★★★★ |
udev-event.c | 事件处理逻辑,规则应用和设备操作 | ★★★★☆ |
udev-rules.c | 规则解析引擎,匹配和执行 | ★★★★★ |
udev-worker.c | 工作进程实现,设备处理执行 | ★★★★☆ |
udevadm.c | 管理工具入口,命令分发 | ★★★☆☆ |
2. 核心功能和架构设计
2.1 整体架构
┌─────────────────────────────────────────────────────────────┐
│ systemd-udevd │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Manager │ │ Rules │ │ Workers │ │
│ │ │ │ Engine │ │ │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Device │ │ Event │ │ Built-in │ │
│ │ Monitor │ │ Queue │ │ Commands │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
├─────────────────────────────────────────────────────────────┤
│ Kernel Interface (netlink) │
└─────────────────────────────────────────────────────────────┘
2.2 核心数据结构
Manager 结构
typedef struct Manager {
sd_event *event; // 主事件循环
Hashmap *workers; // 工作进程池
LIST_HEAD(Event, events); // 事件队列
UdevRules *rules; // 规则引擎
sd_device_monitor *monitor; // 设备监控器
UdevCtrl *ctrl; // 控制接口
sd_varlink_server *varlink_server; // Varlink服务器
Hashmap *locked_events_by_disk; // 磁盘锁定事件
Prioq *locked_events_by_time; // 时间优先队列
UdevConfig config; // 配置参数
// ... 其他字段
} Manager;
Event 结构
typedef struct Event {
Manager *manager; // 所属管理器
Worker *worker; // 处理工作进程
sd_device *dev; // 设备对象
sd_device_action_t action; // 设备动作
uint64_t seqnum; // 序列号
EventState state; // 事件状态
Set *blocker_events; // 阻塞事件
Set *blocking_events; // 被阻塞事件
// ... 其他字段
} Event;
3. 设备事件处理机制
3.1 事件处理流程
Kernel uevent → Device Monitor → Event Queue → Worker Process → Rules Engine → Device Operations
↓ ↓ ↓ ↓ ↓ ↓
netlink socket sd_device_manager Manager udev_worker udev_rules udev_node
3.2 事件状态机
EVENT_UNDEF → EVENT_QUEUED → EVENT_RUNNING → (completed)
↓ ↓ ↓
创建事件 加入队列 分配工作进程 处理完成
↓ ↓ ↓
初始化 依赖检查 规则应用 清理资源
3.3 关键处理函数
1. 事件接收 (on_uevent)
- 从内核接收设备事件
- 创建 Event 对象
- 插入事件队列
2. 事件排队 (event_queue_insert)
- 按序列号排序
- 检查重复事件
- 建立事件依赖关系
3. 事件处理 (event_run)
- 分配空闲工作进程
- 或创建新的工作进程
- 发送设备对象到工作进程
4. 规则系统实现
4.1 规则文件结构
# 基本规则格式
KERNEL=="sd*", SUBSYSTEM=="block", ATTR{size}=="[0-9]*", NAME="disk%n"
# 规则令牌类型
TK_M_* // 匹配令牌 (Match tokens)
TK_A_* // 赋值令牌 (Assignment tokens)
4.2 规则解析器
typedef struct UdevRuleToken {
UdevRuleTokenType type; // 令牌类型
UdevRuleOperatorType op; // 操作符类型
UdevRuleMatchType match_type; // 匹配类型
const char *value; // 值
struct UdevRuleLine *rule_line; // 所属规则行
} UdevRuleToken;
4.3 规则执行引擎
1. 解析阶段:将规则文件解析为令牌流
2. 匹配阶段:逐个检查匹配条件
3. 执行阶段:应用赋值操作
4. 内置命令:执行指定的内置命令
4.4 性能优化
- 规则缓存:编译后的规则保存在内存中
- 快速匹配:使用哈希表和优化的字符串比较
- 懒加载:只在需要时加载规则文件
- 增量更新:监控规则文件变化,热重载
5. 设备数据库管理
5.1 数据库结构
/run/udev/data/
├── b8:0 # 设备ID (major:minor)
├── c8:1
└── ...
5.2 数据库操作
1. 创建:device_update_db()
2. 读取:device_read_db()
3. 删除:device_delete_db()
4. 查询:sd_device_get_property_value()
5.3 数据持久化
- 设备属性和标签保存在文本文件中
- 支持事务性更新
- 自动清理过期数据
6. 网络设备支持
6.1 网络接口命名策略
// 命名优先级
1. 固件提供的名称 (onboard index)
2. PCI 插槽位置 (slot index)
3. 物理位置 (path-based)
4. MAC 地址 (mac-based)
6.2 网络配置系统
/etc/systemd/network/
├── 99-default.link # 默认链路配置
├── 10-wired.link # 有线网络配置
└── 20-wireless.link # 无线网络配置
6.3 内置命令支持
- net_id:生成网络设备ID
- net_setup_link:设置网络链路
- net_driver:网络驱动识别
7. 内核接口集成
7.1 Netlink 通信
// 设备监控器创建
sd_device_monitor *monitor;
sd_device_monitor_new(&monitor);
// 附加到事件循环
sd_device_monitor_attach_event(monitor, event);
// 开始监控
sd_device_monitor_start(monitor, on_uevent, manager);
7.2 设备对象抽象
// 设备对象操作
sd_device_get_devpath(dev, &path); // 获取设备路径
sd_device_get_subsystem(dev, &subsystem); // 获取子系统
sd_device_get_sysattr_value(dev, attr, &value); // 获取属性值
7.3 内核事件类型
- add:设备添加
- remove:设备移除
- change:设备状态变化
- move:设备移动
- online/offline:设备上线/下线
8. 性能优化策略
8.1 并行处理
- 工作进程池:多个工作进程并行处理事件
- 事件队列:有序的事件处理队列
- 锁机制:避免设备访问冲突
8.2 内存优化
- 对象池:复用 Event 和 Worker 对象
- 引用计数:精确的内存管理
- 缓存友好:减少内存分配和释放
8.3 I/O 优化
- 批量操作:合并多个设备操作
- 异步处理:非阻塞的设备操作
- 缓冲机制:减少系统调用次数
8.4 监控和调试
// 性能监控
DEVICE_TRACE_POINT(kernel_uevent_received, dev);
DEVICE_TRACE_POINT(rules_start, dev);
DEVICE_TRACE_POINT(worker_spawned, dev, getpid());
9. 硬件抽象层
9.1 硬件数据库 (HWDB)
// HWDB 查询
sd_hwdb *hwdb;
sd_hwdb_new(&hwdb);
sd_hwdb_get_properties(hwdb, modalias, key, value);
9.2 设备识别
- USB 设备:udev-builtin-usb_id.c
- 输入设备:udev-builtin-input_id.c
- 块设备:udev-builtin-blkid.c
- SCSI 设备:ata_id/ata_id.c
9.3 属性提取
- 设备属性:从 sysfs 读取硬件信息
- 驱动信息:获取驱动程序详细信息
- 固件数据:读取固件提供的信息
10. 与其他模块的集成
10.1 systemd 集成
systemd-udevd.service
├── 启动依赖
│ ├── systemd-journald.service
│ ├── systemd-remount-fs.service
│ └── systemd-sysusers.service
└── 服务依赖
├── systemd-networkd.service
├── systemd-logind.service
└── various device units
10.2 控制接口
1. 传统 Socket:/run/udev/control
2. Varlink 接口:/run/udev/io.systemd.Udev
// Varlink 方法
vl_method_reload() // 重载配置
vl_method_set_log_level() // 设置日志级别
vl_method_set_children_max() // 设置最大子进程数
10.3 管理工具集成
udevadm
├── info // 查询设备信息
├── monitor // 监控设备事件
├── trigger // 触发设备事件
├── settle // 等待事件处理完成
├── control // 控制 udev 守护进程
├── test // 测试规则执行
└── hwdb // 管理硬件数据库
11. 关键特性总结
11.1 高可用性
- 守护进程自动重启
- 事件序列化保存
- 工作进程监控
11.2 可扩展性
- 插件式内置命令
- 动态规则重载
- 模块化设计
11.3 安全性
- 设备访问控制
- 安全的设备命名
- 权限管理
11.4 调试能力
- 详细的事件跟踪
- 规则调试工具
- 性能监控
12. 数据流程图
12.1 事件处理流程图
┌─────────────┐ uevent ┌─────────────┐ Event ┌─────────────┐
│ 内核 │ ──────────→ │ Device │ ─────────→ │ Manager │
│ 事件源 │ │ Monitor │ Queue │ │
└─────────────┘ └─────────────┘ └─────────────┘
│ │ │
│ ▼ ▼
│ ┌─────────────┐ ┌─────────────┐
│ │ Event │ │ Worker │
│ │ Sorting │ │ Process │
│ └─────────────┘ └─────────────┘
│ │ │
│ ▼ ▼
│ ┌─────────────┐ ┌─────────────┐
│ │ Rules │ │ Built-in │
│ │ Matching │ │ Commands │
│ └─────────────┘ └─────────────┘
│ │ │
│ ▼ ▼
│ ┌─────────────┐ ┌─────────────┐
│ │ Device │ │ Device │
│ │ Database │ │ Nodes │
│ └─────────────┘ └─────────────┘
│ │ │
└─────────────────────────────┴─────────────────────────┘
│
▼
┌─────────────┐
│ Complete │
│ Event │
└─────────────┘
12.2 规则处理流程图
┌─────────────┐ Rule File ┌─────────────┐ Token ┌─────────────┐
│ Rules │ ─────────────→ │ Parser │ ─────────→ │ Matching │
│ Files │ │ Engine │ Stream │ Engine │
└─────────────┘ └─────────────┘ └─────────────┘
│ │ │
│ ▼ ▼
│ ┌─────────────┐ ┌─────────────┐
│ │ Optimized │ │ Condition │
│ │ Cache │ │ Check │
│ └─────────────┘ └─────────────┘
│ │ │
│ ▼ ▼
│ ┌─────────────┐ ┌─────────────┐
│ │ Assignment │ │ Action │
│ │ Execute │ │ Apply │
│ └─────────────┘ └─────────────┘
│ │ │
│ ▼ ▼
│ ┌─────────────┐ ┌─────────────┐
│ │ Built-in │ │ Device │
│ │ Command │ │ Update │
│ └─────────────┘ └─────────────┘
│ │ │
└─────────────────────────────┴─────────────────────────┘
│
▼
┌─────────────┐
│ Result │
│ Notify │
└─────────────┘
13. 软件架构图
┌─────────────────────────────────────────────────────────────────────────────┐
│ systemd-udevd 架构 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ Manager Core Layer │ │
│ │ │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ Event │ │ Worker │ │ Rules │ │ Control │ │ │
│ │ │ Queue │ │ Pool │ │ Engine │ │ Interface │ │ │
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ • 排序管理 │ │ • 并行处理 │ │ • 规则解析 │ │ • 监控接口 │ │ │
│ │ │ • 依赖关系 │ │ • 资源管理 │ │ • 匹配执行 │ │ • 动态配置 │ │ │
│ │ │ • 序列化 │ │ • 状态监控 │ │ • 缓存优化 │ │ • 日志控制 │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ Device Processing Layer │ │
│ │ │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ Built │ │ Device │ │ Network │ │ HWDB │ │ │
│ │ │ -in Cmds │ │ Nodes │ │ Config │ │ System │ │ │
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ • ID识别 │ │ • 节点创建 │ │ • 接口命名 │ │ • 硬件识别 │ │ │
│ │ │ • 属性设置 │ │ • 权限管理 │ │ • 链路配置 │ │ • 数据查询 │ │ │
│ │ │ • 环境变量 │ │ • 符号链接 │ │ • 策略应用 │ │ • 缓存管理 │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ System Integration │ │
│ │ │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ Kernel │ │ systemd │ │ udevadm │ │ Systemd │ │ │
│ │ │ Interface │ │ Units │ │ Tool │ │ Services │ │ │
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ • Netlink │ │ • 设备单元 │ │ • 监控调试 │ │ • 依赖管理 │ │ │
│ │ │ • sysfs │ │ • 目标依赖 │ │ • 规则测试 │ │ • 启动顺序 │ │ │
│ │ │ • uevent │ │ • 状态同步 │ │ • 数据查询 │ │ • 服务集成 │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ Security & Performance │ │
│ │ │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ Permission │ │ Memory │ │ I/O │ │ Debug │ │ │
│ │ │ Control │ │ Management │ │ Optimization│ │ Support │ │ │
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ • 设备权限 │ │ • 对象池 │ │ • 异步操作 │ │ • 事件跟踪 │ │ │
│ │ │ • 访问控制 │ │ • 引用计数 │ │ • 批量处理 │ │ • 规则调试 │ │ │
│ │ │ • 安全策略 │ │ • 缓存管理 │ │ • 缓冲机制 │ │ • 性能监控 │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
14. 未来发展方向
1. 性能优化:更高效的事件处理算法
2. 安全增强:更强的设备访问控制
3. 云原生支持:容器化环境适配
4. AI 集成:智能设备识别和配置
这个深度分析展示了 systemd udevd 作为现代 Linux 系统核心设备管理器的复杂性和完整性,其设计充分考虑了性能、可靠性和可维护性。

1296

被折叠的 条评论
为什么被折叠?



