Por que as interfaces de rede não estão no / dev como outros dispositivos?

70

Estou curioso, mas por que as interfaces de rede não estão no / dev? Existem outros tipos de dispositivos que não são representados como um nó em / dev?

andyortlieb
fonte
2
Eu já vi pelo menos um artigo / discurso retórico sobre como tudo no Unix não é um arquivo, apesar do mantra, e cita esse problema. Não consigo encontrá-lo agora, mas provavelmente foi um artigo sobre o Plano 9 ou o GNU Hurd.
Shawn J. Goff
3
Pelo menos no Solaris, existem dispositivos de interface de rede em / dev (/ devices atualmente).
Jlliagre 25/10
2
Tudo no Unix sendo um arquivo não significa necessariamente que ele se comporte dessa maneira a toda a região do usuário, apenas que as APIs subjacentes operam de maneira saudável e uniforme nos descritores de arquivo. Quando você abre um socket, por exemplo, você pode usar read()e write()da mesma forma que você faria em um arquivo, mas as funções de utilidade recv()e send()fazer muito mais trabalho braçal para você.
Jgoldschrafe 26/10/11
11
Essa era uma pergunta que eu estava me perguntando há anos. Obrigado por perguntar e para que as pessoas tenham respondido!
21416 Dolanor

Respostas:

43

Em muitos dispositivos, as principais operações são enviar bytes do computador para um periférico ou receber bytes de um periférico no computador. Esses dispositivos são semelhantes aos tubos e funcionam bem como dispositivos de caracteres . Para operações que não estão lendo e gravando (como controle de fluxo em uma linha serial), o dispositivo fornece comandos ad-hoc chamados ioctl .

Alguns dispositivos são muito parecidos com arquivos comuns: são feitos de um número finito de bytes, e o que você escreve em uma determinada posição pode ser lido posteriormente na mesma posição. Esses dispositivos são chamados de dispositivos de bloco .

As interfaces de rede são mais complexas: o que eles lêem e escrevem não são bytes, mas pacotes. Embora ainda fosse possível usar a interface usual com reade write, seria estranho: presumivelmente, cada chamada writeenviaria um pacote e cada chamada readreceberia um pacote (e se o buffer for muito pequeno para o pacote caber, o pacote seria perdido).

As interfaces de rede podem existir apenas como dispositivos que fornecem ioctl. De fato, é isso que algumas variantes do unix fazem, mas não o Linux. Há alguma vantagem nessa abordagem; por exemplo, no Linux, as interfaces de rede podem aproveitar o udev . Mas as vantagens são limitadas, e é por isso que não foi feito.

A maioria dos aplicativos relacionados à rede não se importa com interfaces de rede individuais, eles trabalham em um nível superior. Por exemplo, um navegador da web deseja fazer conexões TCP e um servidor da web deseja escutar conexões TCP. Para esse propósito, o que seria útil são dispositivos para protocolos de rede de alto nível, por exemplo

{ echo $'GET http://www.google.com/ HTTP/1.0\r';
  echo $'Host: www.google.com\r';
  echo $'\r' >&0; cat; } <>/dev/tcp/www.google.com/80

De fato, o ksh e o bash fornecem essa interface para clientes TCP e UDP. Em geral, no entanto, os aplicativos de rede são mais complexos que os aplicativos de acesso a arquivos. Enquanto trocas maioria dos dados são realizadas com chamadas análogas reade write, estabelecendo a conexão requer mais informação do que apenas um nome de arquivo. Por exemplo, a escuta de conexões TCP requer duas etapas: uma a ser executada quando o servidor começa a escutar e outra a cada vez que um cliente se conecta. Essas etapas extras não se encaixam bem na API do arquivo, que é o principal motivo pelo qual a rede possui sua própria API.

Outra classe de dispositivos que normalmente não possui entradas no /devLinux (mas possui outras variantes do Unix) são os adaptadores de vídeo. Em princípio, adaptadores de vídeo simples podem ser expostos como dispositivos buffer de quadro , que podem ser dispositivos de bloco feitos de blocos que representam a cor de cada pixel. Os adaptadores de vídeo acelerados podem ser representados como dispositivos de caracteres para os quais os aplicativos enviam comandos. Aqui, a desvantagem da interface do dispositivo é que ela é lenta: o aplicativo de exibição (na prática, um servidor X) precisaria fazer chamadas do kernel sempre que exibir alguma coisa. O que acontece é que o servidor X grava principalmente diretamente na memória do adaptador de vídeo, porque é mais rápido.

Gilles 'SO- parar de ser mau'
fonte
2
De fato, os adaptadores de vídeo acelerados são exportados como chardevs via DRI no Linux. De arquivo I / O operações não são neccessarily read/ writequalquer um; você pode usar mmappara arquivos mapeados e acesso direto à memória do dispositivo.
precisa saber é o seguinte
11

Você pode encontrá-lo no /sys/class/netdiretório link simbólico para outro arquivo /sys/device/../../, a seguir está a saída da minha máquina virtual (kernel 3.10). E você pode usar o comando udevadm info <filename>para examinar seu atributo

lrwxrwxrwx. 1 root root 0 Apr  3 13:38 ens33 -> ../../devices/pci0000:00/0000:00:11.0/0000:02:01.0/net/ens33
chaoqun lu
fonte
Bem-vindo ao U&L. Sempre use aspas ao redor do código embutido, especialmente se você usar <>o contrário, que será interpretado como marcação. (você também pode querer mudar seu nome para começar com uma transcrição ASCII, como as pessoas com teclados simples terá dificuldade de digitar o primeiro caractere do seu nome em resposta a quaisquer comentários que você faz)
Anthon
9

A maneira "ATN / Transportis Interface" (TLI) da AT&T / Solaris para fazer redes TCP / IP possui arquivos especiais como "/ dev / tcp" ou "/ dev / udp". O programador abre esse arquivo especial para obter um soquete de uma família de protocolos apropriada. Eu acho que é por isso que você precisa ter "-lnsl" ao compilar um programa que usa soquetes no Solaris: por baixo de tudo, é TLI.

Bruce Ediger
fonte
4
O Linux também possui /dev/tcpe /dev/udp, embora a maioria dos kernels o tenha desativado.
bahamat
3

Embora tradicionalmente o Linux não tenha sido totalmente compatível com posix, muito menos siga qualquer tipo de padrão do Open Group (fora do LSB). Houve tentativas de portar mais funcionalidades do UNIX no Linux.

O Glendix é um desses projetos que oferece uma porta do sistema de arquivos virtual / net do Plan9 que permite que você faça exatamente como você descreve.

Sistema de arquivos Port / net Plan9 para linux

Dwight Spencer
fonte