从目录树到 inode,从 VFS 到权限模型,全面理解 Linux 文件系统原理
Linux 只有一个根 /,所有设备和分区通过 挂载(mount) 到某个目录点上,形成统一的树形命名空间。
| 路径 | 用途 | 是否可写 |
|---|---|---|
/etc | 系统配置文件 | root |
/var/log | 系统日志 | 可写 |
/proc | 内核进程信息(虚拟) | 只读 |
/sys | 设备/驱动信息(虚拟) | 只读 |
/dev | 设备文件 | 设备 |
/tmp | 临时文件(重启清除) | 可写 |
硬链接(Hard Link):两个目录项指向同一个 inode。删除任意一个,文件仍在(引用计数 > 0)。不能跨文件系统,不能链接目录。
软链接(Symbolic Link):独立的 inode,文件内容是目标路径字符串。可以跨文件系统、可以链接目录。源文件删除后,软链接失效(悬空链接)。
| 结构体 | 含义 | 对应概念 |
|---|---|---|
super_block | 文件系统元信息 | 整个 FS 实例 |
inode | 文件元数据(内存中) | 磁盘 inode 的镜像 |
dentry | 目录项缓存 | 路径 ↔ inode 映射 |
file | 打开的文件实例 | 进程视图 |
address_space | 页缓存映射 | 文件数据缓存 |
| 文件系统 | 类型 | 最大文件 | 最大分区 | 特性 |
|---|---|---|---|---|
| ext4 | Linux 标准 | 16 TB | 1 EB | 日志、高兼容、稳定 |
| XFS | 高性能 | 8 EB | 8 EB | 大文件、并发写入强 |
| Btrfs | 写时复制 | 16 EB | 16 EB | 快照、RAID、校验 |
| tmpfs | 内存 FS | RAM限制 | RAM限制 | /tmp、共享内存、重启清除 |
| procfs | 虚拟 FS | - | - | 内核进程信息接口 |
| sysfs | 虚拟 FS | - | - | 设备/驱动信息暴露 |
| NFS | 网络 FS | 网络限制 | - | 远程挂载、网络共享 |
| 权限 | 对文件 | 对目录 |
|---|---|---|
| r (4) | 读取文件内容 | 列出目录内容 (ls) |
| w (2) | 修改/删除文件 | 创建/删除子条目 |
| x (1) | 执行文件 | 进入目录 (cd) |
| 位 | 名称 | 效果 |
|---|---|---|
| SUID | Set UID | 执行时以文件所有者身份运行chmod u+s file / chmod 4755 |
| SGID | Set GID | 执行时以文件所属组运行;目录中新文件继承组chmod g+s dir / chmod 2755 |
| Sticky | 粘滞位 | 目录中只有文件所有者才能删除自己的文件chmod +t /tmp / chmod 1777 |
• pass 字段:0=不检查,1=先检查(根分区),2=后检查
• dump 字段:0=不备份,1=备份(已基本废弃)
• 推荐使用 UUID 而不是设备名(设备名可能变化)
| 系统调用 | 原型 | 功能 |
|---|---|---|
open | int open(path, flags, mode) | 打开/创建文件,返回 fd |
read | ssize_t read(fd, buf, count) | 从 fd 读取数据 |
write | ssize_t write(fd, buf, count) | 向 fd 写入数据 |
close | int close(fd) | 关闭文件描述符 |
lseek | off_t lseek(fd, offset, whence) | 移动文件读写位置 |
stat | int stat(path, statbuf) | 获取文件元信息(inode) |
mmap | void* mmap(addr,len,prot,flags,fd,off) | 内存映射文件 |
unlink | int unlink(path) | 删除文件名(减少硬链接) |
rename | int rename(old, new) | 原子重命名(mv 的底层) |
fsync | int fsync(fd) | 刷新页缓存到磁盘(持久化) |