sysfs e devtmpfs

3

Ulrich Dangel explica muito bem a diferença entre o devtmpfs e o udev.

E o sysfs?

Eu entendo que o kernel usa o sysfs para exportar nós de dispositivos para o espaço do usuário a ser usado pelo udev. Então devtmpfs e sysfs são os mesmos? Se sim, por que eles usam nomes diferentes? Se não, qual é a diferença real entre sysfs e devtmpfs?

    
por Daniel 16.10.2015 / 02:49

2 respostas

4

the kernel use sysfs to export device nodes to user space to be used by udev

Não. Sysfs não contém nós de dispositivo. O Sysfs contém principalmente arquivos que fornecem informações sobre dispositivos, bem como alguns arquivos que permitem que os processos controlem como os dispositivos operam. Mas a maior parte dos dispositivos não pode ser usada com o que o sysfs fornece.

Vamos pegar um disco rígido, por exemplo. Há um diretório para ele em algum lugar em /sys/devices , com um caminho que depende de como ele está conectado ao computador (por exemplo, /sys/devices/pci0000:00/… para um disco conectado a um controlador conectado ao barramento PCI principal do computador). Nesse diretório, você pode encontrar várias informações, como seu tamanho, se é removível, seu estado de energia, etc. Existem subdiretórios para partições também. Mas não há nada lá que forneça acesso ao conteúdo do disco. Em outros lugares em /sys , há links simbólicos para o diretório correspondente a esse disco: em /sys/block , em /sys/class/block , etc. Mas ainda nada para acessar o conteúdo do disco.

Em /dev , a entrada para o disco é um arquivo especial - um dispositivo de bloqueio . Este arquivo permite que os processos leiam e gravem o conteúdo do disco. (Embora para um disco que geralmente não acontece, em vez disso o conteúdo do disco - ou de uma partição - é montado, então o kernel está acessando o dispositivo, os processos não.)

Os arquivos de dispositivos permitem que algumas operações, além de ler e escrever conteúdo, sejam feitas por meio de ioctl . Seria possível fornecer todas as informações e interfaces de controle fornecidas pelo sysfs através do ioctl no arquivo do dispositivo. No entanto, isso seria menos conveniente por vários motivos:

  • Com arquivos separados em /sys , as permissões podem ser definidas com granulação fina. Com um único arquivo por dispositivo em /dev , é tudo ou nada.
  • Arquivos separados podem ser lidos e gravados facilmente pelos aplicativos. Você pode usar apenas cat ou echo . Com o ioctl, é muito mais difícil: não há interface shell, geralmente nenhuma interface em outras linguagens de alto nível.
  • Com o ioctl, o comando deve ser codificado em um número em vez de um nome, e o formato dos argumentos deve ser definido em um nível binário. Usar nomes e formatos de texto simples facilita a gravação de software.

Indo na outra direção, seria possível fornecer acesso ao conteúdo do dispositivo por meio de um arquivo no sysfs. Mas isso exigiria trabalho extra no kernel: o sysfs foi projetado principalmente para servir arquivos pequenos e links simbólicos e sem o suporte ioctl que os aplicativos existentes esperam. Eu não acho que haveria um benefício significativo em expandir o sysfs para suportar tipos de dispositivos existentes, daí a existência continuada de arquivos de dispositivos.

O Sysfs é automaticamente preenchido pelo kernel, refletindo os dispositivos realmente disponíveis em tempo real. O significado de um arquivo no sysfs vem de seu caminho, que é escolhido pelo driver que fornece esse arquivo. /dev funciona de maneira diferente: o significado de um arquivo vem do tipo de arquivo do dispositivo (bloco ou caractere) e seus números principais e secundários (é o que ls -l lista em vez do tamanho do arquivo de um dispositivo). Tradicionalmente, /dev era estático, com arquivos de dispositivos criados durante a instalação do sistema; mas isso não funciona tão bem quando os dispositivos podem ser hotplugged, daí o desejo de um /dev dinâmico que reflete os dispositivos conectados em tempo real.

O Linux passou por várias iterações de um dinâmico /dev . O Linux 2.4 tem devfs , onde o kernel cria automaticamente entradas para refletir os dispositivos conectados. Mas isso foi não tão legal , porque codificou as políticas de nomeação e permissão de dispositivos para o kernel, então foi substituído pelo programa udev da userland para gerenciar policy, e /dev em um sistema de arquivos tmpfs simples (um sistema de arquivos na memória sem significado especial para o kernel). E então o devfs fez um retorno parcial, com o devtmpfs , que é uma instância do tmpfs onde as entradas para os dispositivos disponíveis são criadas automaticamente pelo kernel, mas o udev faz todo o gerenciamento que quiser além disso.

    
por 18.10.2015 / 01:56
2

Do arquivo de documentação do kernel sysfs.txt :

sysfs is a ram-based filesystem initially based on ramfs. It provides a means to export kernel data structures, their attributes, and the linkages between them to userspace.

De uma enviar mensagem para o fonte do kernel:

Devtmpfs lets the kernel create a tmpfs instance called devtmpfs very early at kernel initialization, before any driver-core device is registered. Every device with a major/minor will provide a device node in devtmpfs.

Basicamente sysfs é montado em /sys e contém informações e estatísticas sobre nomes de dispositivos e dispositivos.

devtmpfs é montado em /dev e contém os arquivos de dispositivos especiais para todos os dispositivos.

    
por 17.10.2015 / 17:01