【转】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 规则的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程