udev简介与使用

发布时间 2024-01-02 15:01:51作者: 小yq

部分参考自:

https://www.cnblogs.com/fah936861121/p/6496608.html

什么是udev

udev是Linux(linux2.6内核之后)默认的设备管理工具。udev 以守护进程的形式运行,通过侦听内核发出来的 uevent 来管理 /dev目录下的设备文件
使用udev的好处:

1)动态管理:当设备添加 / 删除时,udev 的守护进程侦听来自内核的 uevent,以此添加或者删除 /dev下的设备文件,所以 udev 只为已经连接的设备产生设备文件,而不会在 /dev下产生大量虚无的设备文件。

2)自定义命名规则:通过 Linux 默认的规则文件,udev 在 /dev/ 里为所有的设备定义了内核设备名称,比如 /dev/sda、/dev/hda、/dev/fd等等。由于 udev 是在用户空间 (user space) 运行,Linux 用户可以通过自定义的规则文件,灵活地产生标识性强的设备文件名,比如 /dev/boot_disk、/dev/root_disk、/dev/color_printer等等。

3)设定设备的权限和所有者/ 组 :udev 可以按一定的条件来设置设备文件的权限和设备文件所有者 / 组

如何使用udev

规则文件 /etc/udev/rules.d

规则文件是 udev 里最重要的部分,默认是存放在 /etc/udev/rules.d/下。所有的规则文件必须以“.rules”为后缀名

### 比如说,这个腾讯云下面的,就是添加一个网卡
[oracle@txy rules.d]$ cat 70-persistent-net.rules 
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:f4:04:10", NAME="eth0"

### 绑定一块磁盘
vi /etc/udev/rules.d/99-oracle-asmdevices.rules

KERNEL=="sd?",SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/$name",RESULT=="36000c29ed7235ef77bbe5072ce96febb", SYMLINK+="asm-dggrid01",OWNER="grid", GROUP="asmadmin",MODE="0660"

udev的关键字

KERNEL: 内核设备名称,例如:sda, cdrom

ACTION: 事件 (uevent) 的行为,例如:add( 添加设备 )、remove( 删除设备 )

SUBSYSTEM: 设备的子系统名称,例如:sda 的子系统为 block。

PROGRAM 可执行的外部程序,如果程序返回0值,该键则认为为真(true)

RESULT: 外部命令 PROGRAM 的返回结果

PROGRAM== "/lib/udev/scsi_id -g -s $devpath", RESULT=="35000c50000a7ef67"

调用外部命令 /lib/udev/scsi_id查询设备的 SCSI ID,如果返回结果为 35000c50000a7ef67,则该设备匹配该 匹配键

以下为【赋值关键字】

SYMLINK:为 /dev/下的设备文件产生符号链接。由于 udev 只能为某个设备产生一个设备文件,所以为了不覆盖系统默认的 udev 规则所产生的文件,推荐使用符号链接。

## 比如说 SYMLINK+="asm-dggrid01",OWNER="grid", GROUP="asmadmin",MODE="0660"
[root@w1b ~]# ls -lsa /dev/asm*
0 lrwxrwxrwx. 1 root root 3 Feb 27 22:23 /dev/asm-dggrid01 -> sdc

OWNER, GROUP, MODE:为设备设定权限。

## 比如 sdc ,设了 SYMLINK+="asm-dggrid01",OWNER="grid", GROUP="asmadmin",MODE="0660"
[root@wmsdb ~]# ls -lsa /dev/sdc
0 brw-rw----. 1 grid asmadmin  8,  32 Feb 27 22:39 /dev/sdc

总结:

所以其实就是在 /dev/下面,创建了一个链接,然后会改了原来 /dev/sdc 的组成员和权限

Oracle ASM的udev绑盘方法

本机OS环境:oracle linux 7.6 x64

创建用户与组

如果有的话就不用再建了

/usr/sbin/groupadd -g 60001 oinstall
/usr/sbin/groupadd -g 60002 dba
/usr/sbin/groupadd -g 60003 oper
/usr/sbin/groupadd -g 60004 backupdba
/usr/sbin/groupadd -g 60005 dgdba
/usr/sbin/groupadd -g 60006 kmdba
/usr/sbin/groupadd -g 60007 asmdba
/usr/sbin/groupadd -g 60008 asmoper
/usr/sbin/groupadd -g 60009 asmadmin
/usr/sbin/useradd -u 61001 -g oinstall -G asmadmin,asmdba,dba,asmoper,oper grid
/usr/sbin/useradd -u 61002 -g oinstall -G dba,backupdba,dgdba,kmdba,asmadmin,asmdba,oper oracle

得到磁盘的uuid

## 使用一段小循环得到磁盘的uuid
for i in {c..z} a{a..c};
do 
echo "sd$i" "`/usr/lib/udev/scsi_id  --whitelisted --replace-whitespace --device=/dev/sd$i` "; 
done

## 例子:
[root@w1b ~]# for i in {c..z} a{a..c};
> do 
> echo "sd$i" "`/usr/lib/udev/scsi_id  --whitelisted --replace-whitespace --device=/dev/sd$i` "; 
> done
sdc 36000c29ed7235ef77bbe5072ce96febb 
sdd 36000c2961e79943ee268b4e5c6f08c11 
sde 36000c29a43ced0def592837d072d2586 

得到ruld脚本

## 使用一段小循环
for i in {c..z} a{a..c};
do  
echo "KERNEL==\"sd?\",SUBSYSTEM==\"block\", PROGRAM==\"/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/\$name\",RESULT==\"`/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/sd$i`\", SYMLINK+=\"asm-disk$i\",OWNER=\"grid\", GROUP=\"asmadmin\",MODE=\"0660\""
done

## 类似这样
[root@w1b ~]# for i in {c..z} a{a..c};
> do  
> echo "KERNEL==\"sd?\",SUBSYSTEM==\"block\", PROGRAM==\"/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/\$name\",RESULT==\"`/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/sd$i`\", SYMLINK+=\"asm-disk$i\",OWNER=\"grid\", GROUP=\"asmadmin\",MODE=\"0660\""
> done

KERNEL=="sd?",SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/$name",RESULT=="36000c29ed7235ef77bbe5072ce96febb", SYMLINK+="asm-diskc",OWNER="grid", GROUP="asmadmin",MODE="0660"
KERNEL=="sd?",SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/$name",RESULT=="36000c2961e79943ee268b4e5c6f08c11", SYMLINK+="asm-diskd",OWNER="grid", GROUP="asmadmin",MODE="0660"
KERNEL=="sd?",SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/$name",RESULT=="36000c29a43ced0def592837d072d2586", SYMLINK+="asm-diske",OWNER="grid", GROUP="asmadmin",MODE="0660"

编辑udev配置文件

上面的SYMLINK+="asm-diske",可以改一下,变成SYMLINK+="asm-dggrid01"之类的,变个别名

vi /etc/udev/rules.d/99-oracle-asmdevices.rules
## 注意:sdaa 类型需要使用sd??来映射
KERNEL=="sd?",SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/$name",RESULT=="36000c29ed7235ef77bbe5072ce96febb", SYMLINK+="asm-dggrid01",OWNER="grid", GROUP="asmadmin",MODE="0660"

重启udev,检查结果

## 这个是重启udev
/sbin/udevadm trigger --type=devices --action=change
## 重新加载规则
/sbin/udevadm control --reload-rules