O sistema udev (abreviação para "userspace /dev") é uma ferramenta para gerenciar dispositivos no espaço do usuário. Ele permite que você aplique regras personalizadas e execute scripts automaticamente quando certos dispositivos são plugados, desplugados ou de outra forma modificados.
udevadmAntes de criar qualquer regra para o udev, você precisa identificar o evento do dispositivo que deseja capturar. Para isso, usamos o comando udevadm monitor --environment.
sudo udevadm monitor --environment
Por exemplo, ao conectar um dispositivo USB, você pode ver algo como:
UDEV [7069.634485] add /devices/pci0000:00/0000:00:14.0/usb2/2-1 (usb)
ACTION=add
DEVNAME=/dev/bus/usb/002/002
...
Essas informações são necessárias para escrever suas regras.
As regras do udev são armazenadas em arquivos .rules localizados no diretório /etc/udev/rules.d/. Vamos criar um arquivo de regra para executar scripts ao conectar e desconectar o laptop da tomada.
kate /etc/udev/rules.d/99-power.rules
# Quando o laptop é conectado à tomada
SUBSYSTEM=="power_supply", ENV{STATUS}=="Charging", RUN+="/path/to/your/charging_script.sh"
# Quando o laptop é desconectado da tomada
SUBSYSTEM=="power_supply", ENV{STATUS}=="Discharging", RUN+="/path/to/your/discharging_script.sh"
Nota: Substitua
/path/to/your/charging_script.she/path/to/your/discharging_script.shpelos caminhos absolutos para os seus scripts.
udev:sudo udevadm control --reload-rules
Agora, digamos que você queira executar um script quando um dispositivo Bluetooth for ativado ou desativado.
kate /etc/udev/rules.d/99-bluetooth.rules
# Quando Bluetooth é ativado
KERNEL=="hci0", ACTION=="add", RUN+="/path/to/your/bluetooth_on.sh"
# Quando Bluetooth é desativado
KERNEL=="hci0", ACTION=="remove", RUN+="/path/to/your/bluetooth_off.sh"
Salve e feche o arquivo.
Recarregue as configurações do udev:
sudo udevadm control --reload-rules
| Variável | Descrição | Exemplo de Uso |
|---|---|---|
ACTION |
Tipo de ação (add, remove, etc.) | ACTION=="add" |
DEVPATH |
Caminho do dispositivo no sysfs | DEVPATH=="/devices/..." |
KERNEL |
Nome do dispositivo | KERNEL=="sda1" |
NAME |
Nome do dispositivo | NAME=="meu_dispositivo" |
SYMLINK |
Link simbólico para o dispositivo | SYMLINK+="meu_symlink" |
SUBSYSTEM |
Subsistema ao qual o dispositivo pertence | SUBSYSTEM=="usb" |
DRIVER |
Driver do dispositivo | DRIVER=="ehci_hcd" |
ATTR{} |
Atributo do dispositivo | ATTR{idVendor}=="8086" |
ENV{} |
Variável de ambiente | ENV{ID_TYPE}=="disk" |
TAG |
Etiqueta para o dispositivo | TAG+="systemd" |
RUN |
Comando ou script a ser executado | RUN+="/meu_script.sh" |
PROGRAM |
Programa para executar | PROGRAM=="/meu_programa" |
RESULT |
Resultado do último PROGRAM executado |
RESULT=="valor" |
WAIT_FOR |
Esperar por um arquivo ou dispositivo | WAIT_FOR="/meu_arquivo" |
GOTO |
Pular para uma regra específica | GOTO="minha_regra" |
LABEL |
Etiqueta para um conjunto de regras | LABEL="minhas_regras" |
OPTIONS |
Opções adicionais | OPTIONS="last_rule" |
IMPORT |
Importar arquivo ou comando | IMPORT{file}="/arquivo" |
OWNER |
Proprietário do dispositivo | OWNER="usuario" |
GROUP |
Grupo do dispositivo | GROUP="grupo" |
MODE |
Modo do dispositivo | MODE="0660" |
SECLABEL |
Rótulo de segurança | SECLABEL=="..." |
NUM_OWNERS |
Número de proprietários | NUM_OWNERS=="1" |
NUM_GROUPS |
Número de grupos | NUM_GROUPS=="1" |
NUM_MODES |
Número de modos | NUM_MODES=="1" |
STRING_WRITE |
Escrever string para um arquivo | STRING_WRITE="/path/to/file" |
STRING_APPEND |
Anexar string para um arquivo | STRING_APPEND="/path/to/file" |
TEST |
Testar a existência de um arquivo | TEST=="/meu_arquivo" |
PROGRAM_RESULT |
Resultado de PROGRAM |
PROGRAM_RESULT=="valor" |
DEVLINKS |
Links simbólicos para o dispositivo | DEVLINKS=="/dev/meu_link" |
DEVNAME |
Nome do dispositivo | DEVNAME=="/dev/sda" |
DEVPATH_OLD |
Caminho anterior do dispositivo | DEVPATH_OLD=="/devices/..." |
DEVTYPE |
Tipo de dispositivo | DEVTYPE=="disk" |
SEQNUM |
Número de sequência do evento | SEQNUM=="1234" |
USEC_INITIALIZED |
Tempo em microssegundos desde a inicialização | USEC_INITIALIZED=="5678" |
ID_VENDOR |
Identificação do fornecedor | ID_VENDOR=="Intel" |
ID_MODEL |
Identificação do modelo | ID_MODEL=="XYZ123" |
ID_REVISION |
Revisão do dispositivo | ID_REVISION=="1.0" |
ID_SERIAL |
Número de série | ID_SERIAL=="123456" |
ID_TYPE |
Tipo de dispositivo (disk, cd, etc.) | ID_TYPE=="disk" |
ID_BUS |
Tipo de ônibus (usb, pci, etc.) | ID_BUS=="usb" |
ID_PATH |
Caminho do dispositivo | ID_PATH=="pci-0000:00:14.0-usb-0:1" |
ID_FS_TYPE |
Tipo de sistema de arquivos | ID_FS_TYPE=="ext4" |
ID_FS_UUID |
UUID do sistema de arquivos | ID_FS_UUID=="XYZ-123" |
ID_FS_LABEL |
Rótulo do sistema de arquivos | ID_FS_LABEL=="MeuDisco" |
ID_USB_DRIVER |
Driver USB | ID_USB_DRIVER=="usb-storage" |
ID_USB_INTERFACES |
Interfaces USB | ID_USB_INTERFACES==":080650:" |
ID_USB_INTERFACE_NUM |
Número da interface USB | ID_USB_INTERFACE_NUM=="00" |