Share

De que forma poderíamos detectar sob o Linux que um pendrive foi inserido no sistema através de uma linguagem de programação? Veremos que através da libudev temos acesso ao gerenciador de dispositivos do Linux, o udev, usando linguagem C! Gerenciando dispositivos por software com libudev é uma forma que temos para alcançar isso em Linux.

udev3

Introdução

udev é o gerenciador de dispositivos para o kernel Linux. Como o sucessor do devfsd e o hotplug, udev gerencia principalmente nós de dispositivos no diretório /dev. Ao mesmo tempo, o udev também gerencia todos os eventos de usuário que surgem quando dispositivos de hardware são adicionados ao sistema ou removidos, incluindo carregamento de firmware conforme requeridos por alguns dispositivos.

Ao contrário dos sistemas tradicionais de Unix, onde os nós de dispositivo no diretório /dev era um conjunto estático de arquivos, o gerenciador de dispositivos do Linux, udev, fornece dinamicamente apenas os nós para os dispositivos realmente presentes em um sistema. Embora dvfs fosse usado para fornecer funcionalidade semelhante, Greg Kroah-Hartman citou uma série de razões [2] para preferir a implementação do udev sobre devfs:

  • udev suporta nomes de dispositivos persistentes, que não depende, por exemplo, da ordem em que os dispositivos são conectados ao sistema. A configuração padrão do udev fornece nomes persistentes para dispositivos de armazenamento. Qualquer disco rígido é reconhecido pelo seu ID único no sistema de arquivos, o nome do disco e da localização física no hardware que está conectado.
  • udev executa inteiramente a partir do espaço de usuário, ao contrário do devfs, que roda no espaço de kernel. Uma conseqüência disso é que o udev mudou a política de nomeação para fora do kernel e pode executar programas arbitrários para compor um nome para o dispositivo a partir de propriedades do dispositivo, antes que o nó seja criado. Lá, todo o processo é também interruptível e funciona com uma prioridade mais baixa.

O udev, como um todo, é dividido em três partes:

  • A biblioteca libudev que permite acessar informações do dispositivo. Foi incorporada dentro do pacote de software systemd
  • O Daemon de espaço de usuário udevd, que gerencia o diretório /dev
  • O utilitário de linha de comando udevadm para diagnósticos

O sistema recebe chamadas do kernel através de socket netlink. As versões anteriores que utilizavam hotplug, acrescentavam um link para si em /etc/hotplug.d/default com esta finalidade.

Hotplugging nos sistemas Linux modernos

Hotplugging (que é a palavra usada para descrever o processo de inserção de dispositivos num sistema) são obtidos de uma distribuição Linux por uma combinação de três componentes: o Udev, HAL, e Dbus.

Conforme dito antes, o udev fornece um diretório de dispositivo dinâmico contendo apenas os nós de dispositivos que estão conectados ao sistema. Ele cria ou remove os arquivos do nó de dispositivo no diretório /dev conforme eles são conectados ou retirados do sistema. Dbus é como um barramento de sistema que é usado para comunicação entre processos. O HAL recebe informações do serviço udev, quando um dispositivo é conectado ao sistema e cria uma representação XML desse dispositivo. Em seguida, ele notifica a algum aplicativo de desktop correspondente como Nautilus através do Dbus e o Nautilus irá abrir o dispositivo montado.

Udev também tem uma interface de script poderoso (com arquivos comumente localizadas em /etc/udev/rules.d) que distribuidores (e usuários finais) costumam usar para personalizar a forma como nós de dispositivos são criados. Propriedades personalizáveis ​​incluem permissões de arquivos, localização dentro do sistema de arquivos e links simbólicos.

A biblioteca libudev

Através da libudev podemos ter acesso a todas as funcionalidades oferecidas pelo o udev para detecção de dispositivos e obteção de informações desses dispositivos usando a linguagem C. Se você estivesse codificando um player de audio e vídeo como o citado no artigo anterior e precisasse detectar se um pendrive foi inserido no sistema, para tocar as músicas ou vídeos contidos nele, a libudev seria escolha certa para isso.

Usando libudev, nós vamos ser capazes de inspecionar os dispositivos, incluindo o seu ID de fornecedor (VID), identificação do produto (PID), número de série e as strings do aparelho, sem precisar abri-lo. Além disso, libudev vai nos dizer exatamente onde dentro de /dev o nó de dispositivo está localizado, dando à aplicação de forma robusta e independente de distribuição  acesso ao dispositivo.

Para construir um aplicativo com suporte a libudev basta incluir o cabeçalho libudev.h e passar -ludev para o compilador a fim de linkar a biblioteca ao aplicativo.

Exemplo de libudev

O primeiro exemplo obtém uma lista dos objetos hidraw conectados ao sistema, e imprime seu caminho do nó de dispositivo, strings do fabricante e número de série. Para fazer isso, um objeto udev_enumerate é criado, e a cadeia de texto “hidraw” é especificado para ser usado como um filtro.

Para compilar esse código use a linha de comando abaixo:

Referências

http://www.linux.com/news/hardware/peripherals/180950-udev

http://www.kroah.com/linux/talks/ols_2003_udev_paper/Reprint-Kroah-Hartman-OLS2003.pdf

http://www.freedesktop.org/software/systemd/libudev/

http://www.signal11.us/oss/udev/

Translate »