SRE 实战笔记 # | inode · block · 软硬链接 · 真实故障复盘
刚从 Windows 转过来的时候,我最大的困惑是:同一个文件,怎么能有两个名字?删了"原文件",另一个怎么还活着?
后来一次生产事故让我彻底搞懂了这件事——那是凌晨两点,磁盘报满,但 df -h 显示还有空间。我花了四个小时才找到原因。
今天把这些东西一次说清楚。
入行第一天,师傅让我 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 文件名才能看到真实类型。
这是理解 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 满。下次遇到写入失败,记得两个都查。
这两个东西长得像,用途却完全不同。我见过不少人混着用,在关键时候出岔子。
$ 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,升级时只改软链接指向,所有程序自动用新版本,不用改任何配置硬链接的场景:
nginx.conf 做硬链接到备份目录,即使有人误删了"原文件",数据还在⚡ 容易踩的坑:用
cp -p复制文件时,硬链接关系会断开,变成两份独立数据。想保留硬链接关系,要用cp -a或rsync -aH。
# 查文件属性 + 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 的朋友。
评论区欢迎分享你踩过的文件系统的坑 👇