Tutorial sobre como escrever regras básicas da UDEV no Linux
- 3805
- 407
- Arnold Murray
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 desudo
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?