Regras UDEV, variável "NAME" não funciona

Regras UDEV, variável "NAME" não funciona

Eu escrevi uma regra simples do udev para me ajudar a entender o conceito

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

A parte do link simbólico da regra UDEV funciona (foi comentada), mas a parte Nome da regra UDEV não funciona. Não tenho certeza do que fiz de errado?

Minha segunda parte da pergunta é: o que o link simbólico deve fazer quando eu o crio? Eu entendo que ele aponta para o arquivo do dispositivo, mas isso é inútil. Gostaria que apontasse para o ponto de montagem para que eu possa usá-lo como um atalho para entrar no USB. Alguma idéia de como posso fazer isso?

Responder1

Você não pode renomear um nó de dispositivo atribuindo-o à NAMEchave nas regras do udev. Pelo menos não no systemd udev. Apenas um nome de dispositivo de rede pode ser alterado. Do manual do 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.

Qualquer link simbólico do udev para um dispositivo não é especial por si só. É apenas um link simbólico do sistema de arquivos para o nó do dispositivo. No entanto, um exemplo de uso útil das regras de link simbólico do udev é que, como os nomes dos dispositivos dependem da ordem em que o kernel descobre os dispositivos, o nome do dispositivo no qual um sistema de arquivos específico reside é imprevisível. Ao mesmo tempo, um pen drive pode obter o nome do dispositivo /dev/sdfe, em outro momento /dev/sdg, . As regras do Udev geralmente são instaladas, o que adiciona nomes de links simbólicos previsíveis, como é feito no meu laptop Ubuntu, onde /dev/disk/by-uuid/o uuid dos sistemas de arquivos no disco são links simbólicos que apontam para o nome do dispositivo do kernel.

Quanto à sua última pergunta, você não pode ter um link simbólico do udev apontando para nada além de um nó de dispositivo, então você não pode apontar para um ponto de montagem:

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

Para conseguir o que deseja fazer, você pode atribuir um rótulo ao sistema de arquivos e fazer com que o programa usado para montar seus sistemas de arquivos (udisks2?) Use o rótulo no nome do ponto de montagem.

Responder2

Como resolver o problema de não saber os nomes dos dispositivos USB quando vários dispositivos USB estão conectados no mesmo computador? A maneira mais fácil é usar os nomes dos dispositivos da pasta /dev. Depois de conectar os adaptadores USB, ele gerará automaticamente um nome de série para ele, que você pode encontrar em /dev/serial/by-id mostrado abaixo

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

QSB_81658 eventualmente será um nome exclusivo para esse dispositivo USB.

Tentei escrever regras de desenvolvimento que eram redundantes, porque cada dispositivo tinha seu próprio nome constante, conforme mostrado acima. Também me deparei com alguns problemas, como quando estava aplicando regras de desenvolvimento.

Escrevendo regras de desenvolvimento para atribuir nomes a indivíduos. Como sabemos, cada adaptador QSB possui seu próprio número de série, que você encontra na parte frontal do adaptador preto. Para o meu caso, tenho dois adaptadores QSB0. Um tem o número de série 81830, outro tem o número de série 81658. Usarei este atributo (ATTRS{serial}) para atribuir nomes a esses dois adaptadores.

Primeiro, execute udevadm para ver os detalhes dos dispositivos USB

$ udevadm informações -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==""

Então você verá uma linha abaixo dos resultados impressos.

            ATTRS{serial}=="81830"

Vá para o diretório /etc/udev/rules.d/

Adicione 990-usdigital-qsbadapter.rules usando o comando

  sudo nano 990-usdigital-qsbadapter.rules

Em seguida, coloque o seguinte no arquivo

  #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"

teste suas regras, você pode executar

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

Devido a problemas de permissão, não consegui alterar o NOME. Em vez disso, uso o SYMLINK.

(Regras UDEV, variável "NAME" não funciona) Você não pode renomear um nó de dispositivo atribuindo à chave NAME nas regras do udev. Pelo menos não no systemd udev. Apenas um nome de dispositivo de rede pode ser alterado. Do manual do 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.

Portanto, altere o conteúdo do arquivo de regras para #Este arquivo de regras é usado para atribuir nomes ao adaptador qsb da USdigital

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

Por favor clique na imagem abaixo para ver o resultado. Imprimir resultados

informação relacionada