当前位置:首页>Linux>Linux文件系统:我踩过的那些坑,你不用再踩

Linux文件系统:我踩过的那些坑,你不用再踩

  • 2026-10-11 08:17:16
Linux文件系统:我踩过的那些坑,你不用再踩

SRE 实战笔记 # | inode · block · 软硬链接 · 真实故障复盘


刚从 Windows 转过来的时候,我最大的困惑是:同一个文件,怎么能有两个名字?删了"原文件",另一个怎么还活着?

后来一次生产事故让我彻底搞懂了这件事——那是凌晨两点,磁盘报满,但 df -h 显示还有空间。我花了四个小时才找到原因。

今天把这些东西一次说清楚。


01 先把文件属性看明白

入行第一天,师傅让我 ls -lh 看一下目录,我盯着输出发了半天呆。现在我知道了,那一行输出里藏着你需要的所有信息:

$ ls -lh /drwxr-xr-x  75 root root  8.0K  2月  2 2022  etclrwxrwxrwx   1 root root     7  6月 10 15:38 bin -> usr/bin-rw-r--r--   1 root root  3.0M 11月 10 2017  test.txt# ↑         ↑   ↑    ↑     ↑              ↑# 权限    硬链接数 所有者  组   大小           文件名

第一个字符是文件类型:d 是目录,l 是软链接,- 是普通文件。

权限三段式,一次记住

d  rwx  r-x  r-x↑   ↑    ↑    ↑类型 属主  属组  其他人# 实战:给脚本加执行权限chmod u+x deploy.sh    # 只给属主加chmod 755 deploy.sh    # 属主rwx,属组和其他人r-x

💡 和 Windows 最大的区别:Linux 不靠扩展名判断文件类型。你把 script.sh 改名成 script.jpg,它依然是个脚本。用 file 文件名 才能看到真实类型。


02 inode 和 block:磁盘的"身份证 + 储物柜"

这是理解 Linux 文件系统的核心。

inode 是一张身份证,记着你是谁、你有什么权限、你的东西放在哪个柜子里。

block 是储物柜本体,真正装着你的东西。

文件名?那只是门卫登记表上的一个备注。

一次文件读取,背后发生了三件事

当你执行 cat config.yaml,内核其实做了这三步:

第一步:在当前目录的 inode 里,找到 config.yaml 对应的 inode 号(比如 67157072)

第二步:通过 inode 号读取 inode 信息,权限校验,找到数据存在哪些 block 上

第三步:依次读取这些 block,把数据拼成完整内容返回给你

# 查看文件的完整 inode 信息$ stat config.yaml  文件:"config.yaml"  大小:2048      块:8       IO 块:4096   普通文件设备:fd00h/64768d  Inode:67157072    硬链接:2权限:(0644/-rw-r--r--)# 快速查 inode 号$ ls -i config.yaml67157072 config.yaml# 查 inode 使用量,别只看磁盘容量!$ df -i文件系统        Inode  已用(I)  可用(I)  已用(I)%/dev/sda1      524288     326   523962       1%

⚠ 那次凌晨两点的事故

磁盘显示还有空间,但写文件一直报错。最后用 df -i 发现 inode 耗尽了——根分区创建了几千万个小缓存文件,inode 用完了但 block 还剩不少。

磁盘满不一定是 block 满,也可能是 inode 满。下次遇到写入失败,记得两个都查。


03 软链接 vs 硬链接:别用错了

这两个东西长得像,用途却完全不同。我见过不少人混着用,在关键时候出岔子。

核心区别一张表

特性
硬链接
软链接
本质
同一 inode 的别名
独立文件,存的是路径
inode 号
与源文件相同
有自己独立的
跨文件系统
❌ 不支持
✅ 支持
链接目录
❌ 不允许
✅ 允许
源文件删除后
数据依然存在
链接失效(终端里变红)

亲手验证一次,胜过背十遍

$ echo"hello world" > original.txt# 创建硬链接$ ln original.txt hardlink.txt# 创建软链接$ ln -s original.txt softlink.txt$ ls -li67256796 -rw-r--r--. 2 root root 12  hardlink.txt   # inode 相同!67256796 -rw-r--r--. 2 root root 12  original.txt   # 硬链接数变成267298001 lrwxrwxrwx. 1 root root 12  softlink.txt -> original.txt# 删除源文件,观察差异$ rm original.txt$ cat hardlink.txt      # 还能读!数据没丢hello world$ cat softlink.txt      # 报错!cat: softlink.txt: No such file or directory

我们团队实际怎么用

软链接的场景:

  • 版本切换:ln -s /opt/jdk-17 /usr/local/java,升级时只改软链接指向,所有程序自动用新版本,不用改任何配置
  • 配置统一管理:把配置文件放在统一目录,用软链接指向各个服务,方便 Ansible 批量操作

硬链接的场景:

  • 防误删:给重要的 nginx.conf 做硬链接到备份目录,即使有人误删了"原文件",数据还在
  • 节省磁盘:Docker 镜像层、备份系统大量使用硬链接共享相同数据块,实测可节省 60% 以上

⚡ 容易踩的坑:用 cp -p 复制文件时,硬链接关系会断开,变成两份独立数据。想保留硬链接关系,要用 cp -a 或 rsync -aH。


04 速查表,收藏备用

# 查文件属性 + inode 号ls -lhi# 查完整 inode 信息(时间戳 / 权限 / 硬链接数)stat filename# 同时查 block 用量和 inode 用量(两个都要看!)df -h && df -i# 快速找出哪个目录占用最多磁盘du -sh /var/log/*# 查文件真实类型(不依赖扩展名)file filename# 创建软链接(常用于版本管理)ln -s target linkname# 创建硬链接(防误删利器)ln target linkname# 通过 inode 号找出所有硬链接find / -inum 67256796# 找出所有悬空软链接(源文件已删除的)find /tmp -maxdepth 1 -type l -xtype l

理解 inode 之前,你只是在"用" Linux。

理解之后,你才开始真正"读懂" Linux。


下一期打算写 /proc 文件系统——那里面没有一个字节是真实存在于磁盘上的,但它能告诉你整个系统正在发生什么。以及我怎么用它在不重启的情况下,把线上服务器的 TCP TIME_WAIT 从 8 万条降到了 3 千条。

如果这篇文章帮到了你,转发给同样在学 Linux 的朋友。

评论区欢迎分享你踩过的文件系统的坑 👇


#Linux#SRE#运维#文件系统#故障排查

SRE 核心知识inode 与 block:磁盘排查的地基,你真的搞清楚了吗?

最新文章

随机文章