直接回答:inode 是文件系统为每个文件分配的元数据结构,记录权限、属主、大小、时间戳、数据块指针和硬链接计数,但不包含文件名。文件名存在目录项里——一个目录本质上就是一张"文件名 → inode 号"的映射表。
展开解析:硬链接是给同一个 inode 增加一个目录项,多个文件名地位完全平等,删一个只是链接计数减一,计数归零才释放数据块。因此硬链接不能跨文件系统(inode 号只在单个文件系统内唯一),普通用户也不允许给目录建硬链接(防止目录树出现环)。软链接(符号链接)本身是一个独立文件,内容是目标路径的字符串,可以跨文件系统、可以指向目录,目标删除后就成了悬空链接,访问报 ENOENT。
ls -li file # 第一列是 inode 号
stat file # 查看链接计数(Links)
实践要点:logrotate 的 create 与 copytruncate 两种模式的区别本质就在 inode:程序按 fd 写日志,create 模式重命名旧文件后进程仍往旧 inode 写,必须通知程序重开日志,否则日志"消失"。同理,删了文件但 df 空间没释放,多半是有进程还持有该文件的 fd。
追问方向:为什么 open 一个文件后要经过路径解析找到 inode?mv 同分区为什么几乎是瞬时操作?硬链接计数存在哪、上限是多少?