使用udev高效、动态的管理Linux设备文件

导读:html

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

 


(一)udev介绍
udev是Linux2.6内核的一个功能,它替换原来的devfs,成为当前Linux默认的设备管理工具。udev以守护进程的形式运行,经过侦听内核发出来的uevent来管理/dev目录下的设备文件。udev的功能能够归纳为:mysql

  • 动态管理:当设备插入、拔出、改变状态时,udev的守护进程侦听来自内核的uevent,以此添加或删除/dev下的设备文件,因此udev只为已经链接的设备产生设备文件,而不会在/dev下产生大量虚无的设备文件;
  • 自定义命名规则:内核一般仅根据设备被发现的前后顺序给设备文件命名,所以很难在设备文件与物理硬件之间创建稳定的对应关系,而udev根据设备的物理属性或配置特性建立有意义的符号连接名称,就能够在物理设备和设备文件名之间创建稳定且有意义的对应关系。举个例子,同一块物理磁盘,第一次启动时磁盘名称为sdc,下一次启动后就变为了sdd,这是彻底有可能的,由于磁盘命名彻底取决于设备被发现的前后顺序,若是咱们经过udev根据磁盘scsi id号,将磁盘从新命名为datadisk,则不论你如何重启,datadisk都与物理磁盘是对应的。
  • 设定设备的权限和全部组

 

                        图. udev工做流程图linux

 NOTE:udev守护进程sql

[root@testserver sdb]# ps -ef|grep udev
root 554 1 0 09:15 ? 00:00:01 /usr/lib/systemd/systemd-udevd

 

(二)udev规则文件
本章节适用环境:centos7,redhat7,其它版本的Linux可能会存在一些差别
udev规则文件分别位于系统规则目录(/usr/lib/udev/rules.d)、运行时规则目录(/run/udev/rules.d)、本机规则目录(/etc/udev/rules.d)。全部规则文件(不管位于哪一个目录中),同一按照文件名的字典顺序处理。对于不一样目录下的同名文件,仅以优先级最高的哪个为准,具体来讲就是:/etc的优先级最高,/run的优先级居中,/usr的优先级最低。规则文件以.rules做为后缀名,不然将被忽略。
在规则文件里,除了以“#开头的行(注释),全部的非空行都被视为一条规则,规则都是由多个键值对组成,并由逗号分隔开,键值对能够分为条件匹配键值对(匹配键)和赋值键值对(赋值键),一条规则能够有多条匹配键和多条赋值键。若是某条规则的全部匹配键的值都匹配成功,那么就表示此条规则匹配成功,带来的结果就是全部赋值键都会被赋予指定的值。shell

例子1:一个简单的udev规则vim

KERNEL=="sda", NAME="my_root_disk", MODE="0660"

这条规则的意思是:若是存在一个名为sda的设备,则将其命名为my_root_disk,并把文件的权限设置为0660。centos

 

(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]能够sda一、sda二、sda三、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-03042.http://www.jinbuguo.com/systemd/udev.html3.https://mirrors.edge.kernel.org/pub/linux/utils/kernel/hotplug/udev/udev.html

相关文章
相关标签/搜索