O udev é muito poderoso quanto à aplicação das regras, pois permite desde nomear um dispositivo até executar aplicações, e/ou scripts quando
conectamos ou desconectamos, ou quando o dispositivo é alterado.
Para aplicar tais regras, é necessário ter informações obtidas através das chaves de cada device.
Os arquivos que contém as regras do udev estão contidos no diretório
/etc/udev/rules.d e devem ter a extensão ".rules", caso algum
arquivo dentro do diretório não use essa extensão, o seu conteúdo não será processado.
Eles são lidos em ordem numérico alfabética, por exemplo: se dentro do diretório
/etc/udev/rules.d, temos os arquivos "025_usb-
regras.rules" e "035_usb-regras.rules", o arquivo "025_usb-regras.rules" será lido antes que o "035_usb-regras.rules".
Agora, sintaxe das regras e exemplos de regras que funcionam e não funcionam.
Cada arquivo com extensão ".rules" tem regras que seguem a seguinte sintaxe:
<chave de combinação>, <chave de combinação e ou chave de atributo>, <Ação>
Para obter as informações de cada chave dos devices, usamos o comando
udevadm para pegar um relatório.
Não vou entrar em detalhes de uso do comando, mas deixo o link para o manual:
Será usado, para extrair o relatório, a opção "info" que é utilizada para obter informações e "-p", que indica a localização do dispositivo, e "-a" irá
listar informações das propriedades do dispositivo.
Vou listar as propriedades do arquivo de dispositivo
/dev/sdc1 que é meu pendrive da SanDisk, usando o comando
udevadm como root:
# udevadm info -a -p $(udevadm info -q path -n /dev/sdc1)
looking at device '/devices/pci0000:00/0000:00:1d.7/usb1/1-8/1-8:1.0/net/wlan0':
KERNEL=="wlan0"
SUBSYSTEM=="net"
DRIVER==""
ATTR{addr_assign_type}=="0"
ATTR{addr_len}=="6"
ATTR{dev_id}=="0x0"
ATTR{ifalias}==""
ATTR{iflink}=="5"
ATTR{ifindex}=="5"
ATTR{type}=="1"
ATTR{link_mode}=="1"
ATTR{address}=="00:1a:3f:7c:2e:f4"
ATTR{broadcast}=="ff:ff:ff:ff:ff:ff"
ATTR{carrier}=="0"
ATTR{dormant}=="0"
ATTR{operstate}=="down"
ATTR{mtu}=="1500"
ATTR{flags}=="0x1003"
ATTR{tx_queue_len}=="1000"
ATTR{netdev_group}=="0"
looking at parent device '/devices/pci0000:00/0000:00:1d.7/usb1/1-8/1-8:1.0':
KERNELS=="1-8:1.0"
SUBSYSTEMS=="usb"
DRIVERS=="ath9k_htc"
ATTRS{bInterfaceNumber}=="00"
ATTRS{bAlternateSetting}==" 0"
ATTRS{bNumEndpoints}=="06"
ATTRS{bInterfaceClass}=="ff"
ATTRS{bInterfaceSubClass}=="00"
ATTRS{bInterfaceProtocol}=="00"
ATTRS{modalias}=="usb:v0CF3p7015d0202dcFFdscFFdpFFicFFisc00ip00"
ATTRS{supports_autosuspend}=="0"
O adaptador USB está recebendo este nome de "wlan0" porque, quando o sistema o detectou, o udev atribuiu a regra abaixo:
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:1a:3f:7c:2e:f4", ATTR{dev_id}=="0x0", ATTR{type}=="1",
KERNEL=="wlan*", NAME="wlan0"
Mas, com estas informações da saída do comando
udevadm podemos mudar o nome do device para, por exemplo, Wireless0 como
mostra a regra abaixo:
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:1a:3f:7c:2e:f4", ATTR{dev_id}=="0x0", ATTR{type}=="1",
KERNEL=="*", NAME="wireless0"
Explicando a regra:
- 1º → É verificado se o dispositivo filho conectado é do tipo net (rede);
- 2º → Verifica se o dispositivo acabou de se conectado;
- 3º → Na chave de combinação DRIVERS informa que pode ser usado qualquer driver para o respectivo device parent;
- 4º → Na chave de atributo ATTR{address} é verificado o endereço MAC address do device;
- 5º e 6º → São verificados mais duas chaves de atributos da mesma (note que ambas foram atribuídas junto ao dispositivo filho, por isso
a regra funciona);
- 7º → Na chave KERNEL é verificado qual o nome atribuído pelo kernel, no exemplo informei que pode ser qualquer um;
- 8º → Na última chave de combinação informei o novo nome do dispositivo que é wireless0.
Podemos fazer muitas personalizações, além das quais já foram mostradas, podemos, por exemplo, automatizar um processo de backup toda vez
que o dispositivo for conectado à máquina de forma similar à regra acima, que executa um script.
Após aplicar uma regra em um dos arquivos com extensão ".rules", torna-se necessário reiniciar o serviço do udev para as alterações entrarem em
vigor (pelo menos nas distribuições
Debian e
CentOS, por exemplo).
Referências