UDEV 规则,“NAME”变量不起作用

UDEV 规则,“NAME”变量不起作用

我写了一个简单的 udev 规则来帮助我理解这个概念

#SUBSYSTEM=="block", ATTR{size}=="3913727", SYMLINK="AlphaUSB"
SUBSYSTEM=="block", ATTR{size}=="3913727", NAME="HelloUSB"

UDEV 规则的符号链接部分有效(已被注释掉),但 UDEV 规则的名称部分无效。我不确定我做错了什么?

我的第二部分问题是,创建符号链接后它应该做什么?我知道它指向设备文件,但那没什么用。我希望它指向挂载点,这样我就可以将其用作进入 USB 的快捷方式,有什么想法可以做到这一点吗?

答案1

您无法通过分配给NAMEudev 规则中的键来重命名设备节点。至少在 systemd udev 中不行。只能更改网络设备名称。摘自 udev 手册:

   NAME
       The name to use for a network interface. See
       systemd.link(5) for a higher-level mechanism
       for setting the interface name. The name of a
       device node cannot be changed by udev, only
       additional symlinks can be created.

设备的任何 udev 符号链接本身并不特殊。它只是指向设备节点的文件系统符号链接。但是,udev 符号链接规则的一个有用用法示例是,由于设备名称取决于内核发现设备的顺序,因此特定文件系统所在的设备名称是不可预测的。有时拇指驱动器可能获得设备名称/dev/sdf,有时又获得设备名称/dev/sdg。通常会安装 udev 规则来添加可预测的符号链接名称,就像在我的 Ubuntu 笔记本电脑上所做的那样,其中 /dev/disk/by-uuid/磁盘上文件系统的 uuid 是指向内核设备名称的符号链接。

至于你的最后一个问题,你不能让 udev 符号链接指向设备节点以外的任何东西,所以你不能让它指向挂载点:

   SYMLINK
       The name of a symlink targeting the node. Every
       matching rule adds this value to the list of
       symlinks to be created.

为了实现您想要做的事情,您可以为文件系统提供一个标签,并让您用来挂载文件系统的程序(udisks2?)在挂载点名称中使用该标签。

答案2

当同一台计算机上插入多个 USB 设备时,如何解决不知道 USB 设备名称的问题?最简单的方法是使用 /dev 文件夹中的设备名称。插入 USB 适配器后,它会自动为其生成一个串行名称,您可以在 /dev/serial/by-id 下找到它,如下所示

  /dev/serial/by-id/usb-US_Digital_USB__-__QSB_81658-if00-port0

QSB_81658 最终将成为该 USB 设备的唯一名称。

我尝试编写多余的开发规则,因为每个设备都有自己的常量名称(如上所示)。我还遇到了一些问题,例如当我应用开发规则时。

编写开发规则来为个人分配名称。众所周知,每个 QSB 适配器都有自己的序列号,您可以在黑色适配器的正面找到它。就我而言,我有两个 QSB0 适配器。一个的序列号为 81830,另一个的序列号为 81658。我将使用此属性 (ATTRS{serial}) 为这两个适配器分配名称。

首先,运行 udevadm 查看 USB 设备的详细信息

$ udevadm 信息-a-n /dev/ttyUSB0

  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 '':
      KERNEL=="ttyUSB0"
      SUBSYSTEM=="tty"
      DRIVER==""

    looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0/ttyUSB0':
      KERNELS=="ttyUSB0"
      SUBSYSTEMS=="usb-serial"
      DRIVERS=="ftdi_sio"
      ATTRS{latency_timer}=="16"
      ATTRS{port_number}=="0"

    looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-8/1-8:1.0':
      KERNELS=="1-8:1.0"
      SUBSYSTEMS=="usb"
      DRIVERS=="ftdi_sio"
      ATTRS{authorized}=="1"
      ATTRS{bAlternateSetting}==" 0"
      ATTRS{bInterfaceClass}=="ff"
      ATTRS{bInterfaceNumber}=="00"
      ATTRS{bInterfaceProtocol}=="ff"
      ATTRS{bInterfaceSubClass}=="ff"
      ATTRS{bNumEndpoints}=="02"
      ATTRS{interface}=="USB <-> QSB"
      ATTRS{supports_autosuspend}=="1"

    looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-8':
      KERNELS=="1-8"
      SUBSYSTEMS=="usb"
      DRIVERS=="usb"
      ATTRS{authorized}=="1"
      ATTRS{avoid_reset_quirk}=="0"
      ATTRS{bConfigurationValue}=="1"
      ATTRS{bDeviceClass}=="00"
      ATTRS{bDeviceProtocol}=="00"
      ATTRS{bDeviceSubClass}=="00"
      ATTRS{bMaxPacketSize0}=="8"
      ATTRS{bMaxPower}=="500mA"
      ATTRS{bNumConfigurations}=="1"
      ATTRS{bNumInterfaces}==" 1"
      ATTRS{bcdDevice}=="0600"
      ATTRS{bmAttributes}=="80"
      ATTRS{busnum}=="1"
      ATTRS{configuration}==""
      ATTRS{devnum}=="5"
      ATTRS{devpath}=="8"
      ATTRS{idProduct}=="6001"
      ATTRS{idVendor}=="0403"
      ATTRS{ltm_capable}=="no"
      ATTRS{manufacturer}=="US Digital"
      ATTRS{maxchild}=="0"
      ATTRS{product}=="USB <-> QSB"
      ATTRS{quirks}=="0x0"
      ATTRS{removable}=="unknown"
      ATTRS{serial}=="81830"
      ATTRS{speed}=="12"
      ATTRS{urbnum}=="72190"
      ATTRS{version}==" 2.00"

    looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1':
      KERNELS=="usb1"
      SUBSYSTEMS=="usb"
      DRIVERS=="usb"
      ATTRS{authorized}=="1"
      ATTRS{authorized_default}=="1"
      ATTRS{avoid_reset_quirk}=="0"
      ATTRS{bConfigurationValue}=="1"
      ATTRS{bDeviceClass}=="09"
      ATTRS{bDeviceProtocol}=="01"
      ATTRS{bDeviceSubClass}=="00"
      ATTRS{bMaxPacketSize0}=="64"
      ATTRS{bMaxPower}=="0mA"
      ATTRS{bNumConfigurations}=="1"
      ATTRS{bNumInterfaces}==" 1"
      ATTRS{bcdDevice}=="0404"
      ATTRS{bmAttributes}=="e0"
      ATTRS{busnum}=="1"
      ATTRS{configuration}==""
      ATTRS{devnum}=="1"
      ATTRS{devpath}=="0"
      ATTRS{idProduct}=="0002"
      ATTRS{idVendor}=="1d6b"
      ATTRS{interface_authorized_default}=="1"
      ATTRS{ltm_capable}=="no"
      ATTRS{manufacturer}=="Linux 4.4.0-128-generic xhci-hcd"
      ATTRS{maxchild}=="16"
      ATTRS{product}=="xHCI Host Controller"
      ATTRS{quirks}=="0x0"
      ATTRS{removable}=="unknown"
      ATTRS{serial}=="0000:00:14.0"
      ATTRS{speed}=="480"
      ATTRS{urbnum}=="129"
      ATTRS{version}==" 2.00"

    looking at parent device '/devices/pci0000:00/0000:00:14.0':
      KERNELS=="0000:00:14.0"
      SUBSYSTEMS=="pci"
      DRIVERS=="xhci_hcd"
      ATTRS{broken_parity_status}=="0"
      ATTRS{class}=="0x0c0330"
      ATTRS{consistent_dma_mask_bits}=="64"
      ATTRS{d3cold_allowed}=="1"
      ATTRS{device}=="0xa12f"
      ATTRS{dma_mask_bits}=="64"
      ATTRS{driver_override}=="(null)"
      ATTRS{enable}=="1"
      ATTRS{irq}=="120"
      ATTRS{local_cpulist}=="0-3"
      ATTRS{local_cpus}=="f"
      ATTRS{msi_bus}=="1"
      ATTRS{numa_node}=="-1"
      ATTRS{subsystem_device}=="0x8694"
      ATTRS{subsystem_vendor}=="0x1043"
      ATTRS{vendor}=="0x8086"

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

然后你会看到打印结果中有一行如下。

            ATTRS{serial}=="81830"

进入/etc/udev/rules.d/目录

使用命令添加 990-usdigital-qsbadapter.rules

  sudo nano 990-usdigital-qsbadapter.rules

然后将以下内容放入文件中

  #This rule file is used to assign names for qsb adapter from USdigital 
  KERNELS=="1-8",SUBSYSTEMS=="usb",ATTRS{serial}=="81830",NAME="qsb81830"
  KERNELS=="1-8",SUBSYSTEMS=="usb",ATTRS{serial}=="81658",NAME="qsb81658"

测试你的规则,你可以运行

  udevadm control --reload-rules
  udevadm test /dev/serial/by-id/usb-US_Digital_USB__-__QSB_81658-if00-port0

由于权限问题,我无法更改 NAME。而是使用 SYMLINK。

UDEV 规则,“NAME”变量不起作用) 您无法通过分配给 udev 规则中的 NAME 键来重命名设备节点。至少在 systemd udev 中不行。只能更改网络设备名称。摘自 udev 手册:

  NAME
         The name to use for a network interface. See
         systemd.link(5) for a higher-level mechanism
         for setting the interface name. The name of a
         device node cannot be changed by udev, only
         additional symlinks can be created.

因此将规则文件内容更改为#此规则文件用于为 USdigital 的 qsb 适配器分配名称

  ATTRS{serial}=="81830",SYMLINK+="QSB830"
  ATTRS{serial}=="81658",SYMLINK+="QSB658"

请点击下面的图片查看结果。 打印结果

相关内容