大型目录如何存储(一个索引节点还是多个索引节点?)

大型目录如何存储(一个索引节点还是多个索引节点?)

我一直在研究 ext2 文件系统和索引节点,但我不太了解一些事情。

一个inode有多大? une2fs 的输出显示我的系统为 256,那么这就是 256 再见吗?

大目录如何存储?据我了解,目录在文件系统上表示为索引节点,其内容是表示目录内容的文件名和索引节点号的列表。内容是否存储在索引节点本身中,或者在这种情况下它们是否以与文件数据存储相同的方式存储为“数据”?

答案1

一个inode有多大?

索引节点是包含有关文件/目录等信息的元数据。在未修改的标准内核中,索引节点结构的大小为每个索引节点 128 字节。

索引节点结构

une2fs 的输出显示我的系统为 256,那么这就是 256 再见吗?

当您创建文件系统时,您可以更改索引节点大小。某些 Linux 发行版可能会更改该值,并且某些 ext2 创建工具默认具有其他 inode 大小。例如,mke2fs 的默认值为 256。

您可以手动执行以下操作:

mke2fs -I 128

获取 128 字节值。绝不会少于这个。您可以更改该值与 -O resize_inode

总而言之:最少 128 字节。

大目录如何存储?据我了解,目录在文件系统上表示为索引节点,其内容是表示目录内容的文件名和索引节点号的列表。内容是否存储在索引节点本身中,或者在这种情况下它们是否以与文件数据存储相同的方式存储为“数据”?

目录被标记为 ext2 inode 结构的第一个值中的目录,即“i_mode”。在内核中:

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

[内核中的fs/ext2/ext2.h描述了一切]

该变量可以采用这些值:

/* 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 */

目录索引节点指向一个列表,该列表位于数据部分,其中包含目录项结构的列表。每个结构体都包含 5 个变量:

  • inode -> 该条目的 inode 号。
  • rec_len -> 用于对齐。
  • file_type -> 文件类型,或多或少与我之前粘贴的类型相同:D。
  • name_len -> 名称的长度(以字节为单位)。
  • name -> 最大长度为 255 字节。

该结构重复的次数与目录中文件的数量相同。

抱歉,如果有任何语法错误:D

相关内容