Linux目录通过索引节点(inode)存储文件元数据,目录项(dentry)关联文件名与inode,目录本质是dentry列表,共同实现文件的高效组织与访问。
核心存储组件
-
索引节点(inode)
- 每个文件或文件夹对应唯一的inode,存储元数据(权限、时间戳、大小、数据块位置等)。
- 文件夹本质是特殊文件:其inode不存储实际数据,而是记录下属文件的关联信息。
- 通过
ls -i
可查看inode号(如12345 ./Documents
)。
-
目录项(dentry)
- 构成目录的”条目”,记录文件名与inode的映射关系。
- 例如目录
Documents
包含:file1.txt
→ inode 10001Photos/
→ inode 10002
- dentry缓存于内存(
dcache
),加速文件访问。
-
数据块(Data Blocks)
- 文件夹的实际内容(即dentry列表)存储在磁盘的数据块中。
- 通过inode指向这些数据块(类似普通文件)。
文件夹的创建与存储流程
-
创建目录(如
mkdir Data
):- 文件系统分配一个新inode(类型标记为”目录”)。
- 创建两个默认dentry:
- → 指向自身inode(如
inode 45678
) - → 指向父目录inode(如父目录
inode 12345
)
- → 指向自身inode(如
- 在父目录的数据块中添加条目:
Data/
→inode 45678
。
-
添加子文件(如
touch Data/file.txt
):- 在
Data
目录的数据块中新增dentry:file.txt
→ 新文件inode。
- 在
文件系统如何组织目录
- 树形结构:
根目录()inode为起点(通常inode=2),通过dentry逐级关联子目录。/ (inode 2) ├── home (inode 100) → 用户目录 │ └── user (inode 200) → dentry指向/home/user └── etc (inode 101) → 配置文件
- 硬链接的影响:
硬链接会增加dentry条目(多个文件名指向同一inode),但文件夹不可创建硬链接(避免环路)。
用户常见疑问解答
-
为什么文件夹有”大小”?
通过ls -l
看到的目录大小是其dentry列表占用的磁盘空间(通常4KB),非包含文件的总大小。 -
如何查看文件夹的inode?
命令:ls -id /path/to/dir
(如ls -id /home
显示inode号)。 -
删除文件夹时发生了什么?
- 减少其inode的”链接计数”(link count)。
- 当计数归零(无dentry指向该inode),释放inode及数据块。
设计优势
- 高效检索:dentry缓存(dcache)大幅减少磁盘访问。
- 跨文件系统支持:通过挂载点(mount point) 的dentry整合不同文件系统(如EXT4、Btrfs)。
- 一致性保障:日志型文件系统(如EXT4)记录操作,避免断电导致目录损坏。
引用说明
- Linux内核文档:Filesystems in the Linux kernel
- 《Understanding the Linux Kernel, 3rd Edition》(Daniel P. Bovet)
- EXT4文件系统白皮书:ext4.wiki.kernel.org
- POSIX标准:IEEE Std 1003.1
基于Linux内核5.x及主流文件系统(EXT4/XFS/Btrfs)实现,符合POSIX标准,技术细节已简化以便理解,实际实现因文件系统而异。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/4977.html