目录一、概述二、软/硬链接的创建与删除三、理解软/硬链接1. 理解硬链接2. 理解软链接四、软/硬链接的应用1. 软链接的应用2. 硬链接的应用2.1 为什么普通用户不能给目录创建硬链接五、Access、Modify、Change一、概述软链接软链接是一个特殊的文件其内容是另一个文件或目录的路径名。当访问软链接时系统会通过该路径名找到并访问目标文件或目录。软链接类似于Windows系统中的快捷方式它存储的是目标文件的路径而不是文件本身的数据。硬链接硬链接是另一个文件的名称与原始文件共享相同的inode索引节点信息。在Linux系统中每个文件都有一个唯一的 inode 号硬链接通过指向同一个 inode 号来实现对文件的访问。二、软/硬链接的创建与删除创建一个软链接文件。命令ln -s [目标文件或目录] [链接名]其中ln 表示 links 表示 soft 。我们会发现新创建的软链接文件的类型为 “l”“l” 指的就是链接文件。软链接文件有自己的 inode。【既然它有独立的 inode说明它就是一个独立的文件。】链接数为 1。创建一个硬链接。命令ln [目标文件] [链接名]我们会发现用硬链接的方式创建的文件和目标文件的类型是一样的。用硬链接的方式创建的文件没有自己的 inode。链接数变为了 2。因此我们就得到了软链接和硬链接的最大区别为是否具有独立的 inode。删除一个软 / 硬链接命令unlink 链接名三、理解软/硬链接1. 理解硬链接建立一个硬链接到底做了什么呢通过上图会发现这个硬链接除了名字和原来的文件不一样其它属性都是一样的。同时我们会发现当 myfile.txt 大小发生变化时硬链接的大小也跟着变化了。软链接的大小没有变。并且当我们使用 cat 命令查看文件内容时会发现硬链接显示的内容和原文件的内容是一样的。所以建立硬链接根本就没有创建新文件。因为没有给硬链接分配独立的 inode。 既然没有创建新文件那么硬链接就一定没有自己的属性集合和内容集合。它用的一定是别人的 inode 和内容。所以我们可以得到这样一张图通过上图我们可以得到建立一个硬链接就是在指定的路径下新增文件名和 inode 编号的映射关系。其实在每个 inode 里面都有一个引用计数表示指向该 inode 的硬链接目录项数量。每当创建一个新的硬链接时引用计数会增加删除一个硬链接时引用计数会减少。所以当我们没创建硬链接的时候myfile.txt 的硬链接数为 1 当我们创建硬链接之后 myfile.txt 的硬链接数就变为为 2 了。如果我们把 myfile.txt 给删除掉会怎样呢我们会发现软链接的指向已经发生问题了因为它所指向的文件被删了。我们这里先不管。但是我们也会发现我们的硬链接所指向的文件还在并且引用计数变为1了。这就说明我们已经去掉了一组映射关系。所以什么时候一个文件才算真正被删除呢当一个文件的硬链接数变为 0 的时候这个文件才算是真正的被删除了。2. 理解软链接通过上图我们会发现当我们将软链接曾经所指向的文件名给删除后它就会疯狂闪烁。并且它还会告诉我们这个文件不存在。可是事实上这个文件1323250其实还存在。如果我们再创建一个 myfile.txt。我们会发现这个软链接又有用了。虽然它已不再是曾经的它了。所以我们可以得到软链接在标定一个文件的时候它不是用目标文件的 inode 标定的而是用目标文件的文件名标定的。我们知道软链接是一个独立文件它有自己的 inode也有自己的数据块。inode 是用来存属性的。那么它的数据块里面存什么呢其实它的数据块里面保存的就是所指向的目标文件的路径。所以当我们将目标文件名给删除了在软链接看来这个文件就被删除了这个软链接也就失效了。那么软 / 硬链接有哪些应用场景呢四、软/硬链接的应用1. 软链接的应用我们上面说过其实软链接就对应于Windows上的快捷方式。既然是快捷方式那么它就一定能够帮我们快速的定位一个文件。假设在 myfile/Test 里面有一个可执行文件 test 如果我们没有用软链接我们要执行它可能就会带一长串路径。如果我们创建一个软链接会发现我们照样可以用软链接的方式运行这个程序。所以软链接的应用就在于这里。2. 硬链接的应用当我们创建一个普通文件和空目录我们会发现普通文件默认的引用计数为 1空目录默认的引用计数为 2。那么为什么一个普通文件默认的引用计数为 1 呢因为一个普通文件本身就有一个文件名、一个自己的 inode 以及对应的一个映射关系。 所以引用计数为 1。那么为什么一个空目录默认的引用计数为 2 呢当我们查看这个空目录的属性时会发现它的 inode 为 1323251。当我们进入空目录并且查看被隐藏的目录时我们知道‘.’ 指的就是当前目录这就意味着‘.’ 就是 empty 。因为 ‘.’ 和 empty 的 inode 都是1323251。这也就意味着‘.’ 是 empty 的硬链接。所以空目录默认的引用计数为 2 。如果我们在 empty 目录下再创建一个空目录 mydir 我们会发现mydir 的 默认引用计数也为 2这没什么问题。但是当我们退出来后我们会发现empty 这个目录的引用计数变为 3 了。原因就在于当我们在一个目录下面再创建一个目录时里面的那一个目录mydir里面会有一个 “..” 它表示上级目录它其实也是 empty 的硬链接。所以引用计数就变为 3 了。2.1 为什么普通用户不能给目录创建硬链接当我们给目录创建硬链接的时候我们会发现Linux不允许普通用户给目录建立硬链接。当我们给目录创建软链接的时候我们会发现我们可以给目录创建软链接。为什么会出现这样的现象呢原因就在于1. 保障文件系统的完整性硬链接使多个文件路径指向同一文件系统对象。如果允许对目录建立硬链接可能导致循环引用例如一个目录成为自己的父目录从而破坏文件系统的层次结构。目录结构是树状的硬链接可能打破这种树状结构导致文件系统操作如遍历、备份等变得复杂甚至失败。2. 避免无限递归如果目录之间通过硬链接形成循环文件系统的遍历操作如 ls、find可能陷入无限递归导致系统性能下降甚至崩溃。3. 权限与安全问题目录硬链接可能被恶意利用来绕过权限检查。例如用户可以通过硬链接创建某种路径访问原本无权访问的目录。4. 文件系统设计Linux和大多数类Unix系统中目录硬链接仅允许由内核在特定情况下创建例如父目录对子目录的引用是硬链接。常规用户无法通过API直接操作创建目录硬链接。ln 命令也明确限制了这项功能。5. 软链接的存在符号链接软链接可以实现大部分普通用户对目录链接的需求而不会破坏文件系统的树形结构。软链接是一种更灵活、安全的解决方案。例外情况尽管普通用户不能对目录创建硬链接超级用户root 在某些文件系统中可能通过低级命令或特殊工具如 debugfs强制创建。但这通常不推荐因为可能导致系统不稳定或难以维护。总结限制普通用户对目录创建硬链接是为了保障文件系统的完整性、安全性以及操作的可预测性。如果需要链接目录可以使用符号链接ln -s这是一种更安全的替代方案。最后我们再来讲一下Access、Modify、Change三个时间。五、Access、Modify、Change对于Change它指的是文件属性最近被修改的时间。由于文件属性内容。自然我们可以只修改文件的属性。修改文件的权限会发现Change时间发生了变化其它时间没有变。对于Modify它指的是文件内容最近被修改的时间。由于我们将文件内容给修改了那么这个文件的属性大概率也会被改变比如文件大小发生变化。所以当Modify时间发生改变Change时间也会跟着改变。在文件里面添加内容会发现Modify时间和Change时间都发生了变化。对于Access它指的是文件被访问的时间。但是Access是要访问达到一定次数后才会更改。原因是一般访问文件的次数是很多的所以Access就会被频繁更改。由于我们的文件是存放在磁盘的所以操作系统就会频繁的访问磁盘。这会对系统带来负担。同时其实我们也不会去关注一个人在什么时候访问了文件。既然都把权限放开了还在乎他什么时候访问了文件吗不想让人访问文件改文件权限就可以了。所以Access是要访问达到一定次数后才会更改。访问文件会发现Access时间在我们多次访问文件后并没有发生改变。