Sunday面试指南

Linux 软链接和硬链接有什么区别?删除原文件后还能访问吗?

下面是一段教学用的模拟面试。

🧑‍💻 面试官:硬链接和软链接有什么区别?

🙋‍♂️ 我:硬链接像复制,软链接像快捷方式。

🧑‍💻 面试官:通过硬链接改内容,另一个名字也能看见。那它真是独立复制吗?

🙋‍♂️ 我:不是,两个名字对应同一份文件。

🧑‍💻 面试官:再删掉最早创建的名字,哪个还能用?为什么日志文件名字删了,磁盘却可能还没释放?

分清三层:「文件名」、「文件本身」,以及「进程已经打开的文件」。

面试速答(60 秒版)

硬链接是为同一文件增加目录项名字,几个名字对应同一份文件与 inode,不是复制一份内容,也没有哪个名字天然是“主名字”。

软链接本身是独立链接对象,保存目标路径;访问时再沿路径寻找目标。因此,它可以跨文件系统、指向目录或暂不存在的路径,但目标路径失效时会成为悬空链接。

删除一个硬链接名字,只减少一条名字到文件的联系;其他硬链接仍然可以访问。删除软链接目标名字后,软链接可能失效,但不能因此说目标内容一定立即消失。

文件空间是否真正释放,还要看是否存在其他硬链接或打开的文件引用。Linux 中,最后名字被删以后,如果进程仍打开该文件,内容仍可继续存在,直到相应引用结束。

硬链接指文件,软链接存路径

知识点详解:两个名字为什么不是两份文件?

文件名负责找到对象,不等于对象本身

假设 report.log 这个目录项,指向文件系统中的一个 inode。inode 关联文件元数据及数据位置等信息。

再创建 hard.log 作为硬链接,相当于增加一个目录项,让它也指向同一 inode。通过任意一个名字修改文件内容,另一个名字访问到的也会是那份内容。

所以,硬链接不是独立副本。两个名字的创建时间先后,也不建立“删主文件就全灭”的关系。Linux link(2)说明了增加名称及相关限制。

判断是否同一文件,不能只比较跨文件系统的 inode 数字;还需要文件系统或设备身份。不同文件系统中的相同 inode 号,不自动表示同一个文件。

软链接多了一次路径寻找

soft.log 可以保存字符串 report.log。这个软链接有自己的链接对象,访问它时再按照目标路径寻找 report.log。

如果目标是相对路径,解释基准是软链接所在目录,不是每次打开它的进程碰巧位于哪个工作目录。symlink(2)说明了这种路径解析。

因此,移动软链接到另一个目录,可能改变相对目标指向的地方。软链接文件本身还在,不保证它继续能找到原目标。

目标可以暂时不存在,等以后出现再变得可访问。创建软链接成功与目标确实可读,是两个检查。

删除一个名字,两条访问路线发生什么?

先假设目录里有 report.log、hard.log,以及目标是 report.log 的 soft.log。

删除 report.log 后,hard.log 仍然直接联系同一 inode,可以访问内容。soft.log 却要寻找已经不存在的 report.log,因此成为悬空链接。

但是,如果之后另建一份新的 report.log,soft.log 又可能找到这份新文件;hard.log 仍对应之前那份文件。两条路线没有因为文字名字一样,就自动重新合并成同一份内容。

这个过程比“硬链接不怕删除,软链接怕删除”更准确:硬链接依赖文件联系,软链接依赖目标路径最终解析到什么。

名字重新出现,不一定还是原文件

为什么硬链接不能随便跨文件系统?

硬链接直接增加同一文件系统对象的名字联系,一般不能跨挂载文件系统创建;Linux 也不允许普通方式给目录随意建立硬链接,避免破坏目录关系等约束。

软链接保存的是路径字符串,可以跨到其他文件系统,也可以指向目录。但能否实际访问,仍受目标存在、权限和挂载状态影响。

所以,软链接的灵活性是路径层面的能力,不是绕过权限的一张通行证。

删除日志名字,为什么进程还能写?

进程打开文件以后,持有的是已经打开的文件引用,不需要每次写入都重新解析原来的名字。

当最后一条名字联系被删除,只要进程仍然打开该文件,Linux 会继续保留它。进程还可能往里面写,磁盘空间也可能继续占用。unlink(2)明确区分了删名和最终释放。

因此,发现删日志后空间没有回落,可以检查哪些进程仍持有已删除文件。但修复不能盲目重启所有服务,更不能误删其他目录;应按日志轮转、关闭或重新打开机制安排。

这也说明,ls 看不到文件名,不代表底层内容和使用引用已经消失。

删了名字,空间为什么没释放?

演练时,先限制在独立目录

可以在自建临时目录中准备一份测试文本,再创建硬链接和软链接。观察 inode、链接计数以及删除单个名字后的访问结果。

如果使用 ls -i 看 inode,软链接需要注意是否跟随目标;检查链接本身与检查目标结果并不是同一操作。

这些操作只在自己创建的测试目录里演练。尤其是删除名字以后继续写入的实验,不要拿正在运行的服务日志试手。

面试官继续追问

cp 和硬链接,哪个改一份会影响另一份?

普通内容复制得到独立文件;硬链接对应同一文件。特殊复制方式还有细节,先限定普通文件操作。

删除 soft.log,会顺便删除目标吗?

正常 unlink 删除的是这个软链接名字,不会因为它保存目标路径就自动删除目标文件。

改文件名以后,打开的文件描述符会立刻失效吗?

通常不会因为名字变化就自动失效。路径查找和已有打开引用是不同层,但具体文件系统与操作仍需按实际语义判断。

面试速记卡

  • 硬链接:多个名字对应同一文件,不是内容复制。
  • 软链接:保存目标路径,访问时再解析,目标可能不存在。
  • 相对目标:按链接所在目录解释,不按调用者工作目录随意变化。
  • 删除名字:其他硬链接仍可用,软链接可能悬空。
  • 释放空间:同时看名字联系与打开引用,不只看 ls 是否显示。

公司面试真题

这道题暂未收录可核验的公司真题来源。你可以先阅读本文解析,或浏览已收录的公司面试真题。

浏览公司面试真题 →
简历汪永久免费在线制作简历,模板直接套用、导出无水印,永久免费、下载免费,不需要付费解锁任何功能。去写简历