Aula #8 - Dispositivos e UDEV



O Linux utiliza o udev, que é um descobridor inteligente de hardware e periféricos, um gerenciador dinâmico de dispositivos. Ele atua na inicialização do sistema e quando dispositivos são conectados ou removidos. Nós de Dispositivos são criadas automaticamente e, em seguida, usado por aplicativos e subsistemas do sistema operacional para se comunicar com dispositivos. 
Os administradores de sistema podem controlar como o udev opera criando regras (rules) para o udev que garantem os resultados desejados.


 Dispositivos de caracteres e de blocos tem nós de dispositivos no /dev; controladores de rede em não. Estes nós de dispositivo podem ser usados por programas para se comunicar com dispositivos, utilizando chamadas de sistema de I/O como open(), close(), read(), e write(). Por outro lado, os dispositivos de rede funcionam transmitindo e recebendo os pacotes, que devem ser construídos dividindo grandes volumes de dados, ou criando de volta os dados volumosos a partir de vários pequenos pacotes.

Um driver pode gerenciar vários nós de dispositivos que normalmente ficam na pasta /dev :
$ ls -l /dev
total 0
crw------- 1 coop audio 14, 4 Jul 9 01:54 audio
crw------- 1 root root 10, 62 Jul 9 01:54 autofs
lrwxrwxrwx 1 root root 4 Jul 9 01:54 cdrom -> scd0
lrwxrwxrwx 1 root root 4 Jul 9 01:54 cdrw -> scd0
crw------- 1 coop root 5, 1 Jul 9 06:54 console
....
lrwxrwxrwx 1 root root 4 Jul 9 01:54 dvd -> scd0
lrwxrwxrwx 1 root root 4 Jul 9 01:54 dvdwriter -> scd0
crw------- 1 root root 10, 228 Jul 9 01:54 hpet
crw-r----- 1 root kmem 1, 2 Jul 9 01:54 kmem
crw------- 1 root root 1, 11 Jul 9 01:54 kmsg
crw-r----- 1 root kmem 1, 1 Jul 9 01:54 mem
crwxrwxrwx 1 root root 1, 3 Jul 9 01:54 null
crw-rw---- 1 root root 10, 144 Jul 9 01:54 nvram
brw------- 1 coop disk 11, 0 Jul 9 01:54 scd0
....
brw-r----- 1 root disk 8, 0 Jul 9 01:53 sda
brw-r----- 1 root disk 8, 1 Jul 9 01:53 sda1

brw-r----- 1 root disk 8, 2 Jul 9 06:54 sda2
....
brw-r----- 1 root disk 8, 16 Jul 9 01:53 sdb
brw-r----- 1 root disk 8, 17 Jul 9 01:53 sdb1
brw-r----- 1 root disk 8, 18 Jul 9 01:53 sdb2
....
crw------- 1 coop audio 14, 1 Jul 9 01:54 sequencer
crw------- 1 coop audio 14, 8 Jul 9 01:54 sequencer2
crw-rw-rw- 1 root tty 5, 0 Jul 9 01:54 tty
crw-rw---- 1 root root 4, 0 Jul 9 14:54 tty0
crw------- 1 root root 4, 1 Jul 9 06:54 tty1
cr--r--r-- 1 root root 1, 9 Jul 9 01:53 urandom
....
crw-rw-rw- 1 root root 1, 5 Jul 9 01:54 zero



Nós de dispositivos podem ser criados com:
$ sudo mknod [-m mode] /dev/name


e.g., mknod -m 666 /dev/mycdrv c 254 1


 

 



números major e minor


Os números major e minor identificam o driver associado com o dispositivo. Na maioria dos casos (mas não todos) nós de dispositivos do mesmo tipo (bloco ou de caracteres) com o mesmo número major usar o mesmo driver.

Se você listar alguns nós de dispositivos como em:
$ ls -l /dev/sda*
brw-rw---- 1 root disk 8,  0 Dec 29 06:40 /dev/sda
brw-rw---- 1 root disk 8,  1 Dec 29 06:40 /dev/sda1
brw-rw---- 1 root disk 8,  2 Dec 29 06:40 /dev/sda2
.......
Os números major e minor aparecem no mesmo lugar que o tamanho do arquivo ficaria quando se olha um arquivo normal; no comando acima eles são por exemplo 8, 1,. Enquanto os usuários normais provavelmente nunca vão precisar se preocupar com os números major e minor, já que é possível acessar um dispositivo através de um arquivo no /dev, os administradores de sistema podem ter que criar um nó de dispositivo vez em quando, principalmente quando o sistema está confuso.
 
O número minor é usado pelo driver para diferenciar entre dispositivos diferentes para controlar como eles são usados. Eles podem tanto ser diferentes instâncias do mesmo tipo de dispositivo (como a primeira e segunda placas de som, ou partições do disco rígido) ou diferentes modos de operação de um dispositivo (como densidade diferentes para uma unidade de disquete).

Números de dispositivo têm significado no espaço do usuário também. Duas chamadas de sistema, mknod() e stat(), retornam informações sobre números major e minor.



udev


Os métodos de gestão de nós de dispositivos ficaram desajeitados quando Linux evoluiu. O número de nós de dispositivo presentes no /dev e seus subdiretórios atingiu números na casa dos 15.000 - 20.000 durante a versão 2.4 do kernel. Nós para todos os tipos de dispositivos possíveis e imagináveis estavam disponíveis, e mesmo que nunca fossem usados ​​na maioria das instalações, eram criados por padrão, como era impossível prever com precisão quando eles seriam necessários.

Obviamente isso incomodou muitos desenvolvedores e administradores de sistemas, principalmente os que tinham foco em configurações embarcadas. Naquela época gerenciar o /dev era essencialmente uma tarefa manual e sujeita a erros.

Mesmo que os nós de dispositivos não sejam arquivos normais, e não ocupem muito espaço, ter grandes quantidades de arquivos e diretórios tornava o sistema mais lento, principalmente para o primeiro acesso. Além disso, com tantos arquivos criados sem necessidade prática, todos os números major e minor foram consumidos, o que tornava difícil criar novos nós, quando necessário. Para resolver estes prolemas, uma abordagem dinâmica era necessária. O ideal seria registrar dispositivos pelo nome. No entanto, os números major e minor não podem ser descartados porque eles fazem parte do padrão POSIX. (POSIX é um acrônimo para Portable Operating System Interface, uma família de normas destinadas a assegurar a compatibilidade entre os diferentes sistemas operacionais.)

O método udev cria os nós de dispositivos em tempo real quando eles são necessários. Não há necessidade de manter uma infinidade de nós de dispositivos que nunca serão usados. O u em udev significa usuário, e indica que a maior parte do trabalho de criar, remover e modificar os nós de dispositivos é feito no espaço do usuário.

O udev lida com a geração dinâmica de nós de dispositivo e ele evoluiu para substituir mecanismos anteriores, como o devfs e o hotplug. Um recurso interessante é o suporte de nomes de dispositivo persistentes. Este recurso garante que o nome que um dispositivo recebe não depende da ordem de conexão do dispositivo. Tal comportamento é controlado por rules (regras) do udev.

O udev é executado como um daemon (ou udevd ou systemd-udevd) e monitora um socket netlink. Quando novos dispositivos são inseridos ou removidos, o kernel envia uma mensagem através do socket, que o udev recebe e toma as medidas necessárias para criar ou remover os nós de dispositivo e faz as outras tarefas definidas nas regras do dispositivo.

Os três componentes do udev são:
  •     A biblioteca libudev que permite o acesso a informações sobre os dispositivos.
  •     O daemon udevd que gerencia o /dev.
  •     O utilitário udevadm para controle e diagnóstico.

A maneira mais limpa para usar o udev é em um sistema em que o diretório /dev está vazio. O udev se encarrega de preencher com nós de dispositivos a medida que eles são necessários. Quando usado desta forma, deve-se iniciar usando uma imagem initramfs, que pode conter um conjunto de nós de dispositivos preliminares, bem como a infraestrutura do udev.

A medida que dispositivos são adicionados e removidos do sistema, o sub-sistema de hotplug (conexão a quente) udev atua notificando e reagindo a eventos para criar e remover nós de dispositivos (device nodes). As informações necessárias para criá-los como nomes corretos, números major e minor, permissões, etc, são obtidas do sistema de arquivos virtual sysfs (montado em /sys) e de arquivos de configuração.

O arquivo de configuração principal é /etc/udev/udev.conf. Ele contém informações como onde colocar os nós de dispositivos, permissões, e donos, etc. Por padrão as regras que definem os nomes de dispositivos estão no diretório /etc/udev/rules.d. A man page do udev (man udev) fornece uma série de informações específicas sobre como definir regras para diversas situações.

Quando o udev recebe uma mensagem a partir do kernel sobre dispositivos que estão sendo adicionados ou removidos, ele analisa os arquivos de regras na pasta /etc/udev/rules.d/*.rules para ver se existem regras relevantes para o dispositivo que está sendo adicionado ou removido.


Em seguida, toma as medidas apropriadas, incluindo:
  •     Determinar o nome correto para o nó de dispositivos.
  •     Criar o nó do dispositivo e links simbólicos.
  •     Definir permissões para o nó de dispositivo.
  •     Tomar outras ações para inicializar e disponibilizar o dispositivo.

Estas regras são totalmente flexíveis e configuráveis.

Os arquivos de regras do udev estão na pasta /etc/udev/rules.d/.rules com nomes como:
    30-usb.rules
    90-mycustom.rules  


Por padrão, quando o udev lê os arquivos de regras ele procura por arquivos que têm a extensão .rules. Se encontrar mais de um arquivo, ele lê os arquivos um por um, em ordem alfabética crescente. O nome de arquivo de regras padrão é geralmente um número de dois dígitos seguido por um nome descritivo (para as regras), terminando com a extensão .rules.

 O formato para uma regra do udev é simples:

valor [, ...] valor [, ...]


Existem duas partes distintas em uma única linha:

    A primeira parte consiste em um ou mais pares de correspondência indicados por ==. Estes tentam combinar os atributos de um dispositivo e / ou características de algum valor.
    
    A segunda parte consiste em um ou mais de atribuição de pares chave-valor que atribuem um valor a um nome, como um nome de arquivo, associação a grupo, e até mesmo as permissões de arquivos, etc.

Se não for encontrada uma regra de correspondência, ele usa o nome do nó de dispositivo padrão e outros atributos.

Aqui um exemplo de regra para um dispositivo Fitbit:

$ cat /etc/udev/conf.d/rules.d/99-fitbit.rules  

SUBSYSTEM=="usb", ATTR{idVendor}=="2687", ATTR{idProduct}=="fb01", SYMLINK+="fitbit", MODE="0666"


 
$ cat /etc/udev/conf.d/rules.d/98-kexec.rules
 
SUBSYSTEM=="cpu", ACTION=="online", PROGRAM="/bin/systemctl try-restart kdump.service" SUBSYSTEM=="cpu", ACTION=="offline", PROGRAM="/bin/systemctl try-restart kdump.service" SUBSYSTEM=="memory", ACTION=="add", PROGRAM="/bin/systemctl try-restart kdump.service" SUBSYSTEM=="memory", ACTION=="remove", PROGRAM="/bin/systemctl try-restart kdump.service"


 
$ cat 80-kvm.rules  
KERNEL=="kvm", GROUP="kvm", MODE="0666"
 
$ cat 99-fuse.rules  
KERNEL=="fuse", MODE="0666",OWNER="root",GROUP="root"







Mais vistos no mês:

As melhores distribuições Linux para 2017

TuxMath - Tux, do Comando da Matemática. Ensino e diversão a crianças.

Teste de Performance de Rede com Iperf

DHCP - Guia Completo

Aula #14 - Os sistemas de arquivos ext2/ext3/ext4

OPNsense - Firewall Open Source

Ophcrack: Descubra todas as senhas do Windows

SSD no linux

Oracle Linux 7.0 Server com Xfce - Instalação e configurações iniciais