linux - 软硬链接

发布于:2024-12-19 ⋅ 阅读:(13) ⋅ 点赞:(0)

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 的文件,具体步骤如下:

  1. 从根目录 / 开始查找:文件系统会查找 /home 目录(根目录下的子目录)。

    • / 目录中有一个映射,指向 iNode,它包含了 /home 目录的信息。
  2. 进入 /home 目录:查找 /home 目录中是否有 user 这个子目录。

    • /home 目录有一个映射,指向 /home 目录的 iNode。
  3. 进入 /home/user 目录:查找 /home/user 目录中是否有 file.txt 这个文件。

    • /home/user 目录有一个映射,指向 file.txt 文件的 iNode。
  4. 获取文件的 iNode 信息:从 /home/user 目录获取 file.txt 对应的 iNode,iNode 包含文件的元数据和文件数据的位置。

  5. 读取文件内容:系统根据 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 查看软连接指向路径

 软连接的特点:

  1. 指向路径:软连接保存的是目标文件或目录的路径,而不是直接保存文件内容。它实际上是一个包含目标路径的文本文件。

  2. 可跨文件系统:软连接可以跨文件系统创建,因为它保存的是目标文件的路径(可以是相对路径或绝对路径)。不同于硬链接,硬链接只能在同一文件系统内创建。

  3. 符号链接指向:如果软连接指向的目标文件被删除或移动,软连接会变成“悬挂”状态,称为“死链接”(broken link),会指向一个不存在的路径。

2.2 什么是硬链接

硬连接(Hard Link)是 Unix/Linux 文件系统中的一种文件连接方式,它允许多个文件名指向同一个文件的数据块(也称为 inode)。硬连接与原始文件共享相同的 inode,即使文件名不同,实际存储的内容是相同的。因此,无论通过哪个文件名访问,都会访问到相同的数据。

硬连接的特点:

  1. 指向相同的 inode

    • 硬连接与原始文件共享相同的 inode。inode 是文件系统中存储文件元数据(如文件权限、文件大小、文件数据块位置等)的数据结构。通过硬连接创建的新文件与原始文件是完全相同的,它们只是文件系统中不同的名称。
  2. 删除文件时不会影响数据

    • 由于硬连接和原始文件共享相同的 inode,当删除某一个硬连接文件时,数据仍然保留,只有当所有指向同一 inode 的硬连接都被删除后,文件的数据才会被释放。如果你删除了原始文件名,数据仍然可以通过其他硬连接访问。
  3. 不能跨文件系统

    • 硬连接只能在同一文件系统内创建,不能跨越不同的磁盘或分区。这是因为硬连接是基于 inode 的,而 inode 是与文件系统相关的。
  4. 不能指向目录

    • 除非是超级用户,否则在大多数现代文件系统中,硬连接不能指向目录(以防止创建循环引用,避免文件系统结构混乱)。在某些特殊情况下,系统管理员可以创建指向目录的硬连接,但这种做法一般不推荐。
  5. 访问方式相同

    • 所有硬连接文件在文件系统中是平等的,没有“原始”文件和“硬连接”文件的区别。访问这些硬连接文件时,都是直接访问存储在磁盘上的数据。
2.3 软硬链接的区别
特性 硬链接 (Hard Link) 软链接 (符号链接 Symbolic Link)
指向对象 指向文件的 inode(文件数据块) 指向文件路径(目标文件的路径)
文件类型 不区分原始文件和硬链接,都是相同的文件 是一个特殊文件,文件类型为符号链接 l
跨文件系统 只能在同一文件系统内创建 支持跨文件系统
删除文件后行为

文件数据保留,直到所有硬链接都删除

(删除硬连接不会影响文件内容)

如果目标文件删除,软链接变为悬挂链接

能否指向目录 一般不能指向目录,除非是超级用户 可以指向目录
文件权限 共享相同的文件权限 软链接本身有权限,但无实际意义
创建命令 ln <源文件> <硬链接文件> ln -s <源文件> <软链接文件>
文件查看 ls -li 显示相同的 inode 编号 ls -l 显示目标路径
是否可破损 不会破损,只有删除所有硬连接时才释放文件 如果目标文件或目录被删除,软连接会变成死链接

注:软连接有自己的iNode,是一个独立的文件,硬连接与原始文件共享相同的 inode