暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Linux下udev的使用

ICTworker 2021-08-11
2569


    今日寄语:

                  凌晨四点,我看见海棠花未眠。





如果你使用Linux比较长时间了,那你就知道,在对待设备文件这块,Linux改变了几次策略。在Linux早期,设备文件仅仅是是一些带有适当的属性集的普通文件,它由mknod命令创建,文件存放在/dev目录下。后来,采用了devfs,一个基于内核的动态设备文件系统,他首次出现在2.3.46 内核中。Mandrake,Gentoo等Linux分发版本采用了这种方式。devfs创建的设备文件是动态的。但是devfs有一些严重的限制,从 2.6.13版本后移走了。目前取代他的便是文本要提到的udev--一个用户空间程序。


采用用户空间(user-space)工具来管理/dev/目录树,他和文件系统分开。知道如何改变缺省配置能让你之大如何定制自己的系统,比如创建设备字符连接,改变设备文件属组,权限等。


udev配置文件
主要的udev配置文件是/etc/udev/udev.conf。这个文件通常很短,他可能只是包含几行#开头的注释,然后有几行选项:


    udev_root="/dev/"
    udev_rules="/etc/udev/rules.d/"
    udev_log="err"


    上面的第二行非常重要,因为他表示udev规则存储的目录,这个目录存储的是以.rules结束的文件。每一个文件处理一系列规则来帮助udev分配名字给设备文件以保证能被内核识别。


    规则说明
    1、udev 规则的所有操作符

    “==”:  比较键、值,若等于,则该条件满足;
    “!=”:   比较键、值,若不等于,则该条件满足;
    “=”:    对一个键赋值;
    “+=”:  为一个表示多个条目的键赋值。
    “:=”:  对一个键赋值,并拒绝之后所有对该键的改动。目的是防止后面的规则文件对该键赋值。


    2、udev 规则的匹配键

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


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


    DEVPATH:设备的 devpath 路径。


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


    BUS: 设备在 devpath 里的总线名称,例如:usb。


    DRIVER:设备在 devpath 里的设备驱动名称,例如:ide-cdrom。


    ID:设备在 devpath 里的识别号。


    SYSFS{filename}:设备的 devpath 路径下,设备的属性文件“filename”里的内容。例如:SYSFS{model}==“ST936701SS”表示:如果设备的型号为 ST936701SS,则该设备匹配该 匹配键。
    在一条规则中,可以设定最多五条 SYSFS 的 匹配键。


    ENV{key}:环境变量。在一条规则中,可以设定最多五条环境变量的 匹配键。


    PROGRAM:调用外部命令。


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


    3、udev 的重要赋值键 

    NAME:在 dev下产生的设备文件名。只有第一次对某个设备的 NAME 的赋值行为生效,之后匹配的规则再对该设备的 NAME 赋值行为将被忽略。如果没有任何规则对设备的 NAME 赋值,udev 将使用内核设备名称来产生设备文件。


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


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


    ENV{key}:导入一个环境变量。


    4、udev 的值和可调用的替换操作符 

    Linux 用户可以随意地定制 udev 规则文件的值。例如:my_root_disk, my_printer。同时也可以引用下面的替换操作符:


    $kernel, %k:设备的内核设备名称,例如:sda、cdrom。


    $number, %n:设备的内核号码,例如:sda3 的内核号码是 3。


    $devpath, %p:设备的 devpath路径。


    $id, %b:设备在 devpath里的 ID 号。


    $sysfs{file}, %s{file}:设备的 sysfs里 file 的内容。其实就是设备的属性值。


    $env{key}, %E{key}:一个环境变量的值。


    $major, %M:设备的 major 号。


    $minor %m:设备的 minor 号。


    $result, %c:PROGRAM 返回的结果。


    $parent, %P:父设备的设备文件名。


    $root, %r:udev_root的值,默认是 dev/。


    $tempnode, %N:临时设备名。


    %%:符号 % 本身。


    $$:符号 $ 本身。


      [root@rac01 udev] cat 99-oracle-asmdevices.rules
      KERNEL=="sd*",ENV{DEVTYPE}=="disk",SUBSYSTEM=="block",PROGRAM=="/usr/lib/udev/scsi_id -g -u -d $devnode",RESULT=="1ATA_VBOX_HARDDISK_VB90ea2842-3d5cfe18", RUN+="/bin/sh -c 'mknod /dev/asmdiskb b  $major $minor; chown grid:asmadmin /dev/asmdiskb; chmod 0660 /dev/asmdiskb'"
      KERNEL=="sd*",ENV{DEVTYPE}=="disk",SUBSYSTEM=="block",PROGRAM=="/usr/lib/udev/scsi_id -g -u -d $devnode",RESULT=="1ATA_VBOX_HARDDISK_VB0c31ed82-ca3c7a2f", RUN+="/bin/sh -c 'mknod /dev/asmdiskc b  $major $minor; chown grid:asmadmin /dev/asmdiskc; chmod 0660 /dev/asmdiskc'"
      KERNEL=="sd*",ENV{DEVTYPE}=="disk",SUBSYSTEM=="block",PROGRAM=="/usr/lib/udev/scsi_id -g -u -d $devnode",RESULT=="1ATA_VBOX_HARDDISK_VBd2eba70f-9707444e", RUN+="/bin/sh -c 'mknod /dev/asmdiskd b  $major $minor; chown grid:asmadmin /dev/asmdiskd; chmod 0660 /dev/asmdiskd'"
      KERNEL=="sd*",ENV{DEVTYPE}=="disk",SUBSYSTEM=="block",PROGRAM=="/usr/lib/udev/scsi_id -g -u -d $devnode",RESULT=="1ATA_VBOX_HARDDISK_VB15946091-75f9c0f4", RUN+="/bin/sh -c 'mknod /dev/asmdiske b  $major $minor; chown grid:asmadmin /dev/asmdiske; chmod 0660 /dev/asmdiske'"


      配置完UDEV 后需要执行:

        start_udev

        来让配置生效。

        但在linux 7.x 中已经没有start_udev命令,在配置完UDEV 后,需要执行:

          [root@rac01 udev]# sbin/udevadm trigger --type=devices --action=change

          或者:

            [root@rac01 udev]#  sbin/udevadm control --reload


              [root@rac01 udev]# ll /dev/asm*
              lrwxrwxrwx 1 root root 4 Mar  6 06:46 /dev/asm-diskc -> sdc1
              lrwxrwxrwx 1 root root 4 Mar  6 06:46 /dev/asm-diskd -> sdd1
              lrwxrwxrwx 1 root root 4 Mar  6 06:46 /dev/asm-diske -> sde1
              lrwxrwxrwx 1 root root 4 Mar  6 06:46 /dev/asm-diskf -> sdf1


              问:什么是udev?
              答:udev是一种工具,它能够根据系统中的硬件设备的状态动态更新设备文件,包括设备文件的创建,删除等。设备文件通常放在/dev目录下。使用udev后,在/dev目录下就只包含系统中真正存在的设备。


              本期分享到这里就结束了,小伙伴们学会了么?继续学习请点击下方往期回顾!





                         


              linux基础之命令工具(一)                    


              Linux LVM磁盘管理技术                   


              华为存储运维小贴士                    





               

               

                                  

              长按识别二维码

                   等风也等你                             

                          

                 



              文章转载自ICTworker,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论