Entendendo / dev e seus subdiretórios e arquivos

44
$ 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 /dev e seus subdiretórios todos os descritores de arquivos de dispositivos?
  2. Por que há tantos links um do outro? Por exemplo, /dev/fd/0 , /dev/stdin , /proc/self/fd/0 são todos links para /dev/pts/2 .
  3. Se l em lrwx------ significa link, o que faz c em crw--w---- significa?
por Tim 07.08.2011 / 16:01

3 respostas

64

Quase todos os arquivos em /dev são arquivos de dispositivos . Enquanto ler e gravar em um arquivo regular armazena dados em um disco ou outro sistema de arquivos, acessar um arquivo de dispositivo se comunica com um driver no kernel, que geralmente se comunica com uma peça de hardware (um dispositivo de hardware, daí o nome). / p>

Existem dois tipos de arquivos de dispositivos: dispositivos de bloco (indicados por b como o primeiro caractere na saída de ls -l ) e dispositivos de caractere (indicados por c ). A distinção entre dispositivos de bloco 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ê escrever um byte em um determinado deslocamento e, posteriormente, ler o dispositivo nesse deslocamento, receberá esse byte de volta. 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 ler 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 seu número, não pelo seu 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 menor número permite que um driver conduza vários dispositivos¹. Esses números aparecem na lista ls -l , onde você normalmente encontraria 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 dispositivos em /dev não correspondem a dispositivos de hardware. Um que existe em cada sistema unix é /dev/null ; escrever para ele não tem efeito, e a leitura nunca retorna nenhum dado. Geralmente é conveniente em shell scripts, 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 dispositivos têm um significado que depende do processo que os acessa. Por exemplo, /dev/stdin designa a entrada padrão do processo atual; a abertura a partir de tem o mesmo efeito que a duplicação da entrada padrão². Algo semelhante, /dev/tty designa o terminal ao qual o processo está conectado. No Linux, hoje em dia, /dev/stdin e amigos não são implementados como dispositivos de caractere, mas sim como links simbólicos para um mecanismo mais geral que permite que cada descritor de arquivo seja referenciado (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 / dev / fd se relaciona com / proc / self / fd /? .

Você encontrará vários links simbólicos em /dev . Isso pode ocorrer por motivos históricos: 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 para /dev/sr0 no 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/sda e /dev/sda1 e amigos (cada disco designado por uma letra arbitrária e partições de acordo com o layout da partição) /dev/disk/by-id/* (discos designados por um único número de série), /dev/disk/by-label/* (partições com um sistema de arquivos, designado por um rótulo escolhido pelo ser humano); e mais. Os links simbólicos também são usados quando um nome de dispositivo genérico pode ser um dos vários; por exemplo, /dev/dvd pode ser um link simbólico para /dev/sr0 , ou pode ser um link para /dev/sr1 se você tiver dois leitores de CD e o segundo for o leitor de DVD padrão.

Por fim, existem alguns outros arquivos que você pode encontrar em /dev , por motivos tradicionais. Você não encontrará o mesmo em todos os sistemas. Na maioria dos unices, /dev/log é um soquete que os programas usam para emitir mensagens de log. /dev/MAKEDEV é um script que cria entradas em /dev . Nos sistemas Linux modernos, as entradas em /dev/ são criadas automaticamente por udev , obsoleto MAKEDEV .

¹ Isso não é mais verdade no Linux, mas esse detalhe é importante apenas para os gravadores de driver de dispositivo.
² Duplicar um descritor de arquivo significa criar um novo descritor de arquivo que acessa o mesmo arquivo que o primeiro. A chamada de sistema correspondente é dup : open("/dev/stdin", flags) é igual a dup(0) , exceto que o novo descritor pode ser criado com diferentes modos de acesso.

    
por 11.08.2011 / 02:48
14
  1. Sim - diretamente ou como links simbólicos - é para isso que o /dev/ é válido.
  2. Para várias finalidades: às vezes para compatibilidade entre esquemas de nomenclatura, às vezes é necessário para o ambiente de trabalho - como no exemplo de /dev/stdin . Isso não aponta estaticamente para /dev/pts/2 ou qualquer outro - basta mudar para outro terminal e você verá. /dev/stdin é a entrada padrão da sua sessão de terminal atual . Esse também é um exemplo porque precisa ser um link simbólico.
  3. Veja man mknod e info coreutils 'mknod invocation' . Em geral, c significa um tipo de dispositivo de caractere de caracteres.
por 07.08.2011 / 17:16
10

Para sua primeira pergunta, eles não são descritores de arquivos, são arquivos de dispositivos. (a.k.a. "nós dev")

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

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

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

    
por 10.08.2011 / 17:00