searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

udev入门(一)——规则介绍

2024-06-04 09:07:03
31
0

udev 是 Linux 系统中用于管理设备文件的工具。udev 以守护进程的形式运行,通过监听内核发出来的 uevent 来管理/dev 目录下的设备文件。

udev在用户空间运行,而不在内核空间 运行。它能够根据系统中的硬 件设备的状态动态更新设备文件,包括设备文件的创建,删除等。设备文件通常放在/dev目录下。 使用udev后,在/dev目录下就只包含系统中真正存在的设备。

设备接入时会发送一个事件到udev,udev接收到事件后会从/sys/class/xxx获取设备信息,在/dev/xxx生成设备节点。

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

如下图,就是一条简单的udev规则,==表示匹配条件,=表示赋值,简单翻译这条规则就是:ACTION=="add"(匹配设备添加动作),SUBSYSTEM==“net”(匹配网卡设备),DRIVERS=="?*"(驱动任意类型),ATTR{type}=="32"(type属性的值为32),ATTR{address}(网卡MAC地址是xx:xx:xx:xx:xx),最后将此设备的名字更改为“mlx4_ib3”

ACTION=="add", SUBSYSTEM=="net", DRIVERS=="?*", ATTR{type}=="32", ATTR{address}=="?*00:02:c9:03:031:78:f2", NAME="mlx4_ib3"

通过以下命令可以获取udev设备信息:

udevadm info -a -n /dev/xxx
udevadm test /dev/xxx

例如:

udevadm info -a /sys/class/net/eth11 

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:81/0000:81:02.0/0000:82:00.0/0000:83:08.0/0000:8c:00.0/virtio8/net/eth11':
    KERNEL=="eth11"
    SUBSYSTEM=="net"
    DRIVER==""
    ATTR{mtu}=="1500"
    ATTR{type}=="1"
    ATTR{netdev_group}=="0"
    ATTR{flags}=="0x1003"
    ATTR{dormant}=="0"
    ATTR{proto_down}=="0"
    ATTR{addr_assign_type}=="0"
    ATTR{dev_id}=="0x0"
    ATTR{gro_flush_timeout}=="0"
    ATTR{iflink}=="13"
    ATTR{addr_len}=="6"
    ATTR{address}=="fa:16:3e:8e:ef:7c"
    ATTR{operstate}=="up"
    ATTR{carrier_changes}=="2"
    ATTR{broadcast}=="ff:ff:ff:ff:ff:ff"
    ATTR{tx_queue_len}=="1000"
    ATTR{dev_port}=="0"
    ATTR{ifalias}==""
    ATTR{ifindex}=="13"
    ATTR{link_mode}=="0"
    ATTR{carrier}=="1"

  looking at parent device '/devices/pci0000:81/0000:81:02.0/0000:82:00.0/0000:83:08.0/0000:8c:00.0/virtio8':
    KERNELS=="virtio8"
    SUBSYSTEMS=="virtio"
    DRIVERS=="virtio_net"
    ATTRS{device}=="0x0001"
    ATTRS{features}=="0001010000000000111000100000000011000000000000000000000000000000"
    ATTRS{status}=="0x0000000f"
    ATTRS{vendor}=="0x1af4"

  looking at parent device '/devices/pci0000:81/0000:81:02.0/0000:82:00.0/0000:83:08.0/0000:8c:00.0':
    KERNELS=="0000:8c:00.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="virtio-pci"
    ATTRS{irq}=="0"
    ATTRS{subsystem_vendor}=="0x1af4"
    ATTRS{broken_parity_status}=="0"
    ATTRS{class}=="0x020000"
    ATTRS{driver_override}=="(null)"
    ATTRS{consistent_dma_mask_bits}=="xx"
    ATTRS{dma_mask_bits}=="xx"
    ATTRS{local_cpus}=="ffff,fff00000,00ffffff,f0000000"
    ATTRS{device}=="0x1041"
    ATTRS{enable}=="1"
    ATTRS{msi_bus}==""
    ATTRS{local_cpulist}=="28-55,84-111"
    ATTRS{vendor}=="0x1af4"
    ATTRS{subsystem_device}=="0x0001"
    ATTRS{numa_node}=="1"
    ATTRS{d3cold_allowed}=="1"

  looking at parent device '/devices/pci0000:81/0000:81:02.0/0000:82:00.0/0000:83:08.0':
    KERNELS=="0000:83:08.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="pcieport"
    ATTRS{irq}=="168"
    ATTRS{subsystem_vendor}=="0x0000"
    ATTRS{broken_parity_status}=="0"
    ATTRS{class}=="0x060400"
    ATTRS{driver_override}=="(null)"
    ATTRS{consistent_dma_mask_bits}=="32"
    ATTRS{dma_mask_bits}=="32"
    ATTRS{local_cpus}=="ffff,fff00000,00ffffff,f0000000"
    ATTRS{device}=="0x2020"
    ATTRS{enable}=="1"
    ATTRS{msi_bus}=="1"
    ATTRS{local_cpulist}=="28-55,84-111"
    ATTRS{vendor}=="0x15b3"
    ATTRS{subsystem_device}=="0x0000"
    ATTRS{numa_node}=="1"
    ATTRS{d3cold_allowed}=="1"

  looking at parent device '/devices/pci0000:81/0000:81:02.0/0000:82:00.0':
    KERNELS=="0000:82:00.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="pcieport"
    ATTRS{irq}=="0"
    ATTRS{subsystem_vendor}=="0x0000"
    ATTRS{broken_parity_status}=="0"
    ATTRS{class}=="0x060400"
    ATTRS{driver_override}=="(null)"
    ATTRS{consistent_dma_mask_bits}=="32"
    ATTRS{dma_mask_bits}=="32"
    ATTRS{local_cpus}=="ffff,fff00000,00ffffff,f0000000"
    ATTRS{device}=="0x2020"
    ATTRS{enable}=="1"
    ATTRS{msi_bus}=="1"
    ATTRS{local_cpulist}=="28-55,84-111"
    ATTRS{vendor}=="0x15b3"
    ATTRS{subsystem_device}=="0x0000"
    ATTRS{numa_node}=="1"
    ATTRS{d3cold_allowed}=="1"

  looking at parent device '/devices/pci0000:81/0000:81:02.0':
    KERNELS=="0000:81:02.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="pcieport"
    ATTRS{irq}=="159"
    ATTRS{subsystem_vendor}=="0x8086"
    ATTRS{broken_parity_status}=="0"
    ATTRS{class}=="0x060400"
    ATTRS{driver_override}=="(null)"
    ATTRS{consistent_dma_mask_bits}=="32"
    ATTRS{dma_mask_bits}=="32"
    ATTRS{local_cpus}=="ffff,fff00000,00ffffff,f0000000"
    ATTRS{device}=="0x347a"
    ATTRS{enable}=="1"
    ATTRS{msi_bus}=="1"
    ATTRS{local_cpulist}=="28-55,84-111"
    ATTRS{vendor}=="0x8086"
    ATTRS{subsystem_device}=="0x0000"
    ATTRS{numa_node}=="1"
    ATTRS{d3cold_allowed}=="1"

  looking at parent device '/devices/pci0000:81':
    KERNELS=="pci0000:81"
    SUBSYSTEMS==""
    DRIVERS==""

udev 规则由一系列键/值对组成,键/值对之间用逗号(,)分割。每一个键或者是用户匹配键,或者是一个赋值键。匹配键确定规则是否被应用,而赋值键表示分配某值给该键。这些值将影响 udev 创建的设备文件。

匹配键

匹配键用于确定规则是否被应用于特定设备。常用的匹配键包括:

ACTION:事件(uevent)的行为,例如:add(添加设备)、remove(删除设备)。
KERNEL:内核设备名称,例如:sda,cdrom。
DEVPATH:设备的 devpath 路径。
SUBSYSTEM:设备的子系统名称,例如:sda 的系统为 block。
SYMLINK:为/dev/ 下的设备文件产生符号链接。
OWNER:设备文件的所有者。
GROUP:设备文件的所属组。
MODE:设备文件的权限。

例如如果想匹配上述的网卡设备可以通过

ATTRS{subsystem_vendor}=="0x1af4", SUBSYSTEMS=="pci",....,
等属性去匹配
 

赋值键

赋值键用于设置设备文件的属性。常用的赋值键包括:

  • NAME:在/dev 下产生的设备文件名。
  • SYMLINK:为/dev/ 下的设备文件产生符号链接。
  • OWNER:设备文件的所有者。
  • GROUP:设备文件的所属组。
  • MODE:设备文件的权限。

对于匹配到的设备,可以尝试修改以上属性

例如修改网卡名字为eno11, 拥有者grid,组asmadmin,权限 660

NAME:="eno11", OWNER:="grid", GROUP:="asmadmin", MODE:="660"*
 
0条评论
0 / 1000
顾****涵
5文章数
0粉丝数
顾****涵
5 文章 | 0 粉丝
原创

udev入门(一)——规则介绍

2024-06-04 09:07:03
31
0

udev 是 Linux 系统中用于管理设备文件的工具。udev 以守护进程的形式运行,通过监听内核发出来的 uevent 来管理/dev 目录下的设备文件。

udev在用户空间运行,而不在内核空间 运行。它能够根据系统中的硬 件设备的状态动态更新设备文件,包括设备文件的创建,删除等。设备文件通常放在/dev目录下。 使用udev后,在/dev目录下就只包含系统中真正存在的设备。

设备接入时会发送一个事件到udev,udev接收到事件后会从/sys/class/xxx获取设备信息,在/dev/xxx生成设备节点。

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

如下图,就是一条简单的udev规则,==表示匹配条件,=表示赋值,简单翻译这条规则就是:ACTION=="add"(匹配设备添加动作),SUBSYSTEM==“net”(匹配网卡设备),DRIVERS=="?*"(驱动任意类型),ATTR{type}=="32"(type属性的值为32),ATTR{address}(网卡MAC地址是xx:xx:xx:xx:xx),最后将此设备的名字更改为“mlx4_ib3”

ACTION=="add", SUBSYSTEM=="net", DRIVERS=="?*", ATTR{type}=="32", ATTR{address}=="?*00:02:c9:03:031:78:f2", NAME="mlx4_ib3"

通过以下命令可以获取udev设备信息:

udevadm info -a -n /dev/xxx
udevadm test /dev/xxx

例如:

udevadm info -a /sys/class/net/eth11 

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:81/0000:81:02.0/0000:82:00.0/0000:83:08.0/0000:8c:00.0/virtio8/net/eth11':
    KERNEL=="eth11"
    SUBSYSTEM=="net"
    DRIVER==""
    ATTR{mtu}=="1500"
    ATTR{type}=="1"
    ATTR{netdev_group}=="0"
    ATTR{flags}=="0x1003"
    ATTR{dormant}=="0"
    ATTR{proto_down}=="0"
    ATTR{addr_assign_type}=="0"
    ATTR{dev_id}=="0x0"
    ATTR{gro_flush_timeout}=="0"
    ATTR{iflink}=="13"
    ATTR{addr_len}=="6"
    ATTR{address}=="fa:16:3e:8e:ef:7c"
    ATTR{operstate}=="up"
    ATTR{carrier_changes}=="2"
    ATTR{broadcast}=="ff:ff:ff:ff:ff:ff"
    ATTR{tx_queue_len}=="1000"
    ATTR{dev_port}=="0"
    ATTR{ifalias}==""
    ATTR{ifindex}=="13"
    ATTR{link_mode}=="0"
    ATTR{carrier}=="1"

  looking at parent device '/devices/pci0000:81/0000:81:02.0/0000:82:00.0/0000:83:08.0/0000:8c:00.0/virtio8':
    KERNELS=="virtio8"
    SUBSYSTEMS=="virtio"
    DRIVERS=="virtio_net"
    ATTRS{device}=="0x0001"
    ATTRS{features}=="0001010000000000111000100000000011000000000000000000000000000000"
    ATTRS{status}=="0x0000000f"
    ATTRS{vendor}=="0x1af4"

  looking at parent device '/devices/pci0000:81/0000:81:02.0/0000:82:00.0/0000:83:08.0/0000:8c:00.0':
    KERNELS=="0000:8c:00.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="virtio-pci"
    ATTRS{irq}=="0"
    ATTRS{subsystem_vendor}=="0x1af4"
    ATTRS{broken_parity_status}=="0"
    ATTRS{class}=="0x020000"
    ATTRS{driver_override}=="(null)"
    ATTRS{consistent_dma_mask_bits}=="xx"
    ATTRS{dma_mask_bits}=="xx"
    ATTRS{local_cpus}=="ffff,fff00000,00ffffff,f0000000"
    ATTRS{device}=="0x1041"
    ATTRS{enable}=="1"
    ATTRS{msi_bus}==""
    ATTRS{local_cpulist}=="28-55,84-111"
    ATTRS{vendor}=="0x1af4"
    ATTRS{subsystem_device}=="0x0001"
    ATTRS{numa_node}=="1"
    ATTRS{d3cold_allowed}=="1"

  looking at parent device '/devices/pci0000:81/0000:81:02.0/0000:82:00.0/0000:83:08.0':
    KERNELS=="0000:83:08.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="pcieport"
    ATTRS{irq}=="168"
    ATTRS{subsystem_vendor}=="0x0000"
    ATTRS{broken_parity_status}=="0"
    ATTRS{class}=="0x060400"
    ATTRS{driver_override}=="(null)"
    ATTRS{consistent_dma_mask_bits}=="32"
    ATTRS{dma_mask_bits}=="32"
    ATTRS{local_cpus}=="ffff,fff00000,00ffffff,f0000000"
    ATTRS{device}=="0x2020"
    ATTRS{enable}=="1"
    ATTRS{msi_bus}=="1"
    ATTRS{local_cpulist}=="28-55,84-111"
    ATTRS{vendor}=="0x15b3"
    ATTRS{subsystem_device}=="0x0000"
    ATTRS{numa_node}=="1"
    ATTRS{d3cold_allowed}=="1"

  looking at parent device '/devices/pci0000:81/0000:81:02.0/0000:82:00.0':
    KERNELS=="0000:82:00.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="pcieport"
    ATTRS{irq}=="0"
    ATTRS{subsystem_vendor}=="0x0000"
    ATTRS{broken_parity_status}=="0"
    ATTRS{class}=="0x060400"
    ATTRS{driver_override}=="(null)"
    ATTRS{consistent_dma_mask_bits}=="32"
    ATTRS{dma_mask_bits}=="32"
    ATTRS{local_cpus}=="ffff,fff00000,00ffffff,f0000000"
    ATTRS{device}=="0x2020"
    ATTRS{enable}=="1"
    ATTRS{msi_bus}=="1"
    ATTRS{local_cpulist}=="28-55,84-111"
    ATTRS{vendor}=="0x15b3"
    ATTRS{subsystem_device}=="0x0000"
    ATTRS{numa_node}=="1"
    ATTRS{d3cold_allowed}=="1"

  looking at parent device '/devices/pci0000:81/0000:81:02.0':
    KERNELS=="0000:81:02.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="pcieport"
    ATTRS{irq}=="159"
    ATTRS{subsystem_vendor}=="0x8086"
    ATTRS{broken_parity_status}=="0"
    ATTRS{class}=="0x060400"
    ATTRS{driver_override}=="(null)"
    ATTRS{consistent_dma_mask_bits}=="32"
    ATTRS{dma_mask_bits}=="32"
    ATTRS{local_cpus}=="ffff,fff00000,00ffffff,f0000000"
    ATTRS{device}=="0x347a"
    ATTRS{enable}=="1"
    ATTRS{msi_bus}=="1"
    ATTRS{local_cpulist}=="28-55,84-111"
    ATTRS{vendor}=="0x8086"
    ATTRS{subsystem_device}=="0x0000"
    ATTRS{numa_node}=="1"
    ATTRS{d3cold_allowed}=="1"

  looking at parent device '/devices/pci0000:81':
    KERNELS=="pci0000:81"
    SUBSYSTEMS==""
    DRIVERS==""

udev 规则由一系列键/值对组成,键/值对之间用逗号(,)分割。每一个键或者是用户匹配键,或者是一个赋值键。匹配键确定规则是否被应用,而赋值键表示分配某值给该键。这些值将影响 udev 创建的设备文件。

匹配键

匹配键用于确定规则是否被应用于特定设备。常用的匹配键包括:

ACTION:事件(uevent)的行为,例如:add(添加设备)、remove(删除设备)。
KERNEL:内核设备名称,例如:sda,cdrom。
DEVPATH:设备的 devpath 路径。
SUBSYSTEM:设备的子系统名称,例如:sda 的系统为 block。
SYMLINK:为/dev/ 下的设备文件产生符号链接。
OWNER:设备文件的所有者。
GROUP:设备文件的所属组。
MODE:设备文件的权限。

例如如果想匹配上述的网卡设备可以通过

ATTRS{subsystem_vendor}=="0x1af4", SUBSYSTEMS=="pci",....,
等属性去匹配
 

赋值键

赋值键用于设置设备文件的属性。常用的赋值键包括:

  • NAME:在/dev 下产生的设备文件名。
  • SYMLINK:为/dev/ 下的设备文件产生符号链接。
  • OWNER:设备文件的所有者。
  • GROUP:设备文件的所属组。
  • MODE:设备文件的权限。

对于匹配到的设备,可以尝试修改以上属性

例如修改网卡名字为eno11, 拥有者grid,组asmadmin,权限 660

NAME:="eno11", OWNER:="grid", GROUP:="asmadmin", MODE:="660"*
 
文章来自个人专栏
网卡驱动
2 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0