如何存储大目录(一个或多个?)

Bra*_*don 2 ext2 inode

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

一个inode有多大?tune2fs 的输出表明我的系统是 256,那是 256 字节吗?

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

all*_*lmy 5

一个inode有多大?

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

节点结构

tune2fs 的输出表明我的系统是 256,那是 256 字节吗?

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

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

mke2fs -I 128
Run Code Online (Sandbox Code Playgroud)

获取 128 个字节的值。永远不会少于那个。您可以使用 -O resize_inode更改该值

总而言之:最少 128 个字节。

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

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

struct ext2_inode {
    __le16  i_mode;     /* File mode */
            ?
Run Code Online (Sandbox Code Playgroud)

【内核中的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 */
Run Code Online (Sandbox Code Playgroud)

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

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

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

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