1.目录
学习软硬链接肯定必须要了解文件和目录,文件学习可参考linux - 存储管理-CSDN博客。
1.1 如何理解目录
目录也是文件:在Linux系统中,目录是一种特殊文件类型。它与普通文件的区别在于,它不仅存储数据,还存储于有关文件系统中其他的文件信息。目录本身不存储文件内容,而是存储文件名与其对应文件的iNode映射关系。
1.2 目录有内容吗
code是一个目录,打开目录,目录里面是有内容的。目录有属性和数据所以也需要有自己的iNode。
目录存储的内容:目录文件每个条目包含一个文件名和该文件的iNode(包含文件的权限,大小,所属组等)号。目录文件提供一个名字,并通过iNode与实际元数据对应。
为什么同一个目录下不可以有同名文件?
iNode是唯一标识:目录中iNode与文件名向映射,每个文件都通过iNode唯一标识,而iNode是文件系统的核心。
映射冲突:如果同级目录下文件名相同,文件系统无法区分它们的iNode。
文件名的唯一性:目录文件中必须保持文件名的唯一性,确保文件能够正常的标识和访问。
注:目录也是文件,那么它也受文件权限约束,没有‘r’‘w’‘x’,普通用户也无法使用该目录。
1.3 怎样通过文件名找到文件
在linux中,文件系统并不认识文件名。linux文件系统层次化(类似树形结构),如下图所示
假设你要访问一个路径为 /home/user/file.txt
的文件,具体步骤如下:
从根目录
/
开始查找:文件系统会查找/home
目录(根目录下的子目录)。/
目录中有一个映射,指向iNode
,它包含了/home
目录的信息。
进入
/home
目录:查找/home
目录中是否有user
这个子目录。/home
目录有一个映射,指向/home
目录的 iNode。
进入
/home/user
目录:查找/home/user
目录中是否有file.txt
这个文件。/home/user
目录有一个映射,指向file.txt
文件的 iNode。
获取文件的 iNode 信息:从
/home/user
目录获取file.txt
对应的 iNode,iNode 包含文件的元数据和文件数据的位置。读取文件内容:系统根据
iNode
中的块指针,访问文件数据所在的磁盘位置,读取文件内容。
每次这样查找文件会大大降低效率,linux为解决这一问题,使用了
缓存机制(dentry和iNode缓存):
在实际操作中,文件系统会将已解析的路径信息和 iNode 信息缓存在内存中,以加速文件的访问。
- dentry 缓存:存储目录项(文件名到 iNode 的映射)。
- iNode 缓存:存储文件的 iNode 信息。
当文件路径已经被访问过,Linux 可以直接从缓存中获取文件的 iNode 和其他元数据,而无需再次查找。
2.软连接与硬链接
创建软连接命令
ln -s <source> <link>
创建硬链接命令
ln <source> <link>
2.1 什么是软连接?
Unix/Linux 系统中一种特殊的文件类型,类似于 Windows 中的快捷方式。它是指向另一个文件或目录的引用,允许你在文件系统中创建一个指向目标文件或目录的路径。
ls -li 查看软连接指向路径
软连接的特点:
指向路径:软连接保存的是目标文件或目录的路径,而不是直接保存文件内容。它实际上是一个包含目标路径的文本文件。
可跨文件系统:软连接可以跨文件系统创建,因为它保存的是目标文件的路径(可以是相对路径或绝对路径)。不同于硬链接,硬链接只能在同一文件系统内创建。
符号链接指向:如果软连接指向的目标文件被删除或移动,软连接会变成“悬挂”状态,称为“死链接”(broken link),会指向一个不存在的路径。
2.2 什么是硬链接
硬连接(Hard Link)是 Unix/Linux 文件系统中的一种文件连接方式,它允许多个文件名指向同一个文件的数据块(也称为 inode)。硬连接与原始文件共享相同的 inode,即使文件名不同,实际存储的内容是相同的。因此,无论通过哪个文件名访问,都会访问到相同的数据。
硬连接的特点:
指向相同的 inode:
- 硬连接与原始文件共享相同的 inode。inode 是文件系统中存储文件元数据(如文件权限、文件大小、文件数据块位置等)的数据结构。通过硬连接创建的新文件与原始文件是完全相同的,它们只是文件系统中不同的名称。
删除文件时不会影响数据:
- 由于硬连接和原始文件共享相同的 inode,当删除某一个硬连接文件时,数据仍然保留,只有当所有指向同一 inode 的硬连接都被删除后,文件的数据才会被释放。如果你删除了原始文件名,数据仍然可以通过其他硬连接访问。
不能跨文件系统:
- 硬连接只能在同一文件系统内创建,不能跨越不同的磁盘或分区。这是因为硬连接是基于 inode 的,而 inode 是与文件系统相关的。
不能指向目录:
- 除非是超级用户,否则在大多数现代文件系统中,硬连接不能指向目录(以防止创建循环引用,避免文件系统结构混乱)。在某些特殊情况下,系统管理员可以创建指向目录的硬连接,但这种做法一般不推荐。
访问方式相同:
- 所有硬连接文件在文件系统中是平等的,没有“原始”文件和“硬连接”文件的区别。访问这些硬连接文件时,都是直接访问存储在磁盘上的数据。
2.3 软硬链接的区别
特性 | 硬链接 (Hard Link) | 软链接 (符号链接 Symbolic Link) |
---|---|---|
指向对象 | 指向文件的 inode(文件数据块) | 指向文件路径(目标文件的路径) |
文件类型 | 不区分原始文件和硬链接,都是相同的文件 | 是一个特殊文件,文件类型为符号链接 l |
跨文件系统 | 只能在同一文件系统内创建 | 支持跨文件系统 |
删除文件后行为 | 文件数据保留,直到所有硬链接都删除 (删除硬连接不会影响文件内容) |
如果目标文件删除,软链接变为悬挂链接 |
能否指向目录 | 一般不能指向目录,除非是超级用户 | 可以指向目录 |
文件权限 | 共享相同的文件权限 | 软链接本身有权限,但无实际意义 |
创建命令 | ln <源文件> <硬链接文件> |
ln -s <源文件> <软链接文件> |
文件查看 | ls -li 显示相同的 inode 编号 |
ls -l 显示目标路径 |
是否可破损 | 不会破损,只有删除所有硬连接时才释放文件 | 如果目标文件或目录被删除,软连接会变成死链接 |
注:软连接有自己的iNode,是一个独立的文件,硬连接与原始文件共享相同的 inode