Um nome de arquivo é uma entrada em um diretório. Em essência, os diretórios são tabelas de duas colunas, onde a coluna 1 é o nome do arquivo e a coluna 2 é o número do inode. (Ok, para sistemas de arquivos modernos, a história é mais complexa, mas para a explicação que irá fazer.) O número de inode aponta para a tabela de inode; essa tabela não é visível para processos de usuário, mas você pode consultar um inode chamando a chamada de sistema stat()
ou lstat()
. O inode contém os metadados de um arquivo, como propriedade, permissões de acesso, acesso, modificação e alteração de horários e assim por diante. Mais importante, o inode contém ou aponta para a informação onde encontrar o arquivo no disco.
Outra entrada importante é a contagem de links, pois é possível apontar para o inode de muitos lugares - eles são chamados de hardlinks . Se você excluir um arquivo usando rm
(ou seja, usando a chamada de sistema unlink()
), somente a entrada do diretório será removida e a contagem de links do inode será diminuída. Somente se atingir 0 o espaço em disco associado ao inode e o próprio inode será liberado para reutilização posterior.
Então: um nome de arquivo é uma string, e a indicação acontece através da estrutura de dados do diretório.
A hard link cannot link to a file on a different file system, while a soft link can. Is it because a filename pointer cannot point to an inode on a different file system, while a pointer stored in an inode can point to a file content on a differnt file system?
Cada sistema de arquivos possui sua própria tabela de inode. As entradas na tabela de inode podem se referir estritamente apenas ao sistema de arquivos "próprio". Portanto, um link físico não pode cruzar os limites do sistema de arquivos.
Um softlink é uma coisa muito diferente. Em essência, é um pequeno arquivo que contém um nome de arquivo. Se um processo abrir um link simbólico, o sistema o seguirá e abrirá o arquivo referido por esse nome de arquivo. Como os softlinks são baseados somente em nomes de caminho, eles não estão restritos aos limites do sistema de arquivos.