主题
20 · 文件系统:inode、挂载与路径解析
目标:理解 inode / 目录项 / 挂载点,用
stat、ls -i、findmnt验证。
命令行前置:03 · 权限;OS 前置:16。
1. 环境前提
bash
mkdir -p ~/lab/os/fs
cd ~/lab/os/fs1
2
2
2. 概念框(轻量课本)
| 词 | 一句话 |
|---|---|
| inode | 文件的「身份证」:元数据(权限、大小、时间、数据块指针…),不含文件名 |
| 目录项(dentry) | 名字 → inode 号 的映射;目录本身也是一种文件 |
| 路径解析 | 从 / 或 cwd 逐级查目录项,找到目标 inode |
| 挂载(mount) | 把某个文件系统接到已有目录树上的一个挂载点 |
| VFS | 内核里统一的「虚拟文件系统」层,对上提供 open/read,对下接 ext4/xfs/nfs… |
text
路径 /home/u/a.txt
→ 查 / 的目录项 "home"
→ 查 home 的目录项 "u"
→ 查 u 的目录项 "a.txt" → inode → 数据块1
2
3
4
2
3
4
3. 动手:inode 与链接
bash
echo hello > ~/lab/os/fs/a.txt
ls -li ~/lab/os/fs/a.txt
stat ~/lab/os/fs/a.txt1
2
3
2
3
硬链接 vs 软链接:
bash
ln ~/lab/os/fs/a.txt ~/lab/os/fs/a-hard.txt
ln -s ~/lab/os/fs/a.txt ~/lab/os/fs/a-soft.txt
ls -li ~/lab/os/fs/
# 硬链接:同一 inode 号;软链接:新 inode,类型 l
cat ~/lab/os/fs/a-soft.txt1
2
3
4
5
2
3
4
5
| 硬链接 | 软链接(符号链接) | |
|---|---|---|
| inode | 与原文件相同 | 自己的 inode,存路径字符串 |
| 跨文件系统 | 一般不行 | 可以 |
| 删原名 | 只要还有硬链接,数据仍在 | 原文件删了可能变成断链 |
4. 动手:挂载与磁盘
bash
df -hT
findmnt
findmnt /
mount | head # 传统视图;优先学 findmnt1
2
3
4
2
3
4
理解:df 按挂载的文件系统报空间,不是按「目录名漂亮与否」。/ 与 /home 若是不同分区,删 / 下文件不会直接增大 /home 的可用空间。
5. 与命令行篇对照
| 03 / 日常命令 | OS 视角 |
|---|---|
ls -l 权限九位 | 存在 inode 的 mode 里 |
chmod / chown | 改 inode 元数据 |
cd 需要目录 x | 路径解析要「穿越」该目录 |
df / du | 文件系统块用量 vs 目录树汇总 |
6. 动手清单
- [ ]
ls -li与stat读出 inode 号 - [ ] 做一对硬链接,确认 inode 相同;做软链接,确认类型为
l - [ ]
findmnt /与df -hT各看一眼 - [ ] 能口述:文件名在目录里,内容与权限在 inode 侧
7. 常见翻车
| 翻车 | 处理 |
|---|---|
删除软链接目标后 cat 失败 | 正常断链;重指或删链接 |
磁盘满但 du 某目录不大 | 查别的挂载点、已删但仍被进程打开的文件(lsof//proc) |
在 /mnt 未挂载时往里写 | 写进了根文件系统的空目录;挂载后「好像文件消失」 |
8. 官方 / 延伸
man inode、man 7 inode、man stat、man findmnt- inode(7)
下一篇:文件描述符、管道与重定向。
