Por que arquivos de dispositivos especiais têm inodes?

11

Os arquivos do dispositivo não são arquivos per se. 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, ainda usam um inode, conforme relatado pelo statcomando:

$ 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 do dispositivo usam inodes físicos no sistema de arquivos e por que eles precisam?

péssimos
fonte
2
O inode e os dados são o arquivo. Sem um inode, você não tem arquivo. (Arquivos de dispositivos não têm quaisquer dados embora)
user253751

Respostas:

16

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

A resposta longa é a seguinte:

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

Originalmente, /devera apenas outro diretório com um nome conhecido onde você colocava os arquivos do dispositivo. Alguns sistemas UNIX ainda adotam essa abordagem (acredito que o OpenBSD ainda o faça), e você geralmente pode dizer se um sistema é assim, porque ele possui muitos arquivos de dispositivos para dispositivos que o sistema não possui (por exemplo, arquivos para todos os sistemas). partição possível em todos os discos possíveis). Isso economiza espaço na memória e tempo de inicialização, com o custo de usar um pouco mais de espaço em disco, o que foi uma boa opção para os sistemas antigos, porque eles geralmente eram muito limitados à memória e não muito rápidos. Isso geralmente é referido como tendo uma estática /dev.

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

Nos dois casos, porém, os nós dos dispositivos são acessados ​​através da camada VFS comum, o que, por definição, significa que eles precisam ter um inode (mesmo que seja virtual, existindo apenas para que coisas como stat()funcionem como deveria). De uma perspectiva prática, isso tem impacto nulo nos sistemas que usam uma dinâmica, /devporque eles armazenam os inodes na memória ou os geram conforme necessário, e quase nula quando /devestático, porque os inodes ocupam quase zero espaço no disco e a maioria dos sistemas de arquivos não tem limite superior. eles ou provisionam muito mais do que qualquer um provavelmente precisará.

Austin Hemmelgarn
fonte
3
Cautelosamente levanta a mão. Eu estive em um projeto que teve um servidor sem inodes. Foi finalmente a crise que nossa equipe precisou convencer a gerência a investir na substituição desse sistema de back-end, que havia sido projetado (mal, como você pode imaginar!) Antes de qualquer um de nós chegar lá.
KRyan #
@KRyan Isso pode acontecer, mas hoje em dia é raro, a menos que o administrador reduza explicitamente o número na criação do sistema de arquivos. Muitos sistemas de arquivos modernos (pelo menos NTFS, BTRFS e ZFS, acho que o XFS também pode) alocam inodes dinamicamente; portanto, em muitos sistemas mais novos, é realmente impossível esgotar-se.
Austin Hemmelgarn
@ Kryan Eu também tive esse problema. E, na verdade, era um sistema bem projetado, se um pouco datado e levado para extreams (cada transação exigia um log independente, que era mantido em disco, eventualmente apenas preenchido com pequenos inodes)
coteyr
1
Od e docker são famosos por causar exatamente esse problema no inode.
coteyr
@AustinHemmelgarn A família ext é bastante famosa por ter um número estático de inodes (e subsequentemente se esgotar). É também, aliás, o sistema de arquivos Linux mais usado por provavelmente uma margem enorme (cenários que armazenam grandes quantidades de dados no XFS de lado, com ZFS e BTRFS sendo relativamente novos) e o padrão para a maioria das distribuições. Obviamente, em um sistema moderno, os inodes máximos padrão são muitas ordens de magnitude maiores que o número de arquivos de dispositivo que você já terá.
Bob
15

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

Hauke ​​Laging
fonte
Excelente ponto que eu esqueci de mencionar.
Austin Hemmelgarn
5
Não apenas permissões, mas também o tipo de arquivo e outros metadados. Classicamente, o diretório em si contém apenas o nome e o número do inode - não há nada indicando que o arquivo é um dispositivo até você ler o inode.
Gilles 'SO- stop be evil'
12

Os diretórios são simplesmente um mapeamento de nomes de arquivos para inodes; portanto, tudo sobre o que o nome se refere (um arquivo, um link simbólico, um dispositivo, um FIFO, um soquete) precisa estar no inode, não há outro lugar para colocá-lo.

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

O inode para dispositivos simplesmente não utiliza os campos que contêm o mapa de blocos do arquivo.

Barmar
fonte
0

Sem um inode, você teria apenas o nome do arquivo para armazenar todas as informações sobre o dispositivo em questão. Isso significa que nomes de dispositivos "agradáveis" /dev/sdanão estariam em questão: você precisaria de um nome que pudesse estar associado a um driver específico, como /dev/ohci/sda.

Ainda mais importante, todas as ferramentas que dependem de inodes (como stat, lse assim por diante) teria que ser modificado para caminhos tratar sob /devde uma maneira especial. Seria uma quantidade proibitivamente grande de trabalho sem benefício aparente em comparação com o estado atual das coisas.

Dmitry Grigoryev
fonte