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 à NAME
chave 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/sdf
e, 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