Compreendendo o / dev e seus subdiretórios e arquivos

52
$ ls -l /dev/stdin /dev/fd/0
lrwx------ 1 tim tim 64 2011-08-07 09:53 /dev/fd/0 -> /dev/pts/2
lrwxrwxrwx 1 root root 15 2011-08-06 08:14 /dev/stdin -> /proc/self/fd/0
$ ls -l /dev/pts/2 /proc/self/fd/0
crw--w---- 1 tim tty  136, 2 2011-08-07 09:54 /dev/pts/2
lrwx------ 1 tim tim     64 2011-08-07 09:54 /proc/self/fd/0 -> /dev/pts/2
  1. Eu queria saber se todos os arquivos em /deve seus subdiretórios são todos descritores de arquivos de dispositivos?
  2. Por que existem tantos links um do outro? Por exemplo, /dev/fd/0, /dev/stdin, /proc/self/fd/0estão todos os links para /dev/pts/2.
  3. Se lna lrwx------ligação média, o que faz cem crw--w---- média?
Tim
fonte
3
E para responder a # 3, o c significa dispositivo de caractere ou caractere especial . b significa bloco especial .
Felixphew

Respostas:

78

Quase todos os arquivos em /devsão arquivos de dispositivo . Enquanto a leitura e gravação em um arquivo normal armazena dados em um disco ou outro sistema de arquivos, o acesso a um arquivo de dispositivo se comunica com um driver no kernel, que geralmente se comunica com um pedaço de hardware (um dispositivo de hardware, daí o nome).

Existem dois tipos de arquivos de dispositivo: dispositivos de bloco (indicados por bcomo o primeiro caractere na saída de ls -l) e dispositivos de caracteres (indicados por c). A distinção entre dispositivos de blocos e caracteres não é completamente universal. Dispositivos de bloco são coisas como discos, que se comportam como arquivos grandes de tamanho fixo: se você escreve um byte em um determinado deslocamento e depois lê o dispositivo nesse deslocamento, recebe esse byte de volta. Os dispositivos de caracteres são praticamente qualquer outra coisa, onde escrever um byte tem algum efeito imediato (por exemplo, é emitido em uma linha serial) e a leitura de um byte também tem algum efeito imediato (por exemplo, é lido a partir da porta serial).

O significado de um arquivo de dispositivo é determinado pelo número, não pelo nome (o nome é importante para os aplicativos, mas não para o kernel). O número é na verdade dois números: o número principal indica qual driver é responsável por este dispositivo, e o número menor permite que um driver conduza vários dispositivos¹. Esses números aparecem na ls -llista, onde você normalmente encontra o tamanho do arquivo. Por exemplo, brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda→ este dispositivo é maior 8, menor 0.

Alguns arquivos de dispositivo em /devnão correspondem a dispositivos de hardware. Um que existe em todo sistema unix é /dev/null; gravar nele não tem efeito e a leitura dele nunca retorna nenhum dado. Geralmente é conveniente em scripts de shell, quando você deseja ignorar a saída de um comando ( >/dev/null) ou executar um comando sem entrada ( </dev/null). Outros exemplos comuns são /dev/zero(que retorna bytes nulos ad infinitum ) /dev/urandom(que retorna bytes aleatórios ad infinitum ).

Alguns arquivos de dispositivo têm um significado que depende do processo que o acessa. Por exemplo, /dev/stdindesigna a entrada padrão do processo atual; abrir from tem aproximadamente o mesmo efeito que abrir o arquivo original que foi aberto como entrada padrão do processo. De maneira semelhante, /dev/ttydesigna o terminal ao qual o processo está conectado. Atualmente, no Linux, os /dev/stdinamigos e os amigos não são implementados como dispositivos de caracteres, mas como links simbólicos para um mecanismo mais geral que permite que todos os descritores de arquivos sejam referenciados (em oposição a apenas 0, 1 e 2 no método tradicional); por exemplo, /dev/stdiné um link simbólico para /proc/self/fd/0. Veja Como o / dev / fd se relaciona com / proc / self / fd /? .

Você encontrará vários links simbólicos em /dev. Isso pode ocorrer por razões históricas: um arquivo de dispositivo foi movido de um nome para outro, mas alguns aplicativos ainda usam o nome antigo. Por exemplo, /dev/scd0é um link simbólico /dev/sr0no Linux; ambos designam o primeiro dispositivo de CD. Outra razão para links simbólicos é a organização: no Linux, você encontrará seus discos rígidos e partições em vários lugares: /dev/sdae /dev/sda1e amigos (cada disco designada por uma letra arbitrária, e partições de acordo com o layout da partição), /dev/disk/by-id/*(discos designado por um número de série único), /dev/disk/by-label/*(partições com um sistema de arquivos, designado por uma etiqueta escolhida pelo homem); e mais. Links simbólicos também são usados ​​quando um nome genérico de dispositivo pode ser um de vários; por exemplo/dev/dvdpode ser um link simbólico para /dev/sr0, ou pode ser um link para /dev/sr1se você tiver dois leitores de CD e o segundo for o leitor de DVD padrão.

Por fim, existem alguns outros arquivos nos quais você pode encontrar /dev, por motivos tradicionais. Você não encontrará o mesmo em todos os sistemas. Na maioria das unidades, /dev/logé um soquete usado pelos programas para emitir mensagens de log. /dev/MAKEDEVé um script que cria entradas no /dev. Nos sistemas Linux modernos, as entradas /dev/são criadas automaticamente pelo udev , obsoletas MAKEDEV.

Actually Na verdade, isso não é mais verdade no Linux, mas esse detalhe é importante apenas para os gravadores de driver de dispositivo.

Gilles 'SO- parar de ser mau'
fonte
Obrigado! Por "O significado de um arquivo de dispositivo é determinado por seu número", você quer dizer seu descritor de arquivo?
Tim
@ Tim: Não, os números aparecem na ls -llistagem em que você normalmente encontra o tamanho do arquivo, antes da data, por exemplo, brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda→ este dispositivo é maior 8, menor 0. Os números dos dispositivos não aparecem frequentemente na prática, apenas mencionei para dizer o que torna um dispositivo um dispositivo (mais importante, não é o nome do arquivo). Um número de descritor de arquivo tem apenas um significado em um processo específico.
Gilles 'SO- stop be evil' -
Não, abrir /dev/stdin(=> /proc/self/fd/0) no Linux não tem o mesmo efeito que duplicar a entrada padrão. Para ver a diferença, su - non_root_usere depois exec 5</dev/stdinirá falhar com "Permission Denied", mas exec 5<&0será bem sucedida. E não é só isso, o novo fd será aberta com diferentes bandeiras, tudo sobre o objeto de arquivo ( "descrip arquivo aberto ção " em POSIX jargão) será diferente (ponteiro de arquivo offset, / modo não bloqueio, etc).
mosvy 21/04
14
  1. Sim - diretamente ou como links simbólicos - /dev/é para isso.
  2. Para vários propósitos: às vezes para compatibilidade entre esquemas de nomeação, às vezes é necessário para o ambiente de trabalho - como no exemplo de /dev/stdin. Isso não aponta estaticamente para /dev/pts/2ou para qualquer outro - basta mudar para outro terminal e você verá. /dev/stdiné a entrada padrão da sua sessão atual do terminal. Esse também é um exemplo do por que ele precisa ser um link simbólico.
  3. Veja man mknode info coreutils 'mknod invocation'. Em geral, csignifica um tipo de dispositivo chararacter.
rozcietrzewiacz
fonte
3
"entrada padrão da sua sessão atual do terminal" é um pouco ambígua. /dev/stdinrefere-se à entrada padrão do processo que o abrirá. Tudo dentro /proc/$pidsão dados dependentes do processo e /proc/selfé um tipo de link simbólico mágico que aponta para os próprios dados do processo.
Stéphane Gimenez
11

Para sua primeira pergunta, eles não são descritores de arquivos, são arquivos de dispositivo. (também conhecido como "nós de desenvolvimento")

Esses arquivos são vinculados ao driver que está manipulando o dispositivo usando números maiores e menores. (Por exemplo, "136, 2" na lssaída refere-se ao driver de dispositivo vinculado ao número principal 136 e especifica o dispositivo nº 2 tratado por esse driver.)

A primeira letra de saída de ls -lé o tipo do dispositivo no caso de arquivos do dispositivo. Se for 'c', é um dispositivo de caractere, ou se for 'b', é um dispositivo de bloco.

Para sua segunda pergunta, consulte a resposta acima de rozcietrzewiacz.

rulingminds
fonte
11
O link "Introdução aos drivers de dispositivo" parece estar quebrado.
Slothworks 12/08/2015