Linux的udev详解、安装和使用(dev下的设备每次开机的名称不固定怎么办?)
前言(问题与需求):
在传统的devfs
1:设备映射的不确定:一个设备多次加载设备的设备文件可能不同,比如一个hub有可能是ttyUSB0或ttyUSB2或ttyUSB3
2:devfs没有足够的主辅设备号,当设备过多的时候,会出现问题。(0-255)
解决方式:
使用udev来编写规则来固定设备的映射名称。这样可以防止设备名称变动了
udev简介:
首先udev是一个基于sysfs逻辑文件系统开发的一个应用程序,是devfs的替代品。
udev是一个用户空间的设备管理器,很确定在用户空间运行,主要用于Linux系统中动态管理设备节点和符号链接。
udev替代了传统的devfs和hotplug机制,成为当前Linux默认的设备管理工具。
官网的描述:/dev/目录和热插拔管理守护程序(可以管理usb,scsi,block等等子设备)
udev 为一守护程序,能够在/dev/目录下动态创建和移除设备节点,处理热插拔事件,在启动时载入驱动。
udev的基本功能
1:设备管理:udev负责在系统启动时创建设备节点,并在设备插入或移除时动态更新/dev目录下的设备文件。只有被内核检测到的设备才会为其创建设备节点,这些节点存储在内存中,不占用磁盘空间。
2:热插拔支持:udev支持热插拔设备,即在系统运行时插入或移除设备。它可以动态地更新设备节点,而无需重新启动系统。
3:规则系统:udev使用规则文件来定义在设备事件发生时要执行的操作。这些规则可以基于设备属性、类型和其他标识符来匹配,并允许用户执行自定义脚本、设置环境变量、创建符号链接等操作。
4:设备命名:udev为设备节点提供一个规范的命名机制,确保相同类型的设备在不同系统上都有相似的设备节点名称,便于用户和应用程序识别。
udev的历史背景
在Linux 2.4版本中,devfs被引入作为动态创建设备节点的方法,但由于维护问题最终被废弃。在2.6版本的内核中,sysfs被引入,udev作为其用户空间组件,负责管理/dev目录下的设备节点和符号链接。udev替代了devfs和hotplug,成为更高效和可靠的设备管理工具13。
udev的架构和组件
udev的主要组件包括udev守护进程(udevd),它监听内核的uevents并根据udev规则对设备事件进行处理。udev规则定义了设备事件发生时要执行的操作,这些规则可以包含匹配键(如DEVPATH)、动作(如add或remove)等
udev的安装:
大多数linux系统默认会安装udev
centos
sudo yum install systemd-udev
ubuntu
sudo apt update
sudo apt install udev
udev的使用:
一: 配置 udev 规则
udev 的规则存储在 /etc/udev/rules.d/ 目录下。你可以通过编辑或添加新的规则文件来定制设备行为。例如,创建一个新的规则文件:
sudo vim /etc/udev/rules.d/10-custom.rules
在文件中添加规则,例如为 USB 设备设置静态设备名称:
ACTION=="add", KERNELS=="1-5.6", SUBSYSTEMS=="usb", MODE="0666", SYMLINK+="THEUSB1", GROUP="sky_api"
SUBSYSTEM==“usb”:指定子系统为USB。
ACTION==“add”:指定设备添加时执行操作。
KERNELS==“1-5.6”:内核总线的设备地址。
SYMLINK+=“THEUSB1”:在/dev/ 目录下新建一个名为THEUSB1的设备
GROUP=“sky_api”:新建的设备属于 sky_api组。
MODE=“0666”:设置设备的权限为:0666
这行规则为具有内核总线的设备地址 USB 设备创建名为 THEUSB1的符号链接。
二:重载 udev 规则
修改完 udev 规则后,需要重新加载规则,以便 udev 读取并应用这些更改:
sudo udevadm control --reload-rules
sudo udevadm trigger
或者直接重启udev(这样可能会影响正在使用的设备,导致断开连接)
sudo systemctl restart udev.service
sudo systemctl restart systemd-udevd # 对于使用 systemd 的系统
测试规则:
插入一个符合规则的USB设备,检查是否在/dev目录下生成了名为THEUSB1的设备节点。
其它问题及使用技巧:
调试 udev
通过命令可查看udev的日志打印:
journalctl -xefu systemd-udevd
或
sudo systemctl status udev
可以使用 udevadm 来调试:
udevadm info --query=property --name=/dev/sda
这将显示 /dev/sda 的详细属性。
常见问题解决
设备节点未创建:确保你的 udev 规则正确无误,并且已经通过 udevadm trigger 触发了规则。
权限问题:确保 /etc/udev/rules.d/ 目录及其文件有适当的读写权限。通常,这些文件应该属于 root 用户和 root 组。
日志查看:查看 /var/log/messages 或使用 journalctl 来获取 udev 的日志信息,这有助于诊断问题。例如:
journalctl -xefu systemd-udevd
通过上述步骤,你应该能够有效地管理和配置系统中的 udev
sudo systemctl restart devfs # 对于较老的系统,使用 devfs 而不是 udevd
请注意,编写和测试udev规则可能需要一定的Linux内核和设备协议知识。如果你不熟悉这些概念,建议在进行更改之前先备份重要数据,并谨慎操作。
不同系统,同一个系统的不同版本,他们的语法可能不同。需要实事求是。
udev流程图:
除了以上内容,还需要了解udev的匹配规则及运行流程可以参考:
https://blog.51cto.com/u_16213565/10618584