As entradas do diretório são armazenadas em inode.i_block
e nos blocos de dados. Consulte "Dados Inline" e "Diretórios Inline" no documento vinculado.
Um inode de diretório não é substancialmente diferente do inode de um arquivo regular, o que eu compreendo de Layout de Disco Ext4 é isso:
Directory Entries: Therefore, it is more accurate to say that a directory is a series of data blocks and that each block contains a linear array of directory entries.
A entrada de diretório armazena o nome do arquivo junto com um ponteiro para seu inode. Portanto, se a documentação disser que cada bloco contém entradas de diretório, por que debugfs
reporta algo diferente que os nomes de arquivos armazenados no inode do diretório? Esta é uma sessão de depuração em uma unidade flash formatada em ext4:
debugfs: cat /sub
�
.
..�
spam�spam2�spam3��spam4
Eu não acho que inode_i_block
consiga armazenar esses nomes de arquivos, eu criei arquivos com nomes de arquivos muito longos, com mais de 60 bytes de tamanho. A execução de cat
no inode de debugfs
exibia os nomes dos arquivos também, portanto, os nomes de arquivos longos estavam no inode novamente!
The Contents of
inode.i_block
:Depending on the type of file an inode describes, the 60 bytes of storage in
inode.i_block
can be used in different ways. In general, regular files and directories will use it for file block indexing information, and special files will use it for special purposes.
Além disso, não há referência ao inode que armazena os nomes de arquivos em Diretórios de Hash Tree seção que é a implementação mais recente. Sinto que perdi alguma coisa nesse documento.
A questão principal é se o inode de um diretório contém nomes de arquivos, o que seus blocos de dados armazenam então?
cat
arquivos de saída conteúdos , ou seja, blocos de dados. Semelhante a /bin/cat
.
O comando cat
não seria útil se escrevesse os bytes da estrutura inode no terminal. Compare inode_dump
e stat
.
Alguns documentos informam que o unix histórico é permitido, /bin/cat
para ler esses dados, e essa foi a maneira original de listar as entradas de diretório do userspace. Ou seja ls
abriria o diretório, read()
das entradas e as interpretaria para você. Ao contrário de usar readdir()
, onde o kernel fornece as entradas em um formato padrão, independentemente do formato do sistema de arquivos subjacente.
Os dados de um diretório contêm dirent
entries . Cada entrada de diretório contém um nome de arquivo e um ponteiro para um inode. Um inode ext4 pode conter o conteúdo de dados de um arquivo pequeno para eficiência, para que ele não precise executar mais uma leitura de bloco.
O valor de "small" pode ser de 60 bytes com atributos de arquivo ou até 160 bytes se os atributos de arquivo estendidos não estiverem sendo usados.
Eu não acho que o comando debugfs cat mostre o conteúdo do próprio inode, embora eu ache que a linguagem na página man é confusa. Numerosos lugares, a página man se refere a um "inode filespec" que eu acho que é uma forma redundante de lembrar o leitor que um filespec pode ser um nome de caminho ou um número de inode. Compare os seguintes trechos da man page:
cat filespec - Dump the contents of the inode filespec to stdout.
stat filespec - Display the contents of the inode structure of the inode filespec.
Eu acho que o gato está mostrando o conteúdo do "inode filespec", não mostrando o conteúdo do inode, filespec. Os nomes de arquivos estão definitivamente listados nos blocos de dados, não no inode.
Tags directory ext4 inode filesystems debugfs