![大型目录如何存储(一个索引节点还是多个索引节点?)](https://linux22.com/image/41171/%E5%A4%A7%E5%9E%8B%E7%9B%AE%E5%BD%95%E5%A6%82%E4%BD%95%E5%AD%98%E5%82%A8%EF%BC%88%E4%B8%80%E4%B8%AA%E7%B4%A2%E5%BC%95%E8%8A%82%E7%82%B9%E8%BF%98%E6%98%AF%E5%A4%9A%E4%B8%AA%E7%B4%A2%E5%BC%95%E8%8A%82%E7%82%B9%EF%BC%9F%EF%BC%89.png)
我一直在研究 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