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。

首先,運行 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。

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.

因此,將規則檔案內容變更為 #This 規則檔案用於為 USdigital 的 qsb 適配器指派名稱

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

請點擊下面的圖片查看結果。 列印結果

相關內容