
Comecei a ler um pouco sobre o sistema de arquivos Linux. Em vários lugares encontrei citações como esta:
Diretórios Unix são listas de estruturas de associação, cada uma contendo um nome de arquivo e um número de inode.
Então, eu esperava descobrir que cada diretório conteria os nomes dos arquivos contidos nele, com cada arquivo mapeado para um inode. Mas quando faço isso vim directory_name
no Ubuntu, recebo algo assim:
" ============================================================================
" Netrw Directory Listing (netrw v156)
" /Users/user/workspace/folder
" Sorted by name
" Sort sequence: [\/]$,\<core\%(\.\d\+\)\=\>,\.h$,\.c$,\.cpp$,\~\=\*$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$
" Quick Help: <F1>:help -:go up dir D:delete R:rename s:sort-by x:special
" ==============================================================================
../
./
folder1/
folder2/
file1
file2
Eu esperava ver um número de inode próximo a cada nome de arquivo. Por que não é esse o caso?
Responder1
Essa citação é sobre como (logicamente – as estruturas reais são muitas vezes muito diferentes hoje em dia) os sistemas de arquivos Unix funcionam. E você pode ver os números dos inodes com, por exemplo, o -i
sinalizador para ls
:
$ ls -li
total 8
532028 -rw-r--r-- 1 anthony anthony 115 Apr 25 12:07 a
532540 -rw-r--r-- 1 anthony anthony 70 Apr 25 12:07 b
Esse número à esquerda é o inode. E se eu executar ln b c
(criando um hardlink), então:
$ ls -li
total 12
532028 -rw-r--r-- 1 anthony anthony 115 Apr 25 12:07 a
532540 -rw-r--r-- 2 anthony anthony 70 Apr 25 12:07 b
532540 -rw-r--r-- 2 anthony anthony 70 Apr 25 12:07 c
As permissões e tamanho fazem parte do inode, não do diretório. Fácil de ver pelo que acontece depois chmod 0600 c
:
$ ls -li
total 12
532028 -rw-r--r-- 1 anthony anthony 115 Apr 25 12:07 a
532540 -rw------- 2 anthony anthony 70 Apr 25 12:07 b
532540 -rw------- 2 anthony anthony 70 Apr 25 12:07 c
ambos b
e c
alterados, porque compartilham o mesmo inode.
No entanto, o kernel apenas expõe o sistema de arquivos ao espaço do usuário por meio de uma API bem definida (exceto para dispositivos brutos como /dev/sda1
). Ele dá acesso ao espaço do usuário a um monte de syscalls para fazer coisas como criar e remover links, alterar permissões, ler e gravar arquivos, renomear, etc. Ele não expõe as estruturas de dados brutas e subjacentes do sistema de arquivos ao espaço do usuário. Isso ocorre por vários bons motivos: permite sistemas de arquivos em rede, significa que o kernel pode impor permissões e manter as estruturas de dados do sistema de arquivos corretas, significa que você pode usar sistemas de arquivos diferentes (com estruturas de dados diferentes) sem precisar alterar o espaço do usuário.
Então, basicamente, vim dir
está apenas mostrando uma lista de diretórios - mais ou menos como ls
faz. Isso é feito através de um módulo vim chamado Netrw, como diz acima (tente :help netrw
no vim). Na verdade, você não pode editar as estruturas de dados subjacentes do sistema de arquivos.
Responder2
Um diretório é, semanticamente falando, um mapeamento do nome do arquivo para o inode. É assim que a abstração da árvore de diretórios é projetada, correspondendo à interface entre aplicativos e sistemas de arquivos. Os aplicativos podem designar arquivos por nome e enumerar a lista de arquivos em um diretório, e cada arquivo possui um designador exclusivo chamado “inode”.
A forma como essa semântica é implementada depende do tipo de sistema de arquivos. Cabe a cada sistema de arquivos como o diretório é codificado. Na maioria dos sistemas de arquivos Unix, um diretório é um mapeamento de nomes de arquivos para números de inode, e há uma tabela separada que mapeia números de inode para dados de inode. (Os dados do inode contêm metadados do arquivo, como permissões e carimbos de data e hora, a localização do conteúdo do arquivo, etc.) O mapeamento pode ser uma lista, uma tabela hash, uma árvore...
Você não pode ver esse mapeamento com o Vim. O Vim não mostra a área de armazenamento que representa o diretório. O Linux, como muitos outros sistemas Unix modernos, não permite que os aplicativos vejam a representação do diretório diretamente. Os diretórios agem como arquivos comuns no que diz respeito à entrada do diretório e aos metadados, mas não no que diz respeito ao conteúdo. Os aplicativos leem arquivos comuns com chamadas de sistema como open
, read
, write
, close
; para diretórios existem outras chamadas de sistema: opendir
, readdir
, closedir
e a modificação de um diretório é feita criando, movendo e excluindo arquivos. Um aplicativo como cat
usa open
, read
, close
para ler o conteúdo de um arquivo; um aplicativo como ls
usa opendir
, readdir
, closedir
para ler o conteúdo de um diretório. O Vim normalmente funciona como cat
ler o conteúdo de um arquivo, mas se você pedir para ele abrir um diretório, ele funciona ls
e imprime os dados de uma forma bem formatada.
Se você quiser ver a aparência de um diretório, você pode usar uma ferramenta como debugfs
ext2/ext3/ext4. Certifique-se de não modificar nada! Uma ferramenta como essa debugfs
ignora o sistema de arquivos e pode destruí-lo completamente. O ext2/ext3/ext4 debugfs
é seguro porque está no modo somente leitura, a menos que você permita explicitamente a gravação por meio de uma opção de linha de comando.
# debugfs /dev/root
debugfs 1.42.12 (29-Aug-2014)
debugfs: dump / /tmp/root.bin
debugfs: quit
# od -t x1 /tmp/root.bin
Você verá os nomes das entradas do diretório em /
meio a vários outros caracteres, alguns não imprimíveis. Para entender isso, você precisa conhecer os detalhes do formato do sistema de arquivos.
Responder3
Suspeito que você esteja lendo uma exposição muito, muito antiga sobre como funciona o sistema de arquivos Unix. O que você descreve teria sido verdade no final da década de 1970, mas não é mais verdade em nenhum sistema de arquivos moderno.
Em muitas plataformas modernas, existem vários sistemas de arquivos de uso comum, e cada um deles oculta suas partes internas do espaço do usuário. Você pode descobrir como eles são e brincar com eles, mas a menos que queira se especializar em projetar sistemas de arquivos, talvez seja melhor apenas confiar no autor do livro para lhe dar o suficiente para ter uma compreensão básica do design, sem entrar em detalhes. muitos detalhes (alguns dos quais estarão obsoletos quando você precisar deles novamente).