理解 udev 配置系统 使用 systemd 的机器上,udev 操作由 systemd-udevd 守护进程管理,你可以通过常规的 systemd 方式使用 systemctl status systemd-udevd
理解 udev 配置系统 使用 systemd 的机器上,udev 操作由 systemd-udevd 守护进程管理,你可以通过常规的 systemd 方式使用 systemctl status systemd-udevd
[413]: renamed network interface eth1 to enp1s0f1Mar 7 03:05:19 localhost systemd-udevd[416]: renamed 7 03:05:19 localhost systemd-udevd[411]: renamed network interface eth0 to enp1s0f0Mar 7 03:05:19 localhost systemd-udevd[419]: renamed network interface eth2 to enp8s0f0Mar 7 03:05:25 localhost systemd-udevd [412]: renamed network interface eth1 to enp3s0f1Mar 7 03:05:25 localhost systemd-udevd[414]: renamed localhost systemd-udevd[416]: renamed network interface eth5 to enp134s0f1Mar 7 03:05:30 localhost
pstree │ └─sshd───bash ├─systemd-journal ├─systemd-logind ├─systemd-udevd ─bash(5548) ├─systemd-journal(484) ├─systemd-logind(635) ├─systemd-udevd └─pstree -a │ └─sshd │ └─bash ├─systemd-journal ├─systemd-logind ├─systemd-udevd NetworkManager}(656) |-systemd-journal(484) |-systemd-logind(635) |-systemd-udevd
为了创建设备文件,udevd不能依赖于它应该创建的任何设备,并且它需要非常快速地进行初始启动,以便系统的其余部分不会因为等待udevd启动而被阻塞。 内核根据需要创建设备文件,但同时也通知udevd有新设备可用。 在接收到此信号后,udevd不会创建设备文件,但会执行设备初始化和进程通知。 但是,udevd如何知道要创建哪些符号链接,以及它如何创建它们?下一节将介绍udevd的工作原理。 但是,您不需要了解这一点就可以继续阅读本书。 3.5.2 udevd Operation and Configuration(udevd操作和配置) The udevd daemon operates as follows: udev守护进程的操作如下 : The kernel sends udevd a notification event, called a uevent, through an internal network link. udevd
00:00:00 /usr/lib/systemd/systemd-udevd # 已经集成到systemd中了 $ systemctl status udev.service ● systemd-udevd.service ● systemd-udevd-control.socket Docs: man:systemd-udevd.service(8) man systemd-udevd. systemd-udevd-kernel.socket systemd-udevd.service -l, --log-priority=value Set the internal log level of systemd-udevd.
──7*[{nscd}] ├─ntpd ├─rsyslogd───3*[{rsyslogd}] ├─sshd───sshd───bash───pstree └─udevd ───2*[udevd] bash的快捷键 Ctrl+a: 跳至命令行首 Ctrl+e: 尾 Ctrl+u: 删除命令行首至当前光标所在处的内容 Ctrl
设备的相关驱动等,/sbin/modinfo 配合/sbin/insmod,驱动放到/module [wvl3g0bbka.png] Step3:完成拥有管理设备能力(udev) 利用管理、监控主机设备的服务程序udevd udevd的规则文件在/lib/udev/目录下,配置文件在/etc/udev/目录下,同时还需要/etc/nsswitch.conf配置的名称服务交换,其依赖的库为/lib目录下以libnss开头的文件 ,将上述文件拷贝到我们的目录下,然后使用/sbin/start\_udev命令可以启动udevd服务。 (udevd需要调用一些其他的系统命令,如/sbin/modprobe,可用strace进行跟踪获取)。 /sbin/init的过程大致分为三块:第一块是udevd加载驱动模块、文件系统检查和根切换,相关配置在/etc/rc.sysinit中;第二块是启动各项服务,相关配置在/etc/rc.d/目录下;第三块是登录部分
(buffered) execsnoop grep # trace process names containing grep execsnoop 'udevd $' # process names ending in "udevd" 比如我们要抓取谁访问了 mysql [root@tidb00 ~]# execsnoop mysql ##
先通过一张图来总览其核心架构与工作流程: 一、通信兵与调度中心 —— udevd 守护进程 udevd 是 udev 系统的心脏和大脑,它是一个常年运行在后台的守护进程(Daemon)。 接收消息:udevd 守护进程就是这条广播的忠实听众。它通过一个叫做 netlink 的套接字(Socket)机制,7x24小时不间断地接收来自内核的所有 uevent 消息。 事件调度:收到消息后,udevd 并不会立即自己动手处理。 二、行为准则与自动化脚本 —— udev 规则库 如果 udevd 是大脑和心脏,那么 udev 规则(Rules) 就是它赖以思考和行动的“行为准则”和“剧本”。 udevd 守护进程监听到广播,将事件加入队列,并分配给一个工作线程。 工作线程化身“侦探”,去 sysfs 中查看这个新设备的所有属性(厂商、产品ID、序列号等)。
在systemd-udevd和kernel的共同配合下,会加载bcache.ko,被启动bcache内核线程。 systemd-udevd没有二外的启动参数,看起来不能配置。 在kernel中加一些log(如图,大括号里面是新增加的debug代码),最终,确定是systemd-udevd加载了ramdisk中的bcache.ko。
systemd-initctl.socket ● │ ├─systemd-journald.socket ● │ ├─systemd-shutdownd.socket ● │ ├─systemd-udevd-control.socket ● │ └─systemd-udevd-kernel.socket [root@h103 ~]# [root@h103 ~]# cat /usr/lib/systemd/system/docker.service
─┘ 特点:事件驱动、同步执行、配置简单 udev:桌面系统的"自动化管家" ┌─────────────────────────────────────────────┐ │ 内核uevent → udevd ───────────────────────────────────┘ 特点:守护进程、异步处理、功能丰富 详细对比表格 对比维度 mdev udev 架构模式 直接执行(无守护进程) 守护进程(udevd 服务器系统 ✅ 需要持久化设备命名 ✅ 复杂的热插拔处理 ✅ 与systemd深度集成 ✅ 需要高级权限管理 ✅ 多用户环境 现代发展趋势 eudev: udev的非systemd分支 systemd-udevd
└─bash───man───less ├─systemd-journal ├─systemd-logind ├─systemd-udevd └─man pstree │ └─less -s ├─systemd-journal ├─systemd-logind ├─systemd-udevd
内核目前采用udevd方式来管理用户层动态创建的设备文件。udevd就是一个守护进程。 如果系统启动期间发现新新磁盘设备,内核产生的可插拔消息包含了磁盘驱动给新磁盘分配的主从设备号,接着udevd监听这些消息,完成新磁盘的注册,完成以后会在/dev中创建对应的项,用户可以访问该磁盘设备了。 udevd机制中 ,/dev不在放到磁盘文件系统中,而是使用tmpfs,系统重启或者关机数据会自动消失,是基于内存的fs.
Another suspicious finding is that the systemd-udevd daemon is consuming CPU; about 20% on multiple CPUs Since systemd-udevd works with uevents, we have to use udevadm monitor to find out if there are any uevents /share/bcc/tools/trace blk_freeze_queue -K -U PID TID COMM FUNC 3809642 3809642 systemd-udevd after_hwframe+0x3d [kernel] __write_nocancel+0x7 [libc-2.23.so] [unknown] 3809631 3809631 systemd-udevd
2 / init 1 root txt REG 8,1 150584 654127 /sbin/init udevd 415 root 0u CHR 1,3 0t0 6254 /dev/null udevd 415 root 1u CHR 1,3 0t0 6254 /dev/null udevd 415 root 2u CHR 1,3 0t0 6254 /dev/null udevd 690 root mem
Journal Socket systemd-shutdownd.socket loaded active listening Delayed Shutdown Socket systemd-udevd-control.socket loaded active running udev Control Socket systemd-udevd-kernel.socket loaded active running
0.0 0.0 0:00.00 ext4-dio-unwrit 415 root 16 -4 2720 1008 364 S 0.0 0.1 0:01.14 udevd 0.0 0.0 0:32.91 vmmemctl 898 root 18 -2 2716 1000 360 S 0.0 0.1 0:00.00 udevd 0.0 0.0 0:00.00 mingetty 2139 root 18 -2 2716 980 340 S 0.0 0.1 0:00.00 udevd 0.0 0.0 0:00.00 ext4-dio-unwrit 500 root 16 -4 10796 916 348 S 0.0 0.0 0:00.05 udevd 0.0 0.0 0:00.00 iw_cm_wq 911 root 18 -2 10792 892 328 S 0.0 0.0 0:00.00 udevd
S< 0:00 /sbin/udevd -d 1475 ? S< 0:00 /sbin/udevd -d 1492 ?