Tutorial sobre como escrever regras básicas da UDEV no Linux

Tutorial sobre como escrever regras básicas da UDEV no Linux

Objetivo

Compreendendo os conceitos básicos por trás da Udev e aprenda a escrever regras simples

Requisitos

  • Permissões de raiz

Dificuldade

MÉDIO

Convenções

  • # - requer que os comandos Linux sejam executados com privilégios de raiz também
    diretamente como usuário root ou por uso de sudo comando
  • $ - Requer que os comandos do Linux sejam executados como um usuário não privilegiado regular

Introdução

Em um sistema GNU/Linux, enquanto o suporte de baixo nível de dispositivos é tratado no nível do kernel, o gerenciamento de eventos relacionados a eles é gerenciado no espaço de usuários por udev, e mais precisamente pelo udevd Daemon. Aprender a escrever regras a serem aplicadas na ocorrência desses eventos pode ser realmente útil para modificar o comportamento do sistema e adaptá -lo às nossas necessidades.

Como as regras são organizadas

As regras udev são definidas em arquivos com o .regras extensão. Existem dois locais principais nos quais esses arquivos podem ser colocados: /usr/lib/udev/regras.d É o diretório usado para regras instaladas pelo sistema, /etc/udev/regras.d/ é reservado para regras feitas personalizadas.

Os arquivos nos quais as regras são definidos são nomeados convencionalmente com um número como prefixo (e.g 50-udev-default.regras) e são processados ​​em ordem lexical independentemente do diretório em que estão. Arquivos instalados em /etc/udev/regras.d, No entanto, substitua aqueles com o mesmo nome instalado no caminho padrão do sistema.



A sintaxe das regras

A sintaxe das regras da UDEV não é muito complicada quando você entende a lógica por trás disso. Uma regra é composta por duas seções principais: a parte "Match", na qual definimos as condições para a regra a ser aplicada, usando uma série de chaves separadas por uma vírgula e a parte de "ação", na qual realizamos algumas tipo de ação, quando as condições são atendidas.

Um caso de teste

Que maneira melhor de explicar possíveis opções do que configurar uma regra real? Como exemplo, vamos definir uma regra para desativar o touchpad quando um mouse estiver conectado. Obviamente, os atributos fornecidos na definição de regra refletirão meu hardware.

Vamos escrever nossa regra no /etc/udev/regras.D/99-TogGlemouse.regras Arquivo com a ajuda do nosso editor de texto favorito. Uma definição de regra pode abranger várias linhas, mas se for esse o caso, uma barra de barriga deve ser usada antes do personagem Newline, como uma continuação de linha, assim como nos scripts de shell. Aqui está a nossa regra:

Ação == "add" \, atts idproduct == "c52f" \, atts idVendor == "046d" \, Env display = ": 0" \, Env Xauthority = "/run/ Usuário/1000/GDM/Xauthority "\, Run+="/usr/bin/xinput -Disable 16 " 

Vamos analisar.

Operadores

Primeiro de tudo, uma explicação dos operadores usados ​​e possíveis:

== e != operadores

O == é o operador de igualdade e o != é o operador de desigualdade. Ao usá -los, estabelecemos que, para que a regra seja aplicada, as chaves definidas devem corresponder ou não corresponder ao valor definido, respectivamente.

Os operadores de atribuição: = e: =

O = O operador de atribuição, é usado para atribuir um valor às chaves que aceitam uma. Nós usamos o : = O operador, em vez disso, quando queremos atribuir um valor e queremos garantir que ele não seja substituído por outras regras: os valores atribuídos a este operador, de fato, não podem ser alterados.

O += e -= operadores

O += e -= Os operadores são usados ​​respectivamente para adicionar ou remover um valor da lista de valores definidos para uma chave específica.



As chaves que usamos

Vamos agora analisar as chaves que usamos na regra. Primeiro de tudo, temos o AÇÃO Chave: Ao usá -lo, especificamos que nossa regra deve ser aplicada quando um evento específico acontece para o dispositivo. Valores válidos são adicionar, remover e mudar

Nós então usamos o Attrs palavra -chave para especificar um atributo a ser correspondido. Podemos listar os atributos de um dispositivo usando o Informações Udevadm comando, fornecendo seu nome ou sysfs caminho:

Udevadm Info --AP/Devices/PCI0000: 00/0000: 00: 1D.0/USB2/2-1/2-1.2/2-1.2: 1.1/0003: 046D: C52F.0010/input/input39 udevadm as informações começam com o dispositivo especificado pelo devPath e depois caminha pela cadeia de dispositivos pais. Ele imprime para cada dispositivo encontrado, todos os atributos possíveis no formato da chave do Udev Regras. Uma regra a ser combinada, pode ser composta pelos atributos do dispositivo e pelos atributos de um dispositivo solteiro pai. Olhando para o dispositivo '/dispositivos/pci0000: 00/0000: 00: 1d.0/USB2/2-1/2-1.2/2-1.2: 1.1/0003: 046D: C52F.0010/input/input39 ': kernel == "input39" subsystem == "entrada" driver == "" att name == "Logitech USB Receiver" att Phys == "USB-0000: 00: 1D.0-1.2/input1 "att Properties ==" 0 "att uniq ==" "olhando para o dispositivo pai '/dispositivos/pci0000: 00/0000: 00: 1d.0/USB2/2-1/2-1.2/2-1.2: 1.1/0003: 046D: C52F.0010 ': kernels == "0003: 046d: c52f.0010 "Subsistemas ==" hid "drivers ==" hid-generic "attrs country ==" 00 "olhando para o dispositivo pai '/dispositivos/pci0000: 00/0000: 00: 1d.0/USB2/2-1/2-1.2/2-1.2: 1.1 ': kernels == "2-1.2: 1.1 "Subsistemas ==" USB "drivers ==" USBHID "attrs Autorizado ==" 1 "Attrs Balternatesetting ==" 0 "attrs binterfaceclass ==" 03 "attrs binterfacenumber ==" 01 " Atts binterfaceProtocol == "00" attrs binterfacesubclass == "00" attrs bnumendpoints == "01" attrs supports_autosuspend == "1" em busca do dispositivo pai/dispositivos/pci0000: 00/00/00/ 00: 1d.0/USB2/2-1/2-1.2 ': kernels == "2-1.2 "Subsistemas ==" USB "drivers ==" USB "Attrs Autorizado ==" 1 "Attrs evved_reset_quirk ==" 0 "Attrs BConfigurationValue ==" 1 "Atttrs BDeviceclass ==" 00 " Atts bdeviceProtocol == "00" attrs bdevicesubclass == "00" atts bmaxpacketsize0 == "8" attrs bmaxpower == "98Ma" attrs bnumconfigurações "" 1 "1" = "2" attrs bcdDevice == "3000" attrs bmattributes == "a0" attrs busnum == "2" attrs configuration == "rqr30.00_b0009 "attrs devnum ==" 12 "attrs devPath ==" 1.2 "atts idproduct ==" c52f "attrs idVendor ==" 046d "attrs ltm_capable ==" no "attrs fabricante ==" logitech "attrs maxchild ==" 0 "attrs produto  == "receptor USB" attrs quirks == "0x0" attrs removable == "removível" attrs speed == "12" attrs urbnum == "1401" attrs versão == " 2.00 "[…] 


Acima está a saída truncada recebida após a execução do comando. Como você pode ler da própria saída, udevadm começa com o caminho especificado que fornecemos e nos fornece informações sobre todos os dispositivos pais. Observe que os atributos do dispositivo são relatados em forma singular (e.g NÚCLEO), enquanto os pais em forma de plural (e.g Kernels). A informação dos pais pode fazer parte de uma regra, mas apenas um dos pais pode ser referenciado em cada vez: Misturar atributos de diferentes dispositivos parentais não funcionará. Na regra que definimos acima, usamos os atributos de um dispositivo pai: IdProduct e IDVENDOR.

A próxima coisa que fizemos em nossa regra é usar o Env Palavra -chave: pode ser usada para definir ou tentar combinar variáveis ​​de ambiente. Atribuímos um valor ao MOSTRAR e Xautoria uns. Essas variáveis ​​são essenciais ao interagir com o servidor X programaticamente, para configurar algumas informações necessárias: com o MOSTRAR variável, especificamos sobre qual máquina o servidor está em execução, qual exibição e qual tela estamos referenciando e com Xautoria Fornecemos o caminho para o arquivo que contém informações de autenticação e autorização Xorg. Este arquivo geralmente está localizado no diretório "home" dos usuários.

Finalmente usamos o CORRER Palavra -chave: isso é usado para executar programas externos. Muito importante: isso não é executado imediatamente, mas as várias ações são executadas quando todas as regras foram analisadas. Nesse caso, usamos o xinput utilidade para alterar o status do touchpad. Não vou explicar a sintaxe do xinput aqui, ficaria fora de contexto, apenas observe que 16 é o id do touchpad.

Depois que nossa regra for definida, podemos depurar usando o teste udevadm comando. Isso é útil para depuração, mas realmente não executa comandos especificados usando o CORRER chave:

$ udevadm test --action = "add"/dispositivos/pci0000: 00/0000: 00: 1d.0/USB2/2-1/2-1.2/2-1.2: 1.1/0003: 046D: C52F.0010/input/input39

O que fornecemos ao comando é a ação para simular, usando o --Ação opção e o caminho SYSFS do dispositivo. Se nenhum erro for relatado, nossa regra deve ser boa para ir. Para executá -lo no mundo real, devemos recarregar as regras:

# Udevadm Control -Relload

Este comando recarregará os arquivos das regras, no entanto, terá efeito apenas em novos eventos gerados.

Vimos os conceitos básicos e a lógica usados ​​para criar uma regra UDEV, no entanto, apenas arranhamos a superfície das muitas opções e possíveis configurações. A Manpage Udev fornece uma lista exaustiva: Consulte-a para obter um conhecimento mais aprofundado.

Tutoriais do Linux relacionados:

  • Coisas para instalar no Ubuntu 20.04
  • Como lidar com eventos ACPI no Linux
  • Coisas para fazer depois de instalar o Ubuntu 20.04 fossa focal linux
  • Uma introdução à automação, ferramentas e técnicas do Linux
  • Download do Linux
  • Arquivos de configuração do Linux: os 30 primeiros mais importantes
  • Linux pode obter vírus? Explorando a vulnerabilidade do Linux…
  • Loging e auditoria avançados no Linux
  • Comandos Linux: os 20 comandos mais importantes que você precisa para…
  • Mint 20: Melhor que o Ubuntu e o Microsoft Windows?