Como os diretórios grandes são armazenados (um inode ou muitos?)

1

Estive estudando sobre o sistema de arquivos ext2 e inodes, e não estou entendendo muito algumas coisas.

Qual é o tamanho de um inode? A saída do tune2fs diz que é 256 para o meu sistema, então são 256 byes?

Como os diretórios grandes são armazenados? Pelo que entendi, um diretório é representado no sistema de arquivos como um inode cujo conteúdo é uma lista de nomes de arquivos e números de inodes que representam o conteúdo do diretório. O conteúdo é armazenado no próprio inode ou, nesse caso, eles são armazenados como "dados" da mesma forma que os dados do arquivo são armazenados?

    
por Brandon Wamboldt 05.08.2014 / 00:47

1 resposta

4

How big is an inode?

Inodes são metadados que contêm informações sobre um arquivo / diretório, etc. O tamanho da estrutura do inode é de 128 bytes por inode em um kernel padrão não modificado.

Estrutura de inodes

The output from tune2fs says its 256 for my system, so is that 256 byes?

Quando você cria seu sistema de arquivos, pode alterar o tamanho do inode. Algumas distribuições do Linux podem alterar esse valor e algumas ferramentas de criação do ext2 possuem outros tamanhos de inode por padrão. mke2fs, por exemplo, tem um padrão de 256.

Manualmente você pode fazer:

mke2fs -I 128

para obter o valor de 128 bytes. Nunca menos que isso. Você pode alterar esse valor com -O resize_inode

Para resumir tudo isso: mínimo de 128 bytes.

How are large directories stored? From what I understand, a directory is represented on the filesystem as an inode who's contents are a list of filenames and inode numbers that represent the contents of the directory. Are the contents stored in the inode itself, or in this case are they stored as "data" the same way file data is stored?

Um diretório é marcado como um diretório no primeiro valor da estrutura inode do ext2, que é "i_mode". No kernel:

struct ext2_inode {
    __le16  i_mode;     /* File mode */
            ︙

[fs / ext2 / ext2.h no kernel descreve tudo]

E essa variável pode pegar esses valores:

/* inode: i_mode */
#define EXT2_S_IFMT 0xF000  /* format mask  */
#define EXT2_S_IFSOCK   0xC000  /* socket */
#define EXT2_S_IFLNK    0xA000  /* symbolic link */
#define EXT2_S_IFREG    0x8000  /* regular file */
#define EXT2_S_IFBLK    0x6000  /* block device */
#define EXT2_S_IFDIR    0x4000  /* directory */
#define EXT2_S_IFCHR    0x2000  /* character device */
#define EXT2_S_IFIFO    0x1000  /* fifo */

O diretório inode aponta para uma lista, que está na parte de dados, que contém uma lista de estruturas de entrada de diretório. Cada uma dessas estruturas contém 5 variáveis:

  • inode - > o número de inode dessa entrada.
  • rec_len - > para alinhamento.
  • file_type - > o tipo de arquivo, mais ou menos os mesmos tipos que eu colei antes: D.
  • name_len - > o comprimento em bytes do nome.
  • nome - > com um comprimento máximo de 255 bytes.

Essa estrutura é repetida quantas vezes houver arquivos no diretório.

Desculpe se há algum erro gramatical: D

    
por 05.09.2014 / 02:15

Tags