使用udev高效、动态的管理Linux设备文件
导读:
在Linux环境中,所有的设备都以文件的形式存在,在早期的Linux版本中,/dev目录包含了了所有可能出现的设备文件,很难想象Linux用户如何从大量的设备文件中找到想要的设备文件。举个例子,服务器上有sda、sdb、sdc、sdd四块磁盘,这些名字都是操作系统识别到磁盘后自动生成的,通过名字,我们并不知道每一块盘是做什么的,要是能够实现自定义命名,那就再好不过了,udev(动态设备管理)正是一款能够实现自定义命名的软件。

(一)udev介绍
udev是Linux2.6内核的一个功能,它替换原来的devfs,成为当前Linux默认的设备管理工具。udev以守护进程的形式运行,通过侦听内核发出来的uevent来管理/dev目录下的设备文件。udev的功能可以概括为:
- 动态管理:当设备插入、拔出、改变状态时,udev的守护进程侦听来自内核的uevent,以此添加或删除/dev下的设备文件,所以udev只为已经连接的设备产生设备文件,而不会在/dev下产生大量虚无的设备文件;
- 自定义命名规则:内核通常仅根据设备被发现的先后顺序给设备文件命名,因此很难在设备文件与物理硬件之间建立稳定的对应关系,而udev根据设备的物理属性或配置特性创建有意义的符号链接名称,就可以在物理设备和设备文件名之间建立稳定且有意义的对应关系。举个例子,同一块物理磁盘,第一次启动时磁盘名称为sdc,下一次启动后就变为了sdd,这是完全有可能的,因为磁盘命名完全取决于设备被发现的先后顺序,如果我们通过udev根据磁盘scsi id号,将磁盘重新命名为datadisk,则不论你如何重启,datadisk都与物理磁盘是对应的。
- 设定设备的权限和所有组

图. udev工作流程图
NOTE:udev守护进程
[root@testserver sdb]# ps -ef|grep udev
root 554 1 0 09:15 ? 00:00:01 /usr/lib/systemd/systemd-udevd
(二)udev规则文件
本章节适用环境:centos7
udev规则文件分别位于系统规则目录(/usr/lib/udev/rules.d)、运行时规则目录(/run/udev/rules.d)、本机规则目录(/etc/udev/rules.d)。所有规则文件(无论位于哪个目录中),同一按照文件名的字典顺序处理。对于不同目录下的同名文件,仅以优先级最高的哪一个为准,具体来说就是:/etc的优先级最高,/run的优先级居中,/usr的优先级最低。规则文件以.rules作为后缀名,否则将被忽略。
在规则文件里,除了以“#开头的行(注释),所有的非空行都被视为一条规则,规则都是由多个键值对组成,并由逗号分隔开,键值对可以分为条件匹配键值对(匹配键)和赋值键值对(赋值键),一条规则可以有多条匹配键和多条赋值键。如果某条规则的所有匹配键的值都匹配成功,那么就表示此条规则匹配成功,带来的结果就是所有赋值键都会被赋予指定的值。
例子1:一个简单的udev规则
KERNEL=="sda", NAME="my_root_disk", MODE="0660"
这条规则的意思是:如果存在一个名为sda的设备,则将其命名为my_root_disk,并把文件的权限设置为0660。
(2.1)规则操作符
每条规则都是由一系列逗号分隔的“键-值”对组成,“键-值”之间由操作符连接,根据操作的不同,可用的操作符如下:
"==" :(匹配)等于
"!=" :(匹配)不等于
"=" :(赋值)为键赋予指定的值。此键之前的值将被丢弃
"+=" :(赋值)在现有值列表中追加此处指定的值,追加
"-=" :(赋值)在现有值列表中删除此处指定的值
":=" :(赋值)为键赋予指定的值,并视为最终值,禁止被继续修改
(2.2)条件匹配键值对(常用)
ACTION :匹配事件的动作。例如“add”表示插入一个设备
KERNEL :匹配设备的内核名称。即设备的默认文件名,例如"sda"
ATTR{file} :匹配设备在sysfs中的属性值。例如对于/dev/sdb来说,ATTR{size}的含义就是/sys/block/sdb/size的值。
PROGRAM :执行外部命令
RESULT :匹配最近一次PROGRAM程序输出的字符串,必须位于PROGRAM之后。例如:PROGRAM=="/lib/udev/scsi_id -g -s $devpath", RESULT=="35000c50000a7ef67",代表调用命令"/lib/udev/scsi_id -g -s $devpath"查询设备的scsi id,如果为35000c50000a7ef67,则该设备匹配该匹配键。
在匹配的"值"中可以使用shell风格的匹配符:
"*" :匹配任意数量的字符(包括0个)
"?" :匹配1个字符
"[]" :匹配括号内的任意一个字符,例如sd[bc],可以匹配sdb或者sdc;也可以使用"-"代表一个区间,例如sda[1-4]可以sda1、sda2、sda3、sda4。左括号后跟着一个"!"代表匹配非括号内的字符
"|" :用于分隔2个可以互相替代的匹配模式。例如"a|b"匹配a或者b
(2.3)赋值键值对(常用)
NAME :设置网络接口的名称,实际上udev并不能直接修改设备的名称,他只能为设备节点创建额外的符号链接(相当于别名)
SYMLINK :设置指向此设备节点的软链接名称
OWNER,GROUP,MODE :设置设备节点的属主、属组、权限,会覆盖内置的默认值。
RUN{type} :对于每个设备事件来说,在处理完所有udev规则之后,都可以接着执行一个由此键设置的程序列表。
NAME,SYMLINK,PROGRAM,WONER,GROUP,MODE,RUN都接收简单的字符串替换。可替换的标记如下(常用):
$kernel,%k : 设备的内核名称
$number,%n : 设备在内核中的序号,例如,对于"sda3"来说,此值为3
$devnode,%N : 设备节点的名称
(三)udev在centos6/7下的配置
udev在redhat6/centos6和在redhat7/centos7下面的配置是不同的,这里对6和7分别进行配置。
(3.1)查看硬盘的scsi id
### redhat6/centos6
[root@source-node ~]# /sbin/scsi_id -g -u -d /dev/sdb
36000c298a7f98907e1172b026e94a044
# 或者是
[root@source-node ~]# scsi_id --whitelisted --replace-whitespace --device=/dev/sdb
36000c298a7f98907e1172b026e94a044 ### redhat7/centos7
[root@server1 ~]# /usr/lib/udev/scsi_id -g -u -d /dev/sdb
36000c29a40098c25f2972c185641cb7a
NOTE:VMware下scsi_id获取不到设备的wwid的解决办法:http://blog.sina.com.cn/s/blog_a3adb3220102xkq1.html
(3.2)使scsi设备可信
相关介绍:https://docs.oracle.com/en/database/oracle/oracle-database/12.2/ladbi/configuring-device-persistence-manually-for-oracle-asm.html#GUID-70D50812-CCB2-41E4-AA3B-4689E1DA934E
### 6和7操作相同
[root@server1 ~]# vim /etc/scsi_id.config
options=-g
(3.3)配置udev的rules文件
编辑文件 /etc/udev/rules.d/99-oracle-asmdevices.rules 。特别有意思的是:6和7中,磁盘命名方式不一样,centos6中是使用NAME进行重命名,centos7中是使用SYMLINK创建链接。
### redhat6/centos6
KERNEL=="sd*", BUS=="scsi", PROGRAM=="/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", RESULT=="36000c298a7f98907e1172b026e94a044", NAME="asm-diskb", OWNER="grid", GROUP="asmadmin", MODE="0660" ### redhat7/centos7
KERNEL=="sd*1", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/$parent", RESULT=="36000c29a40098c25f2972c185641cb7a", SYMLINK+="asm-ocrdisk1", OWNER="grid", GROUP="asmadmin", MODE="0660"
(3.4)重启动udev
### redhat6/centos6
[root@source-node ~]# start_udev
Starting udev: [ OK ] ### redhat7/centos7
# 首先进行测试
[root@server1 ~] /sbin/partprobe /dev/sdb1
[root@server1 ~] /sbin/udevadm test /block/sdb/sdb1
# 接着绑定命令
[root@server1 ~] /sbin/udevadm control --reload-rules
[root@server1 ~] /sbin/udevadm trigger
(3.5)查看udev设备是否生效
### redhat6/centos6
[root@source-node ~]# ll /dev/asm-diskb
brw-rw----. 1 grid asmadmin 8, 16 Oct 29 20:02 /dev/asm-diskb ### redhat7/centos7
# 特别注意,新创建的设备文件名权限是root:root,但是真正的磁盘文件权限已经改变了
[root@mysqlserver dev]# ll /dev/asm-ocrdisk1
lrwxrwxrwx. 1 root root 4 Oct 29 20:40 /dev/asm-ocrdisk1 -> sdb1
[root@mysqlserver dev]# ll /dev/sdb*
brw-rw----. 1 grid asmadmin 8, 16 Oct 29 20:40 /dev/sdb
brw-rw----. 1 grid asmadmin 8, 17 Oct 29 20:40 /dev/sdb1
参考
1.https://www.ibm.com/developerworks/cn/linux/l-cn-udev/index.html?ca=drs-cn-0304
2.http://www.jinbuguo.com/systemd/udev.html
3.https://mirrors.edge.kernel.org/pub/linux/utils/kernel/hotplug/udev/udev.html
使用udev高效、动态的管理Linux设备文件的更多相关文章
- (转载)使用 udev 高效、动态地管理 Linux 设备文件
概述: Linux 用户常常会很难鉴别同一类型的设备名,比如 eth0, eth1, sda, sdb 等等.通过观察这些设备的内核设备名称,用户通常能知道这些是什么类型的设备,但是不知道哪一个设备是 ...
- 嵌入式 使用udev高效、动态地管理Linux 设备文件
本文以通俗的方法阐述 udev 及相关术语的概念.udev 的配置文件和规则文件,然后以 Red Hat Enterprise Server 为平台演示一些管理设备文件和查询设备信息的实例.本文会使那 ...
- 【转】使用 udev 高效、动态地管理 Linux 设备文件
简介: 本文以通俗的方法阐述 udev 及相关术语的概念.udev 的配置文件和规则文件,然后以 Red Hat Enterprise Server 为平台演示一些管理设备文件和查询设备信息的实例.本 ...
- 使用 udev 高效、动态地管理 Linux 设备文件
本文转自:https://www.ibm.com/developerworks/cn/linux/l-cn-udev/index.html 概述: Linux 用户常常会很难鉴别同一类型的设备名,比如 ...
- 使用 udev 管理 Linux 设备文件
本文以通俗的方法阐述 udev 及相关术语的概念.udev 的配置文件和规则文件,然后以 Red Hat Enterprise Server 为平台演示一些管理设备文件和查询设备信息的实例.本文会使那 ...
- Linux设备文件自动生成
第一种是使用mknod手工创建:# mknod <devfilename> <devtype> <major> <minor> 第二种是自动创建设备节点 ...
- .net core中的高效动态内存管理方案
.net core在新增的System.Buffers中引入了一大堆高效内存管理的类,如span和memory.内存池.本文今天这里介绍一个高效动态内存访问方案. ReadOnlySequenceSe ...
- Linux磁盘管理之设备文件详解04
Linux一切接文件,除了普通文件和目录文件,还包括一些其它的特殊文件:块设备文件.字符设备文件.套接字文件.链接文件等.今天这里主要说一下常见的块设备文件和字符设备文件,这2类是最常见的设备文件类. ...
- Linux设备文件简介
转:http://www.360doc.com/content/11/0418/00/5087210_110410837.shtml 版权声明 本 文作者是一位自由软件爱好者,所以本文虽然不是软件,但 ...
随机推荐
- phpStudy8.1.0.1配置子域名多网站
版本 这里phpStudy版本为8.1.0.1: 步骤 假设域名为:domain.com:公网IP地址为:42.33.33.33 首先云解析中配置,添加子域名A记录直接指向你的公网IP: ep.dom ...
- zabbix关键字含义
Zabbix server :zabbix控制中心,收集数据,写入数据库都是他的工作 Zabbix Agent:部署在被监控服务器上的一个进程,负责和zabbix server 交互,执行命令. Ho ...
- CUMTCTF'2020 已做wp
三天的比赛终于结束了,不知道有没有睡10个小时,感觉像中了魔一样,但也很享受这种感觉,除了没有能和我一起琢磨题目朋友.. 就最终结果而言还是有一些可惜,明明号称擅长web和misc反而是得分比例最小的 ...
- (转载)Altium Designer 17 (AD17)
转载自:http://blog.csdn.net/qq_29350001/article/details/52199356 以前是使用DXP2004来画图的,后来转行.想来已经有一年半的时间没有画过了 ...
- 从四个问题透析Linux下C++编译&链接
摘要:编译&链接对C&C++程序员既熟悉又陌生,熟悉在于每份代码都要经历编译&链接过程,陌生在于大部分人并不会刻意关注编译&链接的原理.本文通过开发过程中碰到的四个典型 ...
- Spring 注解形式AOP
AOP 面向切面编程,通过预编译的方式,在运行期通过动态代理实现一种技术,AOP可实现业务与切面的逻辑分离,降低耦合度 一.注解形式的AOP Aspect:切面 Joinpoint:连接点,要拦截的方 ...
- unittest培训后总结记录
今天在给同学们上了自动化测试单元框架unittest之后,突发奇想,要总结下自己今天上的课程内容.于是有了下面的一幕: 首先,今天上课的目标是要学会关于unittest框架的基本使用及断言.批量执行. ...
- Python练习题 005:三个数字由大到小排序输出
[Python练习题 005]输入三个整数x,y,z,请把这三个数由小到大输出. ----------------------------------------------------------- ...
- EF Entity Framework Core DBContext中文文档
Add(Object) 以添加状态开始跟踪给定的实体和任何其他尚未被跟踪的可访问实体,以便在调用SaveChanges()时将它们插入数据库.使用State设置单个实体的状态. Add<TEnt ...
- 算法进阶 (LIS变形) 固定长度截取求最长不下降子序列【动态规划】【树状数组】
先学习下LIS最长上升子序列 看了大佬的文章OTZ:最长上升子序列 (LIS) 详解+例题模板 (全),其中包含普通O(n)算法*和以LIS长度及末尾元素成立数组的普通O(nlogn)算法,当然还 ...