Hierarquia dos dispositivos
Antes de começar a trabalhar com regras no udev, é necessário saber como o kernel representa os dispositivos em sua estrutura. O kernel do
Linux
organiza e representa os dispositivos conectados à máquina em uma estrutura de árvore, ou seja, existe uma hierarquia onde cada device é "filho"
de um device "pai".
Toda esta estrutura está exposta no diretório
/sys contendo informações de cada device. Para poder ter mais detalhes sobre os
devices, use o comando
udevadm e poderá ver todas as chaves dos dispositivos.
Veja o exemplo do arquivo de dispositivo
/dev/usb/lp0 da minha máquina, que representa a impressora, rodando o comando abaixo
como root:
# udevadm info -a -p $(sudo udevadm info -q path -n /dev/usb/lp0)
A saída do comando mostra bem a organização e hierarquia do device. Sendo que
/dev/usb/lp0 é filho do device "usb", e neste device o
kernel nomeia-o de "lp0", justamente o nome dado pelo udev, que por sua vez é filho do device pai, também chamado de "usb" e o kernel nomeia-o
de "2-2:1.1", carregando o driver "usblp", que por sua vez é filho do device "pci" e o kernel nomeia-o neste subsistema de "0000:00:1d.0",
carregando o driver "uhci_hcd".
Veja o exemplo do arquivo de dispositivo
/dev/sda que representa o primeiro disco rígido da minha máquina:
# udevadm info -a -p $(sudo udevadm info -q path -n /dev/sda)
O device
/dev/sda nesta hierarquia, é filho do device "block", ou seja, é um dispositivo de bloco e o kernel nomeia-o de "sda", que por
sua vez, é filho do device chamado de "scsi", e o kernel nomeia-o de "0:0:0:0", carregando o driver "sd", que por sua vez é filho do device chamado
também de "scsi", e o kernel nomeia-o de "target0:0:0".
Observe que, na hierarquia mostrada na saída do comando
udevadm, os devices de baixo são pais dos de cima "filhos".
As chaves do udev
Chaves no udev são informações de dispositivos e podem ser classificadas em dois tipos, existindo as chaves de combinação e de atributos. Ambas
serão abordadas a seguir, e o seu uso torna-se necessário para aplicar as regras do udev.
As chaves de combinação mais usadas, são as listadas abaixo:
- KERNEL → Esta chave informa o nome atribuído pelo kernel ao dispositivo em questão;
- SUBSYSTEM → Chave que informa o tipo de dispositivo, seja o dispositivo pai ou filho;
- DRIVER → Chave que informa o driver para o dispositivo;
- ATTR → Esta chave tem informações adicionais sobre o dispositivo;
- OWNER → Usuário que será o proprietário do dispositivo criado no /dev;
- GROUP → Grupo do dispositivo criado no /dev;
- MODE → Atribui a umask padrão para o dispositivo criado em /dev.
Além das chaves de combinação já vistas, é possível usar outras descritas abaixo:
- NAME → Esta chave contém o nome que será usado para o dispositivo;
- SYMLINK → Nesta chave, configura-se um link simbólico;
- RUN → Adiciona um programa que será executado;
- ACTION → Ação do evento do dispositivo, se o dispositivo está sendo conectado, removido ou alterado.
Chaves de combinação KERNELS, SUBSYSTEMS e DRIVERS, contêm informações similares às chaves de combinação apresentadas acima, no entanto,
estas chaves de combinação são usadas em dispositivos pais (parent devices).
As chaves de atributo ATTR, contêm informação adicional a um dispositivo e a chave de atributo ATTRS é similar a ATTR, no entanto, é usada em
devices pais (parent devices).
A observação é que em uma regra, não pode ser atribuído mais de uma chave de atributo e/ou de combinação de dispositivos "pai" (device parent)
junto à chave de combinação "filho" e nem combinar chaves de atributos de diferentes dispositivos pais em um único dispositivo pai. Caso isso
aconteça, a regra não irá funcionar.
Para a regra funcionar, podemos colocar uma ou mais chaves de combinação "filho" seguida de uma chave de atributo ou de combinação "pai" na
mesma regra e/ou, caso queira atribuir mais de uma chave de atributo "pai", é necessário informar o dispositivo a qual ela pertence, basta usar a
chave de combinação "pai" SUBSYSTEMS.
Se ficou confuso, na próxima página irei exemplificar para ter um melhor entendimento.
Para aplicar as regras, além das chaves já mencionadas, podemos fazer uso de strings e é necessário usar operadores. Veja abaixo as strings e
operadores que podemos usar.
Strings que podem ser usadas nas regras:
- * → Corresponde a tudo naquela posição (é similar ao coringa asterisco).
- ? → Qualquer caractere naquela posição.
- [] → Corresponde a qualquer caractere especificado dentro dos colchetes.
Por exemplo, a sequência de caracteres 'tty[SR]' iria corresponder tanto 'ttyS' quanto a 'ttyR'. Você pode também especificar intervalos usando a
faixa através do caractere '-'. Se o primeiro caractere após o '[' é um '!', há uma exceção.
Operadores mais usados nas regras:
- == → Compara se é igual (atribui uma valor de igualdade);
- != → Compara se é diferente (atribui um valor de diferença);
- = → Atribui um valor à chave (é usado quando se quer mudar o nome do device, por exemplo);
- += → Adiciona um valor à chave e pode manter uma lista de entradas - Pode, por exemplo, usar na chave RUN e especificar vários
comandos.
Depois de toda esta explicação, vamos começar a aplicar as regras na próxima página.