Pesquisa de site

Como usar o Udev para detecção e gerenciamento de dispositivos no Linux


Udev (userspace /dev) é um subsistema Linux para detecção e gerenciamento dinâmico de dispositivos, desde a versão do kernel 2.6. É um substituto do devfs e do hotplug.

Ele cria ou remove dinamicamente nós de dispositivos (uma interface para um driver de dispositivo que aparece em um sistema de arquivos como se fosse um arquivo comum, armazenado no diretório /dev) durante a inicialização ou se você adicionar um dispositivo ou remover um dispositivo do sistema. Em seguida, ele propaga informações sobre um dispositivo ou altera seu estado para o espaço do usuário.

Sua função é 1) fornecer eventos de dispositivos aos aplicativos do sistema, 2) gerenciar permissões de nós de dispositivos e 3) pode criar links simbólicos úteis no diretório /dev para acessar dispositivos ou até mesmo renomear interfaces de rede. .

Uma das vantagens do udev é que ele pode usar nomes de dispositivos persistentes para garantir nomes consistentes de dispositivos durante as reinicializações, independentemente da ordem de descoberta. Esse recurso é útil porque o kernel simplesmente atribui nomes de dispositivos imprevisíveis com base na ordem de descoberta.

Neste artigo, aprenderemos como usar o Udev para detecção e gerenciamento de dispositivos em sistemas Linux. Observe que a maioria, senão todas as distribuições modernas do Linux, vêm com o Udev como parte da instalação padrão.

Aprenda o básico do Udev no Linux

O daemon udev, systemd-udevd (ou systemd-udevd.service) se comunica com o kernel e recebe uevents do dispositivo > diretamente dele sempre que você adicionar ou remover um dispositivo do sistema ou quando um dispositivo alterar seu estado.

Udev é baseado em regras – suas regras são flexíveis e muito poderosas. Cada evento de dispositivo recebido é comparado com o conjunto de regras lidas dos arquivos localizados em /lib/udev/rules.d e /run/udev/rules.d.

Você pode gravar arquivos de regras personalizadas no diretório /etc/udev/rules.d/ (os arquivos devem terminar com a extensão .rules) para processar um dispositivo. Observe que os arquivos de regras neste diretório têm a prioridade mais alta.

Para criar um arquivo de nó de dispositivo, o udev precisa identificar um dispositivo usando certos atributos, como o rótulo, número de série, número maior e menor usado, número do dispositivo de barramento e assim por diante. muito mais. Essas informações são exportadas pelo sistema de arquivos sysfs.

Sempre que você conecta um dispositivo ao sistema, o kernel o detecta e inicializa, e um diretório com o nome do dispositivo é criado no diretório /sys/ que armazena os atributos do dispositivo.

O arquivo de configuração principal do udev é /etc/udev/udev.conf, e para controlar o comportamento do tempo de execução do daemon udev, você pode usar o utilitário udevadm.

Para exibir eventos do kernel recebidos (uevents) e eventos udev (que o udev envia após o processamento da regra), execute udevadm > com o comando monitor. Em seguida, conecte um dispositivo ao seu sistema e observe, no terminal, como o evento do dispositivo é tratado.

A captura de tela a seguir mostra um trecho de um evento ADD após conectar um disco flash USB ao sistema de teste:

udevadm monitor 

Para encontrar o nome atribuído ao seu disco USB, use o utilitário lsblk que lê o sistema de arquivos sysfs e o udev db para coletar informações sobre os dispositivos processados.

 
lsblk

Na saída do comando anterior, o disco USB é denominado sdb1 (o caminho absoluto deve ser /dev/sdb1). Para consultar os atributos do dispositivo no banco de dados udev, use o comando info.

udevadm info /dev/sdb1

Como trabalhar com regras Udev no Linux

Nesta seção, discutiremos brevemente como escrever regras do udev. Uma regra consiste em uma lista separada por vírgulas de um ou mais pares de valores-chave. As regras permitem renomear um nó de dispositivo a partir do nome padrão, modificar permissões e propriedade de um nó de dispositivo, acionar a execução de um programa ou script quando um nó de dispositivo é criado ou excluído, entre outros.

Escreveremos uma regra simples para iniciar um script quando um dispositivo USB for adicionado e quando for removido do sistema em execução.

Vamos começar criando os dois scripts:

sudo vim /bin/device_added.sh

Adicione as seguintes linhas no script device_added.sh.

#!/bin/bash
echo "USB device added at $(date)" >>/tmp/scripts.log

Abra o segundo script.

sudo vim /bin/device_removed.sh

Em seguida, adicione as seguintes linhas ao script device_removed.sh.

#!/bin/bash
echo "USB device removed  at $(date)" >>/tmp/scripts.log

Salve os arquivos, feche e torne os dois scripts executáveis.

sudo chmod +x /bin/device_added.sh
sudo chmod +x /bin/device_removed.sh

A seguir, vamos criar uma regra para acionar a execução dos scripts acima, chamada /etc/udev/rules.d/80-test.rules.

vim /etc/udev/rules.d/80-test.rules

Adicione estas duas regras a seguir.

SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device",  RUN+="/bin/device_added.sh"
SUBSYSTEM=="usb", ACTION=="remove", ENV{DEVTYPE}=="usb_device", RUN+="/bin/device_removed.sh"

onde :

  • "==": é um operador para comparar a igualdade.
  • "+=": é um operador para adicionar o valor a uma chave que contém uma lista de entradas.
  • SUBSYSTEM: corresponde ao subsistema do dispositivo de evento.
  • AÇÃO: corresponde ao nome da ação do evento.
  • ENV{DEVTYPE}: corresponde a um valor de propriedade do dispositivo, tipo de dispositivo neste caso.
  • RUN: especifica um programa ou script a ser executado como parte do tratamento de eventos.

Salve o arquivo e feche-o. Então, como root, diga ao systemd-udevd para recarregar os arquivos de regras (isso também recarrega outros bancos de dados, como o índice do módulo do kernel), executando.

sudo udevadm control --reload

Agora conecte um drive USB em sua máquina e verifique se o script device_added.sh foi executado. Primeiro de tudo o arquivo scripts.log deve ser criado em /tmp.

ls -l /tmp/scripts.log

Em seguida, o arquivo deve ter uma entrada como “dispositivo USB removido em data_hora”, conforme mostrado na captura de tela.

cat /tmp/scripts.log

Para obter mais informações sobre como escrever regras do udev e gerenciar o udev, consulte as entradas manuais udev e udevadm respectivamente, executando:

man udev
man udevadm
Resumo

Udev é um gerenciador de dispositivos notável que fornece uma maneira dinâmica de configurar nós de dispositivos no diretório /dev. Ele garante que os dispositivos sejam configurados assim que forem conectados e descobertos. Ele propaga informações sobre um dispositivo processado ou altera seu estado, para o espaço do usuário.

Se você tiver alguma dúvida ou opinião para compartilhar sobre este tópico, use o formulário de feedback.