systemdjournalctl: consultar o diário do systemdudevudev /devuevents e udev do Kerneludev em execuçãoudevudev
O kernel pode adicionar ou remover praticamente qualquer dispositivo em um sistema em execução. Mudanças no estado do dispositivo (se um dispositivo foi conectado ou removido) precisam ser propagadas ao espaço do usuário. Os dispositivos deverão ser configurados assim que forem conectados e reconhecidos. Os usuários de um determinado dispositivo precisam ser informados sobre qualquer mudança no estado reconhecido desse dispositivo. O udev fornece a infraestrutura necessária para manter dinamicamente os arquivos dos nós de dispositivo e os links simbólicos no diretório /dev. As regras do udev fornecem uma maneira de conectar ferramentas externas ao processamento de evento do dispositivo de kernel. Permite personalizar o gerenciamento de dispositivos do udev; por exemplo, adicionando determinados scripts para execução como parte do gerenciamento de dispositivos do kernel ou para solicitação e importação de dados adicionais para avaliar durante o gerenciamento de dispositivos.
/dev #
Os nós de dispositivo no diretório /dev fornecem acesso aos dispositivos de kernel correspondentes. Com udev, o diretório /dev reflete o estado atual do kernel. Cada dispositivo de kernel tem um arquivo de dispositivo correspondente. Se um dispositivo for desconectado do sistema, o nó de dispositivo será removido.
O conteúdo do diretório /dev será mantido em um sistema de arquivos temporário, e todos os arquivos serão renderizados a cada inicialização do sistema. Arquivos criados ou modificados manualmente por definição não resistem a uma reinicialização. Diretórios e arquivos estáticos que sempre devem estar presentes no diretório /dev, independentemente do estado do dispositivo de kernel correspondente, podem ser criados com systemd-tmpfiles. Os arquivos de configuração estão em /usr/lib/tmpfiles.d/ e em /etc/tmpfiles.d/. Para obter mais informações, consulte a página de manual systemd-tmpfiles(8).
uevents e udev do Kernel #
As informações de dispositivo necessárias são exportadas pelo sistema de arquivos sysfs. Para cada dispositivo detectado e inicializado pelo kernel, um diretório com o nome do dispositivo é criado. Ele contém arquivos de atributos com propriedades específicas do dispositivo.
Sempre que um dispositivo é adicionado ou removido, o kernel envia um uevent para notificar o udev sobre a mudança. O daemon udev lê e analisa todas as regras especificadas nos arquivos /etc/udev/rules.d/*.rules uma vez na inicialização e as mantém na memória. Se os arquivos de regras são mudados, adicionados ou removidos, o daemon pode recarregar a representação na memória de todas as regras com o comando udevadm control reload_rules. Para obter mais detalhes sobre as regras do udev e sua sintaxe, consulte a Seção 17.6, “Influenciando o gerenciamento de eventos de dispositivo do Kernel com as regras do udev”.
Cada evento recebido é comparado com o conjunto de regras fornecido. As regras podem adicionar ou modificar chaves de ambiente de eventos, solicitar um nome específico a ser criado pelo nó do dispositivo, adicionar links simbólicos apontando para o nó ou adicionar programas a serem executados após a criação do nó do dispositivo. Os uevents de núcleo do driver são recebidos de um soquete netlink do kernel.
Os drivers de barramento de kernel pesquisam dispositivos. Para cada dispositivo detectado, o kernel cria uma estrutura de dispositivo interna enquanto o núcleo do driver envia um uevent ao daemon udev. Dispositivos de barramento se identificam através de um ID formatado especialmente, que informa o tipo de dispositivo. Geralmente esses IDs consistem em IDs de produto e fornecedor, além de outros valores específicos do subsistema. Cada barramento tem seu próprio esquema para esses IDs, chamados MODALIAS. O kernel toma as informações do dispositivo, compõe uma string de ID MODALIAS a partir dele e envia essa string junto com o evento. Para um mouse USB, a string tem a seguinte aparência:
MODALIAS=usb:v046DpC03Ed2000dc00dsc00dp00ic03isc01ip02
Cada driver de dispositivo carrega uma lista de álias conhecidos para os dispositivos que pode tratar. A lista está contida no próprio arquivo de módulo de kernel. O programa depmod lê as listas de ID e cria o arquivo modules.alias no diretório /lib/modules do kernel para todos os módulos disponíveis atualmente. Com essa infraestrutura, carregar o módulo é fácil como chamar modprobe para cada evento com uma chave MODALIAS. Se modprobe $MODALIAS for chamado, ele corresponderá o álias do dispositivo composto para o dispositivo com os álias fornecidos pelos módulos. Se uma entrada correspondente for encontrada, o módulo será carregado. Tudo isso é acionado automaticamente pelo udev.
Todos os eventos de dispositivo que ocorrem durante o processo de boot antes da execução do daemon udev são perdidos, pois a infraestrutura para gerenciar esses eventos reside no sistema de arquivos raiz e não está disponível naquele momento. Para cobrir essa perda, o kernel fornece um arquivo uevent localizado no diretório de dispositivo de cada dispositivo no sistema de arquivos sysfs. Ao gravar add para esse arquivo, o kernel envia novamente o mesmo evento como o evento perdido durante a inicialização. Um loop simples em todos os arquivos uevent em /sys aciona todos os eventos novamente para criar os nós de dispositivo e executar a configuração do dispositivo.
Por exemplo, durante o boot, um mouse USB talvez não seja inicializado pela lógica de boot anterior, pois o driver não está disponível nesse momento. O evento para a descoberta do dispositivo foi perdido e não encontrou um módulo de kernel para o dispositivo. Em vez de pesquisar manualmente pelos dispositivos que podem estar conectados, o udev solicita todos os eventos de dispositivo do kernel após a disponibilização do sistema de arquivos raiz, dessa forma, o evento para o dispositivo de mouse USB é executado novamente. Então ele encontra o módulo de kernel no sistema de arquivos raiz montado e o mouse USB pode ser inicializado.
No espaço do usuário, não há diferença visível entre a sequência coldplug do dispositivo e a descoberta de dispositivo durante o tempo de execução. Em ambos os casos, as mesmas regras são usadas para correspondência e os mesmos programas configurados são executados.
udev em execução #
O programa udevadm monitor pode ser usado para visualizar os eventos centrais do driver e a temporização dos processos de eventos do udev.
UEVENT[1185238505.276660] add /devices/pci0000:00/0000:00:1d.2/usb3/3-1 (usb) UDEV [1185238505.279198] add /devices/pci0000:00/0000:00:1d.2/usb3/3-1 (usb) UEVENT[1185238505.279527] add /devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0 (usb) UDEV [1185238505.285573] add /devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0 (usb) UEVENT[1185238505.298878] add /devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input10 (input) UDEV [1185238505.305026] add /devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input10 (input) UEVENT[1185238505.305442] add /devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input10/mouse2 (input) UEVENT[1185238505.306440] add /devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input10/event4 (input) UDEV [1185238505.325384] add /devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input10/event4 (input) UDEV [1185238505.342257] add /devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input10/mouse2 (input)
As linhas UEVENT mostram os eventos que o kernel enviou através de netlink. As linhas UDEV mostram os handlers de evento do udev concluídos. A temporização é impressa em microssegundos. O tempo entre UEVENT e UDEV é o tempo que udev levou para processar esse evento ou que o daemon udev atrasou sua execução para sincronizar esse evento com eventos relacionados e já em execução. Por exemplo, eventos para partições de disco rígido sempre esperam pela conclusão do evento do dispositivo de disco principal, pois os eventos de partição podem se basear nos dados que o evento de disco principal consultou do hardware.
udevadm monitor --env mostra o ambiente de evento completo:
ACTION=add DEVPATH=/devices/pci0000:00/0000:00:1d.2/usb3/3-1/3-1:1.0/input/input10 SUBSYSTEM=input SEQNUM=1181 NAME="Logitech USB-PS/2 Optical Mouse" PHYS="usb-0000:00:1d.2-1/input0" UNIQ="" EV=7 KEY=70000 0 0 0 0 REL=103 MODALIAS=input:b0003v046DpC03Ee0110-e0,1,2,k110,111,112,r0,1,8,amlsfw
O udev também envia mensagens para o syslog. A prioridade syslog padrão que controla as mensagens que são enviadas ao syslog é especificada no arquivo de configuração do udev /etc/udev/udev.conf. A prioridade de registro do daemon em execução pode ser modificada com udevcontrol log_priority=level/number.
udev #
Uma regra do udev pode corresponder a qualquer propriedade que o kernel adiciona ao evento propriamente dito ou a qualquer informação que o kernel exporta 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ó do dispositivo, adicionar links simbólicos apontando para o nó ou executar um programa especificado como parte do gerenciamento 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. As informações detalhadas sobre a sintaxe da regra e as chaves fornecidas para corresponder ou importar os dados estão descritas na página de manual do udev. As regras de exemplo a seguir apresentam uma introdução básica à sintaxe da regra do udev. As regras de exemplo foram todas tiradas do conjunto de regras padrão do udev localizado em /etc/udev/rules.d/50-udev-default.rules.
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 link simbólico para a primeira impressora USB lp seria /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 a regra for maior do que uma linha, use \ para unir as linhas diferentes como se faz 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.
udev #Ao criar chaves, você pode escolher dentre diversos operadores diferentes, dependendo do tipo de chave que quiser criar. Normalmente, as chaves de correspondência são usadas para localizar um valor que corresponda ou explicitamente não corresponda ao valor da 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.
udev #
As regras do udev suportam o uso de marcadores e substituições. Use-as como faria em qualquer outro script. É possível usar as seguintes substituições com as 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 $.
udev #
As chaves de correspondência descrevem as condições que devem ser atendidas para aplicar 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 vendor, você poderia usar ATTR{vendor}=="On[sS]tream", por exemplo.
KERNELS
Permitem que o udev pesquise o caminho do dispositivo para encontrar um nome de dispositivo correspondente.
SUBSYSTEMS
Permitem que o udev pesquise o caminho do dispositivo para encontrar um nome de subsistema do dispositivo correspondente.
DRIVERS
Permitem que o udev pesquise o caminho do dispositivo para encontrar um nome de driver do dispositivo correspondente.
ATTRS{nome de arquivo}
Permitem que o udev pesquise o caminho do dispositivo para encontrar um com valores de atributo sysfs correspondentes.
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
Permite 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.
udev #
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 do dispositivo mantidos pelo udev.
NAME
O nome do nó de dispositivo a ser criado. Depois que uma regra definir o nome de um nó, todas as outras regras com a chave NAME referente a esse nó serão ignoradas.
SYMLINK
O nome de um link simbólico relacionado ao nó a ser criado. Várias regras de correspondência podem adicionar links simbólicos a serem criados com o nó do dispositivo. Você também pode especificar vários links simbólicos para um nó em uma regra usando o caractere de espaço para separar os nomes dos links simbólicos.
OWNER, GROUP, MODE
As permissões do novo nó de dispositivo. Os valores especificados aqui sobregravam qualquer coisa que tenha sido compilada.
ATTR{chave}
Especifica um valor para ser gravado no 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}
Indica 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
Indica ao udev para adicionar um programa à lista de programas a serem executados neste 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
Indica ao udev para ignorar uma quantidade de regras e continuar com uma que inclua o rótulo citado 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 for especificado, o udev tentará determinar o tipo sozinho, com base na parte executável das permissões do 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
Indica ao udev para aguardar a criação do arquivo sysfs especificado para 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.
O diretório do dispositivo dinâmico e a infraestrutura de regras do udev possibilitam especificar nomes estáveis para todos os dispositivos de disco, independentemente da ordem de reconhecimento ou da conexão usada para o dispositivo. Cada dispositivo de bloco apropriado criado pelo kernel é examinado por ferramentas com conhecimento especial sobre determinados barramentos, tipos de unidade ou sistemas de arquivos. Com o nome do nó do dispositivo fornecido pelo kernel dinâmico, o udev mantém as classes de links persistentes apontando para o dispositivo:
/dev/disk
|-- by-id
| |-- scsi-SATA_HTS726060M9AT00_MRH453M4HWHG7B -> ../../sda
| |-- scsi-SATA_HTS726060M9AT00_MRH453M4HWHG7B-part1 -> ../../sda1
| |-- scsi-SATA_HTS726060M9AT00_MRH453M4HWHG7B-part6 -> ../../sda6
| |-- scsi-SATA_HTS726060M9AT00_MRH453M4HWHG7B-part7 -> ../../sda7
| |-- usb-Generic_STORAGE_DEVICE_02773 -> ../../sdd
| `-- usb-Generic_STORAGE_DEVICE_02773-part1 -> ../../sdd1
|-- by-label
| |-- Photos -> ../../sdd1
| |-- SUSE10 -> ../../sda7
| `-- devel -> ../../sda6
|-- by-path
| |-- pci-0000:00:1f.2-scsi-0:0:0:0 -> ../../sda
| |-- pci-0000:00:1f.2-scsi-0:0:0:0-part1 -> ../../sda1
| |-- pci-0000:00:1f.2-scsi-0:0:0:0-part6 -> ../../sda6
| |-- pci-0000:00:1f.2-scsi-0:0:0:0-part7 -> ../../sda7
| |-- pci-0000:00:1f.2-scsi-1:0:0:0 -> ../../sr0
| |-- usb-02773:0:0:2 -> ../../sdd
| |-- usb-02773:0:0:2-part1 -> ../../sdd1
`-- by-uuid
|-- 159a47a4-e6e6-40be-a757-a629991479ae -> ../../sda7
|-- 3e999973-00c9-4917-9442-b7633bd95b9e -> ../../sda6
`-- 4210-8F8C -> ../../sdd1udev #/sys/*
Sistema de arquivos virtual fornecido pelo kernel do Linux, exportando todos os dispositivos conhecidos atualmente. Essas informações são usadas pelo udev para criar nós de dispositivo em /dev
/dev/*
Nós de dispositivo criados dinamicamente e conteúdo estático criado com systemd-tmpfiles. Para obter mais informações, consulte a página de manual systemd-tmpfiles(8).
Os arquivos e os diretórios a seguir incluem elementos cruciais da infraestrutura do udev:
/etc/udev/udev.conf
Arquivo de configuração principal do udev.
/etc/udev/rules.d/*
Regras de correspondência de evento do udev.
/usr/lib/tmpfiles.d/ e /etc/tmpfiles.d/
Responsáveis pelo conteúdo do /dev estático.
/usr/lib/udev/*
Programas ajudantes chamados de regras do udev.
Para obter mais informações sobre a infraestrutura do udev, consulte as seguintes páginas de manual:
udev
Informações importantes sobre udev, chaves, regras e outras questões essenciais de configuração.
udevadm
É possível usar o udevadm para controlar o comportamento de tempo de execução do udev, solicitar eventos do kernel, gerenciar a fila de eventos e fornecer mecanismos simples de depuração.
udevd
Informações sobre o daemon de gerenciamento de eventos do udev.