LWN: systemd代为受过,增加bind事件支持!

Linux系列:Systemd 常用命令(详解) Systemd 常用命令(详解 阅读详情

关注了就能看到更多这么棒的文章哦~

Systemd catches up with bind events

By Jonathan Corbet
November 13, 2020
DeepL assisted translation
https://lwn.net/Articles/837033/

kernel 代码在进行改动时,非常注重避免破坏 user space 的应用。也就是说如果某一个版本的内核能够让这个应用程序正常工作,那么在后续内核版本中也要能继续工作。因此,在 systemd 247-rc2 版本的的公告中,大家看到一个明显的会导致 user-space API 不再向后兼容的问题以及相关的一个详细解释的时候,会感到不满。为了保证系统的正常运行,需要对 udev 配置文件进行修改,但 systemd 项目声称,这 "不是 systemd 或 udev 的错,而是由 Linux 4.12 中出现的一个不能向后兼容的内核改动造成的"。这是一个合适的时机来看看这里的细节、管理员需要如何应对这次的改动,以及是否可以采取措施来避免这种事情再次发生。

现代计算机系统往往是拥有复杂的动态变化的。在系统运行时,设备(包括物理设备和虚拟设备)会不断出现和消失。内核会对这些设备事件进行一些底层处理,但剩下的就交给用户空间来处理了。用户空间就需要知道系统的配置何时发生了变化,才能进行及时地处理。

例如,每当一个 USB 设备插入时,会产生一个或多个 ADD event,告诉用户空间有了一个新设备可用。udev daemon(守护进程)就负责根据一组 rule(规则)来对这些事件进行相应的处理。它可以创建设备节点、设置权限、通知其他的用户空间软件等等,所有这些都是获取到 event 的属性之后根据 rule 来进行相应的调用的。这里会用到的 event 种类并不多,而且不会经常变化。

Breaking systemd

不过在 2017 年 7 月,Dmitry Torokhov 增加了两个新的 event 类型,名为 BIND 和 UNBIND。它们的目的是让 user space 来处理那些在提供完整功能之前还需要一些协助的设备,例如需要加载固件(firmware)的设备。在支持这个新机制的驱动程序中,等到 device 准备好了,那么紧跟着 ADD event 之后就会发出一个 BIND event。这一改动是 2017 年 11 月发布的 4.14 内核的一部分(并不是 systemd 公告中所说的 4.12)。

当时那个月底前,KDE 的 bug 跟踪系统上就有人报出了一个 bug,这可能是第一次被人发现的与这个新的 EVENT 有关的事例。不过这个 bug report 直到 2018 年年底才出现在 kernel mailing list 中,这已经有一年多的时间过去了。那时,4.14 已经被定为了一个 long-term support kernel,并且许多 Linux 发行版里面都有使用,用户也很少有抱怨。所以,Greg Kroah-Hartman 感到很困惑,为什么一年后才会出现问题。后来才明白,原来是 systemd 的新改动,开始会把这个 event 上报出去了。

具体来说,这个问题似乎源于 udev(这是 systemd 项目的一部分)给 event 附加 tag 的方式。这些 tag 由 udev rule 来决定怎样设置和使用,用来控制 user space 如何对这个新设备进行配置。之前的实现中,有一个潜在假设,即在新设备出现时,只会发出一个 event,所以只要为这个 event 增加 tag 就足够了。当第二个 event(BIND event)出现时,设备的状态被 reset,这些 tag 就删除了,导致这个设备没有得到正确的配置。

当时临时的 fix 方法就是修改 systemd,直接忽略新的 event。这样做的缺点就是导致新增的 event 被隐藏掉了。这肯定不能作为一个长期解决方案,毕竟增加新的 event 是有用处的,有些设备需要这些 event 才能正确进行配置。所以必须找到一个更好的长期解决方案。这个解决方案既有好处也有坏处,坏处就是可能会对那些已经创建了自己的 udev rule 的用户导致一些麻烦。

Fixing systemd

首先,需要对 udev 提供的 "tag" 机制进行改造。tag 是用来做标记的一种特殊的属性,然后会在后续的规则中进行匹配,或者由 userspace 来使用。udev 没有像之前那样将 tag 附加到 event 上,而是将 tag 附加到了设备上。所以,因为 add 事件而添加的 tag,在 bind 事件中也仍然会存在。对于需要使用 rule 来仅处理当前 event 中添加的 tag 的情况来说,新增了一个 CURRENT_TAGS property,只列出了当前 event 的 tag。因此,它实际上用起来就跟以前版本中的 TAGS 属性用法一致。

不过,还有一些改动是必须要对多个 udev rule 来进行改动的。例如,下面这是一个从 Fedora 32 系统中随机选取的一个 rule 文件(10-dm-disk.rules):

# "add" event is processed on coldplug only!
ACTION!="add|change", GOTO="dm_end"

ACTION 这一行的意思是说,如果碰到的不是 ADD 或 CHANGE 这两个 event 之一,就直接跳到文件末尾,不进行任何操作。现在碰到的问题就是,BIND event 就会落入这种情形之中。这将导致与这些 event 关联起来的 property 都被丢失,而且相关的设备也没有正确设置(甚至可能完全没有进行设置)。这里的解决办法就是将这一行改为下面这样:

ACTION=="remove",GOTO="dm_end"

这样一来,只有当设备被从系统移除掉之时,那些配置 rule 才会被跳过。

这样做的问题在于,这些 rule 编写的时候,是假设不会再增加新的 event 类型。所以,任何没有被识别为 add 或 change 的设备事件都可以被忽略。显然,肯定有很多规则都是这么写的,因此也会有同样的问题。这里实际上存在的是一种协议僵化(protocol ossification)现象,这使得人们要在内核提供的 API 中添加新的 event 种类会变得越来越困难。事实上,在 2018 年,Torokhov 就曾指出:

好吧,看来我们不能再增加新的 uevent 类型来扩展这个接口了,至少在我们修复完所有的 udev-derivatives,并花一些时间解决这个问题之前,我们不能再扩展 uevent 接口。

当时,有人讨论是不是能 revert 那个 kernel patch,把新增的 event 拿掉。但这种做法也会再导致一个 regression 问题,因为有些系统可能已经开始使用这些 event 了,毕竟加入这些 event 的内核版本已经发布有一年了。我们也曾讨论过添加例如 sysctl 设置来决定是否启用 BIND 和 UNBIND 这两个 event,但没有通过。而 Torokhov 介绍了可以在 systemd 项目中做出上述改动,后面 Kroah-Hartman 就回应说:"那么就一切都解决了".

A regression?

运气好的话,一切都解决了,但这个代价就是过去两年 systemd 社区内的不少工作。systemd 开发者已经表达了他们的不满:

我们对这次导致大家现有的 rule 可能无法正常工作、从而需求要求大家更新相关配置,感到非常抱歉。我们想再次强调,这不是系统/udev 的变化造成的,而是 kernel 行为改变的结果。

这是否违反了内核的 "no regressions" 规则?答案几乎可以肯定是 "Yes";在 4.13 下工作的代码在 4.14 下不再能正常工作。应该如何处理这个问题,就不是很明确了。如果这个问题能更快地被报告给内核社区,也许可以 revert 掉,并重新进行设计。但在它被部署了一年之后才报出来,这时候就很难进行抉择了。人们当然可以说,内核社区应该找到其他方法来修复这个 regression 问题。systemd 247-rc2 公告就是在提出这样的观点。但是当 Torokhov 声明说这个问题会在 systemd 这边解决,内核社区这边就没有动力继续去尝试解决方案了。

也许这里真正的教训是,如果内核项目和像 systemd 这样的底层管理工具之间的关系能更加紧密,就会对社区更有好处。有时候他们的关系会比较紧张,并且没有什么渠道专门用来进行项目之间的合作讨论。systemd 开发者在 Linux Plumbers Conference 这样的活动中也是很少出现的,而且这些开发者感觉 kernel mailing list 不是很欢迎他们(这种看法也是有确实事例的)。不过,我们都是在同一个系统上工作,如果我们能多进行交流,大家都会更轻松一些。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

ESP32C3的I2S接口详解:以驱动PCM5102A为例,避开时序与配置的那些坑 本文深入解析ESP32C3的I2S接口驱动PCM5102A DAC的完整解决方案,涵盖时序对齐、PCB优化和寄存器级配置。通过实际案例分享时钟树分析、信号完整性设计和底层调试技巧,帮助开发者避开常见陷阱,实现高质量音频输出。重点探讨了I2S协议栈、电源滤波优化及DMA传输异常处理等关键技术要点。 阅读详情

相关推荐

rk3566-11.0新增device分区

1.增加块设备 2.修改根目录节点权限 3.开机启动自动挂载 增加块设备 1.修改parameter.txt文件,新增块设备大小及命名 device/rockchip/rk356x/rk3566_r/parameter.txt FIRMWARE_VER: 11.0 MACHINE_MODEL: rk3566_r MACHINE_ID: 007 MANUFACTURER: rockchip MAGIC: 0x5041524B ATAG: 0x00200800 MACHINE

weixin_51115260的博客 3383

Systemd 日常使用介绍

应用场景:对日常系统启动过程进行管理,优化启动速度。 1. systemd原理 Systemd概述 systemd系统架构图 1.1 基础概念-Unit Systemd将系统初始化过程中所有的操作步骤都被抽象为Unit对应于之前SysVinit时代的Daemon的超集,根据不同的操作内容,Unit被细分为多个分类: service :类似于SysVinit时...

MENGHUANBEIKE的专栏 1093

使用VLC库实现视频播放器(WPF版)

使用wpf制作一个视频播放器 一、 LibVLCSharp介绍 LibVLCSharp是基于VideoLAN的LibVLC库的.NET平台的跨平台音频和视频API。它提供了一个全面的多媒体API,可以跨移动、服务器和桌面使用,以呈现视频和输出音频。支持Mono、.NET Framework和.NET核心运行时。在vs工具中,只需要安装截图中得两个nuget包。 二、视频播放器的实现 视频播放器的实现需要用到两个比较nuget包中提供的类,MediaPlayer类。MediaPlayer类型用于控

cangqiongxiaoye的博客 1万+

可能是史上最全面易懂的 Systemd 服务管理教程!( 强烈建议收藏 )

WantedBy:和 Unit 段的 Wants 作用相似,只有后面列出的不是服务所依赖的模块,而是依赖当前服务的模块。启动脚本的位置,以前是 /etc/init.d 目录,符号链接到不同的 RunLevel 目录 (比如 /etc/rc3.d、/etc/rc5.d 等),现在则存放在 /lib/systemd/system 和 /etc/systemd/system 目录。但是,里面存放的大部分文件都是符号链接,指向目录 /usr/lib/systemd/system/,真正的配置文件存放在那个目录。

ieusr的专栏 3685

COMSOL两相流(相场法)

COMSOL是一款功能非常强大的多物理场仿真软件,拥有可视化和后处理工具,可方便有效的展示您的仿真效果,具有灵活、高效、友好的特点,软件能够为用户提供各类工程问题的解决方案,从而帮助广大研究和工程人员能够在科研上取得新突破。 COMSOL可以实现声学、传热、流体力学、结构力学等方面的模拟仿真,具体模块如下图所示。 COMSOL软件设置流程 定义需要求解的问题类型:针对一个需要仿真的问题,需要先对问题进行分析;分析该问题用到哪些物理场,什么样的几何模型,以及如何设置研究等。该步骤可以使用COMSOL中的

weixin_47139559的博客 1万+

MMCV安装后报错‘from mmcv import Config’?别慌,这是MMCV 2.0的锅!快速降级回退MMCV 1.x全指南

本文详细解析了MMCV 2.0版本升级导致的‘from mmcv import Config’报错问题,提供了从诊断到降级回退MMCV 1.x的完整解决方案。通过pip和OpenMIM工具链的实操指南,帮助开发者快速解决版本冲突,确保项目稳定运行。

weixin_29102619的博客 263

linux 设备事件管理服务 systemd-udevd.service 简介

名称 systemd-udevd.service, systemd-udevd-control.socket, systemd-udevd-kernel.socket, systemd-udevd — 设备事件管理服务 大纲 systemd-udevd.service systemd-udevd-control.socket systemd-udevd-kernel.socket /u...

whatday的专栏 6855

推荐系统(1):推荐系统评测

对于可以离线优化的指标,我个人的看法是应该在给定覆盖率、多样性、新颖性等限制条件下,尽量优化预测准确度。用一个数学公式表达,离线实验的优化目标是:最大化预测准确度使得 覆盖率 > A多样性 > B新颖性 > C其中,A、B、C的取值应该视不同的应用而定。

数据不会骗人 2527

python 封装调用_使用python封装sd_notify到systemd

我们知道Centos7之后搁浅Sysvinit,改用复杂功能又及其强大,又特别惹人烦恼的systemd. 这个名字取得很大气,直接用system + d . Sysvint从unix时期就已经早早的存在了,在各大国外的社区都很不少大牛针对init 和 systemd进行讨论,目前来看支持Sysvinit的人多点。周边人对于systemd的看法. 有意思的是,我周边的开发人员都觉得无所谓,看...

weixin_39636102的博客 526

E-Prime脑电实验打mark全攻略:从端口查询到串并口实战(附常见问题解决)

本文提供了E-Prime脑电实验打mark的完整实战指南,涵盖端口查询、并口与串口配置的核心步骤及常见问题解决。文章深入解析了mark原理,并详细介绍了通过E-Basic脚本和Serial设备对象发送信号的两种方法,帮助研究者实现E-Prime与脑电设备的高精度时间同步,确保实验数据可靠性。

4k5l6j7h8的博客 354

晟矽微MC32F7361定时器的使用案例说明

110所以TIMER0所用的频率是FCPU的1/64,也就是8/64MHZ. 为1/8MHZ。//io口下拉电阻 1:enable 0:disablea。//io口上拉电阻 1:enable 0:disable。//io口下拉电阻 1:enable 0:disable。//io口上拉电阻 1:enable 0:disable。//io口下拉电阻 1:enable 0:disable。//io口上拉电阻 1:enable 0:disable。

liyanfei123456的博客 1129

网页加载失败先别急重启!多半 DNS 摆烂了

谁愿意背一串枯燥 IP 上网?DNS 就是网络专属翻译员。本文通俗拆解域名系统底层逻辑,讲清递归查询、迭代查询的区别,盘点 A、CNAME、PTR 等常见解析记录;手把手演示 dig、nslookup 排查命令,完整实操 BIND 搭建私有 DNS 服务器,搞定内网域名解析,轻松搞定各类域名解析疑难杂症。

cyw_lesson的博客 311

【Python基础】FastAPI 从入门到项目实战操作详解

【Python基础】FastAPI从入门到使用实战操作详解

congge_study的博客 437

Linux服务--3.DNS 服务

在/etc/named.conf文件的开头,可以使用acl指令定义地址匹配列表。acl指令不是用于控制客户端对服务器的访问,而是使用它们来定义IP地址和网络列表。把一组IP 地址 / 网段定义成一个名字(给 IP 段起别名,方便 DNS 权限控制),它们提供别名,可以与访问控制指令和其他配置选项一起使用,并使更新配置文件更加容易。后面在 named.conf 里可以直接用这个名字控制:谁能查询DNS谁能递归查询谁能同步区域数据。

fengkai4545的博客 465

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

linux中udev简单的用法

udev是linux提供的一种在用户态管理设备的一种机制,udev的详细使用方法可参考其他资料,这里推荐http://blog.youkuaiyun.com/fjb2080/article/details/4876314,这里总结一下我在学习过程中对udev的简单应用: 我要实现的是在我的u盘插入时,利用udev实现自动挂载至指定目录,并且实现我想要的相关功能,我的系统是ubuntu14.04: 1.先插

9527的博客 1万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

systemd:源自红帽的系统初始化和服务管理套件

目录 概述 历史 设计 核心组件和库 辅助组件 systemd的配置 配置文件的层级结构 采纳情况 与其他软件的集成 接受情况 分支版本和替代实现 eudev elogind uselessd systembsd consolekit2 loginkit notsystemd s6 概述 systemd是一个软件套件,它为Linux操作系统提供一系列系统组件。 它的主要目的是将所有Linux发行版的服务配置和行为统一起来。systemd的主要组件是一个“系统和服务

rex_xia的专栏 1841

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Spring AI + GPT-5.5 + Ollama 配置教程:Base URL、超时与流式调用

由于不同 Spring AI、Spring Boot 小版本之间仍可能存在差异,创建项目时应检查 Spring Initializr、Spring AI BOM 和官方兼容矩阵,不要直接复制旧教程中的 Starter 名称和版本号。多人项目最好隔离不同客户端,并在脱敏前提下记录最终 URL、状态码、请求耗时、请求 ID 和模型 ID。Spring AI 接入模型 API,至少要同时确认 Starter、Base URL、请求路径、API Key、模型 ID、连接超时、读取超时和流式客户端这 8 项。

2601_95893075的博客 225

【JVM】对象内存布局

HotSpot JVM 中,Java 对象内存布局由对象头(12字节,含Mark Word与压缩Klass Pointer)、实例数据及对齐填充构成,总大小为8字节倍数。对象头支持锁状态动态复用,指针压缩使引用仅4字节,但堆超32GB时失效。实例字段按类型优先级重排序以减少间隙,最小对象大小为16字节。通过JOL工具可精准验证布局,理解锁机制、GC、伪共享等底层行为。

2301_79732484的博客 149

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 330

Spring Boot 数据源与 MyBatis(-Plus) 自定义配置详解

本文详解 Spring Boot 中单数据源环境下 HikariCP 与 MyBatis-Plus 的自定义配置。通过手动声明 SqlSessionFactory,实现下划线转驼峰、日志输出、一级缓存策略等精细化控制。结合 HikariCP 核心参数调优(如最大连接数、连接生命周期),确保高性能与稳定性。适用于仅需访问单一数据库的场景,避免多数据源复杂性,兼顾性能与可维护性。

BADAO_LIUMANG_QIZHI的博客 195

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 117

LeetCode Hot 100 二叉树专题(二)3 题(Java)

本篇文章共 3 题:543. 二叉树的直径、102. 二叉树的层序遍历、108. 将有序数组转换为二叉搜索树。 每道题都统一按「① 题目分析 & 解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结」的顺序组织;代码使用 Java 编写,节点定义沿用 LeetCode 默认的 TreeNode。

2401_88612756的博客 365

Decorator

TaskDecorator 是异步场景下"跨线程传递上下文"的标准方案,主要用于传递 MDC、用户信息、数据源路由等上下文数据,核心价值是让异步任务的日志链路不中断、业务上下文不丢失。TaskDecorator 是 Spring 提供的一个钩子接口,用于在异步任务执行前对 Runnable 进行包装,常用于跨线程传递上下文。如果你在项目中遇到具体的异步上下文传递问题,可以把代码贴出来,我帮你给出最合适的 Decorator 方案 👍。✅ 核心能力:在线程切换时,把"父线程的上下文"搬到"子线程"

wlwork66的博客 104

JDK 下载安装:装完 Java 提示「不是内部或外部命令」?环境变量没配

JDK 是写 Java 程序必须装的东西。它包含运行 Java 的虚拟机(JRE)和编译 Java 的编译器(javac)——装了它,能跑、.java文件能编译成可执行程序。免费,学习和小规模生产都不花钱。

科小怪的博客 626

数据库乐观锁深度解析:MySQL、PostgreSQL 实战 + Spring Boot 集成指南

Oracle 提供了ORA_ROWSCN伪列(System Change Number),记录最后修改行的 SCN,类似 PostgreSQL 的xmin。实践中通常仍使用 version 字段方案,逻辑与 MySQL 完全相同。-- Oracle:通过 ORA_ROWSCN 实现乐观锁-- 更新时比对 SCN// 自定义注解// AOP 切面@Aspect@Component@Slf4jtry {

yjc_1111的专栏 399

C++ 多态详解:作用、原理与实战用法

多态是C++面向对象的核心特性,通过虚函数实现运行期动态绑定,使同一接口在不同对象上表现出不同行为。其核心作用包括统一接口、提升可扩展性、降低耦合、支持运行时分派与批量处理。实现依赖虚函数表(vtable)和虚指针(vptr),需注意虚析构函数、对象切片等陷阱。相比编译期多态(模板),运行期多态灵活性高但有调用开销。合理结合两者,可兼顾代码的灵活性与性能,是构建可扩展、低耦合系统的关键。

2402_85743155的博客 377
上一篇: LWN: QEMU中的数据变动跟踪与差分备份!
下一篇: LWN: OpenWrt和自签名证书!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值