为何符号链接循环不会引发问题,而目录硬链接循环被禁止?
这问题问得太戳点了!其实核心原因就藏在硬链接和符号链接的本质差异里,咱们掰开揉碎了说:
硬链接的致命缺陷:平等的inode指向
硬链接本质上是直接指向文件系统里的inode(可以理解为存储文件所有元数据和数据位置的核心标识),而且所有指向同一个inode的硬链接在系统眼里是完全平等的——没有“原文件”和“链接”的区别。
目录本身也是一种特殊文件,咱们平时看到的目录里的..(父目录)其实就是父目录的硬链接。如果允许给目录创建硬链接,随便就能造出死循环:比如给/home/me创建一个硬链接/home/me/loop,那/home/me/loop/..就指向/home/me,而/home/me/loop又和/home/me是同一个inode。这时候系统遍历文件系统时,根本没法判断哪个是循环的起点,会无限递归下去;而且文件系统的引用计数、空间统计都会彻底混乱,删除其中一个链接也没法终止循环,完全没法维护。符号链接的天生优势:可追踪的路径指针
符号链接是个特殊的“快捷方式文件”,它里面存的只是目标路径的字符串,不是直接指向inode。系统处理符号链接时,会先读取这个路径,再去解析对应的目标。
关键在于,系统在遍历或访问文件时,会跟踪自己走过的符号链接路径——比如你创建/home/me/loop指向/home/me,当系统访问/home/me/loop时,会先把/home/me加入遍历记录,然后解析loop的目标是/home/me,这时候发现这个路径已经在记录里了,立刻就知道是循环,直接停止递归或者返回错误。而且符号链接的inode和目标的inode完全不同,系统一眼就能区分开谁是链接谁是原目录,自然能轻松处理这种循环。
简单说就是:硬链接循环会让系统彻底“懵圈”——分不清谁是谁,没法终止;而符号链接循环系统能“记路”,一眼就认出自己绕回来了,所以不会出大问题。
备注:内容来源于stack exchange,提问作者Xetolone

