Por que arquivos de dispositivos especiais possuem inodes?

11

Os arquivos do dispositivo não são arquivos propriamente ditos. Eles são uma interface de E / S para usar os dispositivos em sistemas operacionais semelhantes ao Unix. Eles não usam espaço no disco, no entanto, eles ainda usam um inode conforme relatado pelo comando stat :

$ stat /dev/sda
      File: /dev/sda
      Size: 0               Blocks: 0          IO Block: 4096   block special file
Device: 6h/6d   Inode: 14628       Links: 1     Device type: 8,0

Os arquivos de dispositivos usam físico inodes no sistema de arquivos e por que eles precisam deles?

    
por direprobs 07.08.2017 / 14:28

4 respostas

16

A resposta curta é que isso acontece somente se você tiver um sistema de arquivos físico que suporte /dev (e se você estiver usando uma distribuição Linux moderna, você provavelmente não usa).

A resposta longa é a seguinte:

Tudo isso remonta à filosofia original do UNIX de que tudo é um arquivo. Essa filosofia é parte do que tornou o UNIX tão versátil, porque você pode interagir diretamente com dispositivos do userspace sem precisar ter código especial em seu aplicativo para falar diretamente com o hardware físico.

Originalmente, /dev era apenas outro diretório com um nome conhecido no qual você coloca os arquivos do dispositivo. Alguns sistemas UNIX ainda usam essa abordagem (acredito que o OpenBSD ainda o faça), e você pode dizer se um sistema é assim porque ele tem muitos arquivos de dispositivos para dispositivos que o sistema não possui (por exemplo, arquivos para cada possível partição em todos os discos possíveis). Isso economiza espaço na memória e no tempo de inicialização, com o custo de usar um pouco mais de espaço em disco, o que foi um bom compromisso para os primeiros sistemas porque eles eram geralmente muito restritos de memória e não muito rápidos. Isso geralmente é chamado de% static/dev.

Nos sistemas Linux modernos (e acredito também no FreeBSD e possivelmente nas versões recentes do Solaris), /dev é um sistema de arquivos na memória temporário preenchido pelo kernel (ou udev se você usa o Systemd, porque eles não confiam no kernel para fazer quase qualquer coisa). Isso economiza algum espaço em disco ao preço de alguma memória (geralmente menos que alguns MB) e uma sobrecarga de processamento muito pequena. Ele também tem uma série de outras vantagens, com uma das maiores sendo que é mais fácil detectar hardware hot plug. Isso geralmente é chamado de dinâmico /dev .

Em ambos os casos, os nós de dispositivos são acessados através da camada regular do VFS, o que significa que eles precisam ter um inode (mesmo que seja um virtual que existe para que coisas como stat() funcionem como deveriam) De uma perspectiva prática, isso tem impacto nulo em sistemas que usam um /dev dinâmico porque eles apenas armazenam os inodes na memória ou os geram conforme necessário, e quase zero o impacto onde /dev é estático porque inodes ocupam quase zero espaço o disco e a maioria dos sistemas de arquivos não têm limite superior ou oferecem muito mais do que qualquer um provavelmente precisará.

    
por 07.08.2017 / 16:48
15

Os arquivos do dispositivo também têm permissões e eles são armazenados em um inode.

    
por 07.08.2017 / 20:08
12

Diretórios são simplesmente um mapeamento de nomes de arquivos para inodes, então tudo sobre o que o nome se refere (um arquivo, um link simbólico, um dispositivo, um FIFO, um soquete) tem que estar no inode, não há outro lugar para coloque.

As informações sobre o dispositivo são armazenadas no inode. Os números dos dispositivos principais e secundários estão lá, assim como as permissões, registros de data e hora, etc. O campo type que diz que é um dispositivo de bloco ou caractere em vez de um arquivo normal é armazenado lá.

O inode para dispositivos simplesmente não faz uso dos campos que contêm o mapa de blocos do arquivo.

    
por 08.08.2017 / 00:17
0

Sem um inode, você só teria o nome do arquivo para conter todas as informações sobre o dispositivo em questão. Isso significa que nomes de dispositivos "legais" como /dev/sda estariam fora de questão: você precisaria de um nome que pudesse ser vinculado a um driver específico, como /dev/ohci/sda .

Ainda mais importante, todas as ferramentas que dependem de inodes (como stat , ls e assim por diante) teriam que ser modificadas para tratar caminhos sob /dev de uma maneira especial. Isso seria uma quantidade proibitivamente grande de trabalho sem nenhum benefício aparente comparado ao estado atual das coisas.

    
por 08.08.2017 / 14:15