Uma regra do udev pode corresponder a qualquer propriedade adicionada pelo kernel ao próprio evento ou a qualquer informação exportada pelo kernel para sysfs. A regra também pode solicitar informações adicionais de programas externos. Cada evento é correspondido com as regras fornecidas. Essas regras estão localizadas no diretório /etc/udev/rules.d.
Cada linha no arquivo de regras contém pelo menos um par de valores de chave. Há dois tipos de chaves, de atribuição e correspondência. Se todas as chaves de correspondência corresponderem aos valores, a regra será aplicada e as chaves de atribuição serão atribuídas ao valor especificado. Uma regra correspondente pode especificar o nome do nó de dispositivo, adicionar symlinks apontando para o nó ou executar um programa especificado como parte do tratamento de eventos. Se nenhuma regra de correspondência for encontrada, o nome do nó de dispositivo padrão será usado para criar o nó de dispositivo. Informações detalhadas sobre a sintaxe de regra e as chaves fornecidas para correspondência ou importação de dados são descritas na página de manual do udev. As regras de exemplo a seguir fornecem uma introdução básica à sintaxe de regra do udev. As regras de exemplo são todas tiradas do conjunto de regras padrão do udev, localizado em /etc/udev/rules.d/50-udev-default.rules.
Exemplo 13.1. Regras do udev de exemplo
# console
KERNEL=="console", MODE="0600", OPTIONS="last_rule"
# serial devices
KERNEL=="ttyUSB*", ATTRS{product}=="[Pp]alm*Handheld*", SYMLINK+="pilot"
# printer
SUBSYSTEM=="usb", KERNEL=="lp*", NAME="usb/%k", SYMLINK+="usb%k", GROUP="lp"
# kernel firmware loader
SUBSYSTEM=="firmware", ACTION=="add", RUN+="firmware.sh"
A regra do console consiste em três chaves: uma chave de correspondência (KERNEL) e duas chaves de atribuição (MODE, OPTIONS). A regra de correspondência KERNEL pesquisa qualquer item do tipo console na lista de dispositivos. Apenas correspondências exatas são válidas e acionam essa regra para que seja executada. A chave MODE atribui permissões especiais ao nó de dispositivo, neste caso, permissões de leitura e gravação apenas ao proprietário desse dispositivo. A chave OPTIONS torna esta a última regra a ser aplicada a qualquer dispositivo desse tipo. Qualquer regra posterior que corresponda a esse tipo de dispositivo em particular não terá nenhum efeito.
A regra dos dispositivos seriais não está mais disponível em 50-udev-default.rules, mas ainda vale a pena ser considerada. Consiste em duas chaves de correspondência (KERNEL e ATTRS) e uma de atribuição (SYMLINK). A chave KERNEL procura todos os dispositivos do tipo ttyUSB. Usando o curinga *, essa chave corresponde a diversos desses dispositivos. A segunda chave de correspondência, ATTRS, verifica se o arquivo de atribuição do produto em sysfs para qualquer dispositivo ttyUSB contém uma determinada string. A chave de atribuição (SYMLINK) aciona a adição de um link simbólico para esse dispositivo em /dev/pilot. O operador usado nessa chave (+=) diz ao udev para executar essa ação adicionalmente, mesmo se regras anteriores ou posteriores adicionarem outros links simbólicos. Como essa regra contém duas chaves de correspondência, ela é aplicada apenas se ambas as condições são cumpridas.
A regra da impressora lida com impressoras USB e contém duas chaves de correspondência que devem ser aplicadas para que a regra inteira seja aplicada (SUBSYSTEM e KERNEL). Três chaves de atribuição lidam com a nomeação desse tipo de dispositivo (NAME), a criação dos links de dispositivo simbólicos (SYMLINK) e a participação no grupo desse tipo de dispositivo (GROUP). O uso do curinga * na chave KERNEL faz com que ela corresponda a diversos dispositivos de impressora lp. Substituições são usadas pelo nome do dispositivo interno tanto na chave NAME quanto na SYMLINK para estender essas strings. Por exemplo, o symlink para a primeira impressora USB lp seria lido como /dev/usblp0.
A regra do carregador de firmware do kernel faz o udev carregar firmware adicional por um script de assistente externo durante o tempo de execução. A chave de correspondência SUBSYSTEM procura o subsistema de firmware. A chave ACTION verifica se algum dispositivo pertencente ao subsistema de firmware foi adicionado. A chave RUN+= aciona a execução do script firmware.sh para localizar o firmware a ser carregado.
Algumas características são comuns a todas as regras:
Cada regra é composta por um ou mais pares de valores de chaves separados por vírgula.
A operação de uma chave é determinada pelo operador. As regras do udev suportam diversos operadores diferentes.
Cada valor dado deve estar entre aspas.
Cada linha do arquivo de regras representa uma regra. Se uma regra for mais extensa e não couber em uma linha, use \ para juntar as linhas diferentes como se faria na sintaxe do shell.
As regras do udev suportam um padrão no estilo do shell que corresponde aos padrões de *, ? e [].
As regras do udev suportam substituições.
Ao criar chaves, você pode escolher dentre diversos operadores diferentes, dependendo do tipo de chave que quiser criar. As chaves de correspondência normalmente são usadas apenas para encontrar um valor que corresponda ou que explicitamente não corresponda ao valor de pesquisa. As chaves de correspondência contêm um dos seguintes operadores:
==
Comparar para igualdade. Se a chave contém um padrão de pesquisa, todos os resultados correspondentes a esse padrão são válidos.
!=
Comparar para não-igualdade. Se a chave contém um padrão de pesquisa, todos os resultados correspondentes a esse padrão são válidos.
Qualquer um dos operadores a seguir também pode ser usado com chaves de atribuição:
=
Atribuir um valor a uma chave. Se a chave consistia anteriormente em uma lista de valores, ela é redefinida e apenas o valor único é atribuído.
+=
Adicionar um valor a uma chave que contenha uma lista de entradas.
:=
Atribuir um valor final. Não permitir nenhuma mudança posterior por regras posteriores.
As regras do udev suportam o uso de marcadores e substituições. Use-as como faria em qualquer outro script. As substituições a seguir podem ser usadas com regras do udev:
%r, $root
O diretório do dispositivo, /dev por padrão.
%p, $devpath
O valor de DEVPATH.
%k, $kernel
O valor de KERNEL ou o nome do dispositivo interno.
%n, $number
O nome do dispositivo.
%N, $tempnode
O nome temporário do arquivo de dispositivo.
%M, $major
O número maior do dispositivo.
%m, $minor
O número menor do dispositivo.
%s{attribute}, $attr{attribute}
O valor de um atributo sysfs (especificado por attribute).
%E{variable}, $attr{variable}
O valor de uma variável do ambiente (especificado por variable).
%c, $result
A saída de PROGRAM.
%%
O caractere %.
$$
O caractere $.
As chaves de correspondência descrevem condições que devem ser cumpridas antes da aplicação de uma regra do udev. As seguintes chaves de correspondência estão disponíveis:
ACTION
O nome da ação do evento, por exemplo, add ou remove na adição ou remoção de um dispositivo.
DEVPATH
O caminho do dispositivo do evento, por exemplo, DEVPATH=/bus/pci/drivers/ipw3945 para procurar todos os eventos relacionados ao driver ipw3945.
KERNEL
O nome interno (do kernel) do dispositivo do evento.
SUBSYSTEM
O subsistema do dispositivo do evento, por exemplo, SUBSYSTEM=usb para todos os eventos relacionados a dispositivos USB.
ATTR{nome de arquivo}
Atributos sysfs do dispositivo do evento. Para corresponder a uma string contida no nome de arquivo do atributo fornecedor, você poderia usar ATTR{fornecedor}=="On[sS]tream", por exemplo.
KERNELS
Permitir que o udev procure um nome de dispositivo correspondente no caminho de dispositivo em sentido ascendente.
SUBSYSTEMS
Permitir que o udev procure um nome de um subsistema de dispositivo correspondente no caminho de dispositivo em sentido ascendente.
DRIVERS
Permitir que o udev procure um nome de um driver de dispositivo correspondente no caminho de dispositivo em sentido ascendente.
ATTRS{nome de arquivo}
Permitir que o udev procure um dispositivo com valores de atributo sysfs correspondentes no caminho de dispositivo em sentido ascendente.
ENV{chave}
O valor de uma variável de ambiente, por exemplo, ENV{ID_BUS}="ieee1394 para procurar todos os eventos relacionados ao ID do barramento FireWire.
PROGRAM
Permitir que o udev execute um programa externo. Para ser bem-sucedido, o programa deve retornar com código de saída zero. A saída do programa, impressa em stdout, está disponível para a chave RESULT.
RESULT
Corresponder à string de saída da última chamada de PROGRAM. Incluir esta chave na mesma regra que a chave PROGRAM ou em uma posterior.
Em contraste com as chaves de correspondência descritas anteriormente, as chaves de atribuição não descrevem condições que devem ser cumpridas. Elas atribuem valores, nomes e ações aos nós de dispositivo mantidos pelo udev.
NAME
O nome do nó de dispositivo a ser criado. Após uma regra definir um nome de nó, todas as demais regras com uma chave NAME para esse nó são ignoradas.
SYMLINK
O nome de um symlink relacionado a um nó a ser criado. Várias regras de correspondência podem adicionar symlinks a serem criados com o nó de dispositivo. Você também pode especificar vários symlinks para um nó em uma regra usando o caractere de espaço para separar os nomes dos symlinks.
OWNER, GROUP, MODE
As permissões do novo nó de dispositivo. Os valores especificados aqui sobregravam qualquer coisa que tenha sido compilada.
ATTR{chave}
Especificar um valor a ser gravado em um atributo sysfs do dispositivo de evento. Se o operador == é usado, essa chave também é usada para corresponder com o valor de um atributo sysfs.
ENV{chave}
Dizer ao udev para exportar uma variável para o ambiente. Se o operador == é usado, essa chave também é usada para corresponder com uma variável de ambiente.
RUN
Dizer ao udev para adicionar um programa à lista de programas a serem executados para esse dispositivo. Lembre-se de restringir isso a tarefas muito curtas, a fim de evitar o bloqueio de outros eventos para esse dispositivo.
LABEL
Adicionar um rótulo para onde um GOTO possa ir.
GOTO
Dizer ao udev para ignorar várias regras e continuar com aquela que tenha o rótulo mencionado pela chave GOTO.
IMPORT{tipo}
Carregar variáveis para o ambiente do evento, como a saída de um programa externo. O udev importa variáveis de vários tipos diferentes. Se nenhum tipo é especificado, o udev tenta determinar o tipo por conta própria, com base no bit executável das permissões de arquivo.
program diz ao udev para executar um programa externo e importar sua saída.
file diz ao udev para importar um arquivo texto.
parent diz ao udev para importar as chaves armazenadas do dispositivo pai.
WAIT_FOR_SYSFS
Diz ao udev para aguardar que o arquivo sysfs especificado seja criado para um determinado dispositivo. Por exemplo, WAIT_FOR_SYSFS="ioerr_cnt" informa o udev para aguardar até que o arquivo ioerr_cnt seja criado.
OPTIONS
A chave OPTION pode ter diversos valores possíveis:
last_rule diz ao udev para ignorar todas as regras posteriores.
ignore_device diz ao udev para ignorar esse evento completamente.
ignore_remove diz ao udev para ignorar todos os eventos de remoção posteriores para o dispositivo.
all_partitions diz ao udev para criar nós de dispositivo para todas as partições disponíveis em um dispositivo de bloco.