# Nó-i

Em um sistema de arquivos de estilo Unix, um nó de índice, informalmente referido como um nó-i (inode), é uma estrutura de dados que descreve um objeto do sistema de arquivos, que pode ser uma de várias coisas, incluindo um arquivo ou diretório. Cada inode armazena os atributos e a(s) localização(ões) de bloco de disco dos dados dos objetos. Atributos de objeto do sistema de arquivos podem incluir metadados (horários de última alteração, acesso e modificação), bem como dados de proprietário e permissão (por exemplo, id de grupo, id de usuário, permissões).
Diretórios são listas de nomes atribuídos a inodes. Um diretório contém uma entrada para ele mesmo, seus pais e cada um de seus filhos.

## Terminologia e conceitos

Um dispositivo de blocos é um meio de armazenamento em que a leitura e gravação são efetuados usando um conjunto de bytes, denominado setor ou bloco, cujo tamanho é fixo (no caso do disco rígido, o setor geralmente possui 512 bytes). O sistema operacional considera o disco como sendo um grande vetor de blocos de dados de tamanho fixo e sequencialmente numerados. Um sistema de arquivos lê e grava blocos, que são grupos de setores contíguos. Em sistemas derivados do UNIX, como o UFS1 ou Ext2, os blocos tipicamente têm 1024 bytes (2 setores), 2048 bytes (4 setores), 4096 bytes (8 setores) ou 8192 bytes (16 setores). A Microsoft usa a expressão unidade de alocação (cluster) com o mesmo significado de bloco.
Um arquivo é um conjunto de bytes armazenados num dispositivo de blocos. Um diretório é um arquivo cujo conteúdo é uma tabela, onde cada entrada contém um nome de arquivo ou subdiretório e um ponteiro (normalmente um número inteiro) para um nó-i. Um hard link é uma referência a um arquivo por outro nome no mesmo sistema de arquivos.
As permissões são parâmetros definidos por bits sinalizadores (flags) que determinam os direitos de leitura, escrita e execução atribuídos a três grupos de utilizadores: o dono do arquivo ou diretório, um determinado grupo de usuários, e o resto dos usuários.

## Detalhes

Um sistema de arquivos depende de estruturas de dados sobre os arquivos, além do conteúdo do arquivo. Os primeiros são chamados de metadados - dados que descrevem dados. Cada arquivo é associado com um inode, que é identificado por um número inteiro, geralmente referido como um número-i ou número inode.
Inodes armazenam informações sobre arquivos e diretórios (pastas), como proprietário do arquivo, modo de acesso (permissões de leitura, escrita e execução) e tipo de arquivo. Em muitos tipos de implementações de sistemas de arquivos, o número máximo de inodes é fixado na criação do sistema de arquivos, limitando o número máximo de arquivos que o sistema de arquivos pode armazenar. Uma heurística de alocação comum para inodes em um sistema de arquivos é um porcento do tamanho total.
O número do inode indexa uma tabela de inodes em uma localização conhecida no dispositivo. A partir do número de inode, o controlador (driver) do sistema de arquivos do kernel pode acessar o conteúdo dos inodes, incluindo a localização do arquivo - desta forma, permitindo o acesso ao arquivo. Um número de inode de um arquivo pode ser encontrado usando o comando ls -i. O comando ls -i imprime o número do inode na primeira coluna do relatório.
Alguns sistemas de arquivos no estilo Unix, como ReiserFS, btrfs e APFS, omitem uma tabela de inodes de tamanho fixo, mas devem armazenar dados equivalentes para fornecer recursos equivalentes. Os dados podem ser chamados de dados stat, em referência à chamada de sistema stat que fornece os dados aos programas. Alternativas comuns para a tabela de tamanho fixo incluem árvores B e as árvores B+ derivadas.
Nomes de arquivos e implicações de diretório:
* Os inodes não contêm seus nomes de hardlink, apenas outros metadados de arquivo.
* Os diretórios do Unix são listas de estruturas de associação, cada uma contendo um nome de arquivo e um número de inode.
* O driver do sistema de arquivos deve pesquisar um diretório à procura de um nome de arquivo específico e, em seguida, converter o nome do arquivo para o número de inode correspondente correto.
A representação na memória do kernel do sistema operacional desses dados é chamada de struct inode no Linux. Os sistemas derivados do BSD usam o termo vnode (o "v" refere-se à camada de sistema de arquivos virtual do kernel).

## Estrutura

Os sistemas de arquivos Ext2 e UFS1 são semelhantes em sua estrutura. Neles, o nó-i contém, basicamente, as mesmas informações:
* Permissões. São 9 os bits de permissão: leitura (r), gravação (w) e execução (x); cada um dos quais atribuídos ao dono (u, de user), grupo relativo (g, de group), outros usuários (o, de others), ou todas as classes (a, de all). Além desses, existem o sticky bit, SUID e SGID.
* Tipo de arquivo. Um arquivo pode ser do tipo regular (comum), diretório, associado a dispostivo de bloco ou de caractere, FIFO (named pipe) ou soquete (socket).
* Identificação do dono e do grupo relativo. A identificação é feita por um número inteiro e não pelo nome (UID e GID, respectivamente).
* Tempos (MAC times): último acesso (atime - access time); última alteração do nó-i (ctime - change time); última alteração do arquivo (mtime - modification time).
* Contador de referências (link count). Quando uma referência (nome) do arquivo é apagada, o contador é decrementado; quando o contador chega a zero, o nó-i e os blocos alocados para o arquivo são liberados.
* Tamanho do arquivo em bytes.
* Endereços dos blocos alocados para o arquivo. 12 blocos são alocados diretamente pelo nó-i. Para arquivos que necessitem de mais espaço (12 blocos de 4 KiB limitam o tamanho do arquivo a 48 KiB; já para blocos de 8 KiB, o tamanho máximo será de 96 KiB), pode-se endereçar um bloco indireto simples, o qual contém os endereços de blocos do arquivo (para blocos de 4 KiB, o bloco indireto simples contém o endereço de 1024 blocos do arquivo; se o bloco for de 8 KiB, serão endereçados mais 2048 blocos para o arquivo). É possível alocar ainda um bloco indireto duplo, que contém os endereços de mais blocos indiretos simples e, finalmente, um bloco indireto triplo, que contém endereços de mais blocos indiretos duplos. Portanto, o nó-i do Ext2 (no Linux, com bloco de 4 KiB) suporta arquivos com tamanho máximo de cerca de 4 TiB, enquanto o nó-i do UFS1 no Solaris (com bloco de 8 KiB) suporta arquivos com tamanho máximo de 16 TiB, aproximadamente.
Observe-se que o nome do arquivo não está contido no nó-i. O nome estará apenas no diretório-pai do arquivo, associado ao seu ponteiro para o nó-i correspondente.
Há um nó-i para cada arquivo, e cada arquivo é unicamente identificado pelo sistema de arquivo no qual reside por seu número de nó-i neste sistema.

## Vantagens

O i-node apresenta vantagens sobre outros formatos de particionamento de disco como o FAT32, no sentido de que o FAT32 necessita carregar toda a tabela de indexadores de blocos, o que demanda muita memória (a forma que o FAT32 usa para driblar isto é ter blocos de até 32Kb necessitando de menos indexadores e consequentemente a tabela a ser carregada na memória é menor). Em contra partida o i-node somente precisa carregar os indexadores dos arquivos que estão abertos, ficando em memória somente os arquivos abertos. O FAT cresce linearmente com o tamanho do disco, enquanto o i-node cresce proporcionalmente.