【转】Linux Udev 规则
2021/8/17 7:06:08
本文主要是介绍【转】Linux Udev 规则,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
转载自:https://blog.csdn.net/xiaoliu5396/article/details/46531893
看完本章,朋友们可以进行随心所欲的运用udev,编写udev规则,更好的管理Linux设备。例如,把硬盘sda根据盘的SN码生成一个软连接,使得SN码当做sda一样使用。
udev
udev 是 Linux2.6 内核里的一个功能,它替代了原来的 devfs,成为当前 Linux 默认的设备管理工具。udev 以守护进程的形式运行,通过侦听内核发出来的 uevent 来管理 /dev目录下的设备文件。不像之前的设备管理工具,udev 在用户空间 (user space) 运行,而不在内核空间 (kernel space) 运行。
devfs
linux下有专门的文件系统用来对设备进行管理,devfs和sysfs就是其中两种。在2.6内核以前一直使用的是devfs,devfs挂载于/dev目录下,提供了一种类似于文件的方法来管理位于/dev目录下的所有设备,我们知道/dev目录下的每一个文件都对应的是一个设备,至于当前该设备存在与否先且不论,而且这些特殊文件是位于根文件系统上的,在制作文件系统的时候我们就已经建立了这些设备文件,因此通过操作这些特殊文件,可以实现与内核进行交互。但是devfs文件系统有一些缺点,例如:不确定的设备映射,有时一个设备映射的设备文件可能不同,例如我的U盘可能对应sda有可能对应sdb;没有足够的主/辅设备号,当设备过多的时候,显然这会成为一个问题;/dev目录下文件太多而且不能表示当前系统上的实际设备;命名不够灵活,不能任意指定等等
sysfs
正因为上述这些问题的存在,在linux2.6内核以后,引入了一个新的文件系统sysfs,它挂载于/sys目录下,跟devfs一样它也是一个虚拟文件系统,也是用来对系统的设备进行管理的,它把实际连接到系统上的设备和总线组织成一个分级的文件,用户空间的程序同样可以利用这些信息以实现和内核的交互,该文件系统是当前系统上实际设备树的一个直观反应,它是通过kobject子系统来建立这个信息的,当一个kobject被创建的时候,对应的文件和目录也就被创建了,位于/sys下的相关目录下,既然每个设备在sysfs中都有唯一对应的目录,那么也就可以被用户空间读写了。用户空间的工具udev就是利用了sysfs提供的信息来实现所有devfs的功能的,但不同的是udev运行在用户空间中,而devfs却运行在内核空间,而且udev不存在devfs那些先天的缺陷。很显然,sysfs将是未来发展的方向。
udev工作流程图:
udev规则文件:
规则文件,在udev中至关重要,这些规则文件,默认是放在/etc/udev/rules.d/下,都是以 *.rules命名格式,例如10-dm.rules,60-persistent-storage.rules,执行规则文件,是根据开头的数字大小,同数字,根据字母顺序执行,且后面的规则文件会覆盖前面的规则;('NAME'动作除外,因为'NAME'只能操作一次,后续NAME操作无用,后面会描述。) 先举一个例子:
ACTION=="add", SUBSYSTEM=="net", DRIVERS=="?*", ATTR{type}=="1", PROGRAM="/lib/udev/rename_device", RESULT=="?*", NAME="$result"
该条例子,就是重命名网卡,在centos 7中,添加了这条网卡重命名的规则,把eth0,这种网卡名,通过程序rename_device进行修改名称,返回结果作为新名称。
编写udev规则文件:
匹配键和赋值键操作符解释:
- == 匹配 相等比较
- != 匹配 不等比较
- = 赋值 分配一个特定的值给该键,他可以覆盖之前的赋值.
- += 赋值 追加特定的值给已经存在的键
- := 赋值 分配一个特定的值给该键,后面的规则不可能覆盖它.
udev规则匹配表:
ACTION | 事件 (uevent) 的行为,例如:add( 添加设备 )、remove( 删除设备 ). |
KERNEL | 在内核里看到的设备名字,比如sd*表示任意SCSI磁盘设备 |
DEVPATH | 内核设备录进,比如/devices/* |
SUBSYSTEM | 子系统名字,例如:sda 的子系统为 block. |
BUS | 总线的名字,比如IDE,USB |
DRIVER | 设备驱动的名字,比如ide-cdrom |
ID | 独立于内核名字的设备名字 |
SYSFS{ value} | sysfs属性值,他可以表示任意 |
ENV{ key} | 环境变量,可以表示任意 |
PROGRAM | 可执行的外部程序,如果程序返回0值,该键则认为为真(true) |
RESULT | 上一个PROGRAM调用返回的标准输出. |
NAME | 根据这个规则创建的设备文件的文件名. (注意:仅仅第一行的NAME描述是有效的,后面的均忽略.如果你想使用使用两个以上的名字来访问一个设备的话,可以考虑SYMLINK键.) |
SYMLINK | /dev/下的设备文件产生符号链接.由于 udev 只能为某个设备产生一个设备文件, (所以为了不覆盖系统默认的 udev 规则所产生的文件,推荐使用符号链接.) |
OWNER | 设备文件的属组 |
GROUP | 设备文件所在的组. |
MODE | 设备文件的权限,采用8进制 |
RUN | 为设备而执行的程序列表 |
LABEL | 在配置文件里为内部控制而采用的名字标签(下下面的GOTO服务) |
GOTO | 跳到匹配的规则(通过LABEL来标识),有点类似程序语言中的GOTO |
IMPORT{ type} | 导入一个文件或者一个程序执行后而生成的规则集到当前文件 |
WAIT_FOR_SYSFS | 等待一个特定的设备文件的创建.主要是用作时序和依赖问题. |
OPTIONS | last_rule 对这类设备终端规则执行; ignore_device 忽略当前规则; ignore_remove 忽略接下来的并移走请求. all_partitions 为所有的磁盘分区创建设备文件. |
udev一些特殊的值和替换值:
获取KERNEL等一些基本信息:
[root/]#udevadm info -a -p /sys/block/sdb
获取USB信息:
lsusb sudo apt install hwinfo hwinfo --usb
注意事项:
1、规则文件的结尾,要有回车符,不然会报错(查看是否有回车符,cat -A xxx 或者 od -cb xxx)
2、启动顺序
在zfs导入池中,一直发现,导入硬盘失败(而建raid的盘是用的syslink生成的SN码的盘);查看问题发现:
添加的规则文件,并没有放在最小内核里进行生成,导致了导入的时候,最小内核里没有规则文件,并没有生成连接,当然失败。
查看文件:
lsinitrd -f usr/lib/udev/rules.d/60-persistent-storage.rules
果然里面并没有添加的规则文件!
修改方法:
dracut --fstab
这篇关于【转】Linux Udev 规则的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-12如何创建可引导的 ESXi USB 安装介质 (macOS, Linux, Windows)
- 2024-11-08linux的 vi编辑器中搜索关键字有哪些常用的命令和技巧?-icode9专业技术文章分享
- 2024-11-08在 Linux 的 vi 或 vim 编辑器中什么命令可以直接跳到文件的结尾?-icode9专业技术文章分享
- 2024-10-22原生鸿蒙操作系统HarmonyOS NEXT(HarmonyOS 5)正式发布
- 2024-10-18操作系统入门教程:新手必看的基本操作指南
- 2024-10-18初学者必看:操作系统入门全攻略
- 2024-10-17操作系统入门教程:轻松掌握操作系统基础知识
- 2024-09-11Linux部署Scrapy学习:入门级指南
- 2024-09-11Linux部署Scrapy:入门级指南
- 2024-08-21【Linux】分区向左扩容的方法