Linux的软链接和硬链接

补充知识

一、文件路径与分类

1. Linux文件路径分为绝对路径与相对路径,

绝对路径以“/”开始从根目录开始查找,

相对路径则是以当前所在位置开始查找,通常以“./”开始,代表从当前目录的上一级目录开始查找。

2. Linux文件分类及通常颜色表示:

普通文件(白色)、目录文件(蓝色)、

链接文件(浅蓝色或青蓝色)、可执行文件(绿色)、

压缩文件或归档文件(红色)、设备文件(黄色,通常在/Dev目录下)、其他文件。

如文件呈现出红色闪烁状态,则表示该链接文件存在问题或无法访问。

1.Linux链接概念

Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln命令产生硬链接。

软链接实际上只是一段文字,里面包含着它所指向的文件的名字,系统看到软链接后自动跳到对应的文件位置处进行处理

硬联接为文件开设一个新的目录 项,硬链接与文件原有的名字是平权的,在Linux看来它们是等价的。由于这个原因,硬链接不能连接两个不同文件系统上的文件

【硬连接】
硬连接指通过索引节点来进行连接。

在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。

在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。

硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。

其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。

【软连接】
另外一种连接称之为符号连接(Symbolic Link),也叫软连接。

软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。

在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。

2.通过实验加深理解

索引节点的测试

#创建一个测试文件f1
touch f1
#创建f1的一个硬连接文件f2
ln f1 f2
#创建f1的一个符号连接文件f3
ln -s f1 f3
#-i参数显示文件的inode节点信息
ls -li

image-20250825170304105

从上面的结果中可以看出,硬连接文件f2与原文件f1的inode节点相同,均为51245236,然而软链接文件的inode节点不同。

写入数据测试

echo "I am f1 file" >>f1
cat f1
cat f2
cat f3

image-20250825170518257

此时我们删除原始文件f1,再查询硬链接文件f2,软链接文件f3

rm -rf f1
cat f2
cat f3

image-20250825174907606

通过上面的测试可以看出:当删除原始文件f1后,硬连接f2不受影响,但是符号连接f1文件无效

3.软链接和硬链接的区别

硬链接可认为是一个文件拥有两个文件名;

软链接则是系统新建一个链接文件,此文件指向其所要指的文件

(1)软连接可以 跨文件系统 ,硬连接不可以 。

实践的方法就是用共享文件把windows下的 aa.txt文本文档连接到linux下/root目录 下 bb,cc .

ln -s aa.txt /root/bb 连接成功

ln aa.txt /root/bb 失败

(2)关于索引节点的问题 。

硬连接不管有多少个,都指向的是同一个索引节点,会把 结点连接数增加,只要结点的连接数不是 0,文件就一直存在,不管你删除的是源文件还是 连接的文件 。

只要有一个存在 ,文件就存在,当你修改源文件或者连接文件任何一个的时候 ,其他的文件都会做同步的修改。

软链接不直接使用索引节点号作为文件指针,而是使用文件路径名作为指针。

所以 删除连接文件对源文件无影响,但是删除源文件,连接文件就会找不到要指向的文件 。

软链接有自己的inode,并在磁盘上有一小片空间存放路径名.

(3)软连接可以对一个不存在的文件名进行连接 。

(4)软连接可以对目录进行连接。

总结:

硬链接特点:

  • 只有文件可以建立硬链接,目录不可以。
  • 类似于复制多份文件,但实际上只是增加了一个文件名指向同一个inode。
  • 删除一个硬链接并不会影响文件本身,只有当最后一个硬链接被删除时,文件的数据块及目录的连接才会被释放。

软链接特点:

  • 文件和目录都可以建立软链接。
  • 删除软链接不会影响被指向的文件或目录。
  • 如果被指向的文件或目录被移动、重命名或删除,软链接将失效。

软链接优点:

  • 创建快捷方式:在不移动原文件或目录的情况下,创建一个指向它的快捷方式。
  • 简化路径:将较长或复杂的路径简化为一个易于记忆和使用的路径。
  • 跨文件系统访问:软链接可以跨越不同的文件系统或磁盘分区。
  • 共享库链接:在Linux系统中,软链接还可以用于链接共享库文件。

4.语法

ln [参数] [源文件/目录] [目标文件/目录]

#常用参数

  • -s 软链接(符号链接)
  • -b 删除,覆盖以前建立的链接
  • -d 允许超级用户制作目录的硬链接
  • -f 强制执行
  • -i 交互模式,文件存在则提示用户是否覆盖
  • -n 把符号链接视为一般目录
  • -v 显示详细的处理过程
  • -S "-S<字尾备份字符串> "或 “–suffix=<字尾备份字符串>”
  • -V “-V<备份方式>“ 或”–version-control=<备份方式>”
  • –help 显示帮助信息
  • –version 显示版本信息

5.案例:

案例1:硬链接的创建与验证

# 创建测试文件
echo "Hello, Hard Link" > file1.txt
# 创建硬链接
ln file1.txt file1_hardlink

# 验证inode和内容
ls -li file1.txt file1_hardlink  # 输出inode相同
# 577706 -rw-r--r-- 2 root root 17 6月  14 08:00 file1_hardlink
# 577706 -rw-r--r-- 2 root root 17 6月  14 08:00 file1.txt
cat file1.txt                   # 输出内容
# Hello, Hard Link
cat file1_hardlink              # 输出相同内容
# Hello, Hard Link

# 删除原文件,验证硬链接是否仍有效
rm file1.txt
# rm:是否删除普通文件 "file1.txt"?y
cat file1_hardlink              # 仍可访问内容
# Hello, Hard Link

解析:

ls -li显示inode号,确认硬链接与原文件共享inode。
删除原文件后,硬链接仍能访问数据,因数据块未被释放。

案例2:硬链接的创建与验证

# 1. 创建测试文件
echo "This is the original file content." > original.txt

# 2. 创建硬链接
ln original.txt hardlink_to_original

# 3. 验证inode和内容
ls -li original.txt hardlink_to_original
# 33577698 -rw-r--r-- 2 root root 35 6月  19 22:30 hardlink_to_original
# 33577698 -rw-r--r-- 2 root root 35 6月  19 22:30 original.txt
cat original.txt
# This is the original file content.
cat hardlink_to_original
# This is the original file content.

# 4. 修改硬链接内容,验证原文件是否同步
echo "Modified via hardlink." >> hardlink_to_original
cat original.txt
# This is the original file content.
# Modified via hardlink.

# 5. 删除原文件,验证硬链接是否仍有效
rm original.txt
# rm:是否删除普通文件 "original.txt"?y
cat hardlink_to_original
# This is the original file content.
# Modified via hardlink.

解析:

ls -li 显示inode号,确认硬链接与原文件共享inode。
修改硬链接内容后,原文件内容同步更新,因两者指向同一数据块。
删除原文件后,硬链接仍能访问数据,因数据块未被释放。

案例3:软连接的创建与验证

# 创建测试文件
echo "Hello, Soft Link!" > file2.txt

# 创建软连接
ln -s file2.txt file2_softlink

# 验证软连接指向
ls -l file2_softlink 
# wxrwxrwx 1 root root 9 6月  19 18:09 file2_softlink -> file2.txt
cat file2_softlink              # 输出内容
# Hello, Soft Link

# 删除原文件,验证软连接是否失效
rm file2.txt
# rm:是否删除普通文件 "file2.txt"?y
cat file2_softlink 
# cat: file2_softlink: 没有那个文件或目录

解析:

ls -l 显示软连接的路径指向。
删除原文件后,软连接失效,因路径无效。

案例4:软连接的创建与验证

# 1. 创建测试文件
echo "This is the original file content." > original.txt

# 2. 创建软连接(使用相对路径)
ln -s original.txt symlink_to_original

# 3. 验证软连接指向
ls -l symlink_to_original
# lrwxrwxrwx 1 root root 12 6月  20 17:04 symlink_to_original -> original.txt
cat symlink_to_original
# This is the original file content.

# 4. 修改原文件内容,验证软连接是否同步
echo "Modified via original file." >> original.txt
cat symlink_to_original
# This is the original file content.
# Modified via original file.

# 5. 删除原文件,验证软连接是否失效
rm original.txt
# rm:是否删除普通文件 "original.txt"?y
cat symlink_to_original
# cat: symlink_to_original: 没有那个文件或目录

解析:

ls -l 显示软连接的路径指向(相对路径或绝对路径)。
修改原文件内容后,软连接访问的内容同步更新,因软连接通过路径访问原文件。
删除原文件后,软连接失效,因路径无效。

案例5:软连接的跨文件系统与目录链接

# 1. 创建测试文件(在另一个文件系统或目录下)
mkdir /tmp/testdir
echo "External file content." > /tmp/testdir/external.txt

# 2. 创建软连接(跨文件系统或目录)
ln -s /tmp/testdir/external.txt ~/external_symlink

# 3. 验证软连接
ls -l ~/external_symlink
# lrwxrwxrwx 1 root root 25 6月  20 17:14 /root/external_symlink -> /tmp/testdir/external.txt
cat ~/external_symlink
# External file content.

# 4. 创建目录的软连接
mkdir ~/mydir
ln -s ~/mydir ~/mydir_symlink
ls -l ~/mydir_symlink
# lrwxrwxrwx 1 root root 11 6月  20 17:16 /root/mydir_symlink -> /root/mydir

解析:

软连接可跨文件系统或目录,因它仅存储路径而非inode。
链接目录时,软连接会指向目录路径,可通过软连接访问目录内容

6.常见错误与解决方法

错误1:硬链接跨文件系统创建失败

错误信息:ln: failed to create hard link 'file': Invalid cross-device link

原因:硬链接依赖inode,不同文件系统的inode不共享。
解决:改用软连接。

错误2:软连接路径错误

错误信息:cat: /path/to/softlink: No such file or directory
原因:软连接指向的路径不存在或拼写错误。
解决:检查路径或重新创建软连接。

错误3:删除软连接时误删原文件

现象:误执行rm softlink时,实际删除的是软连接文件本身,而非原文件。
注意:删除软连接需谨慎,避免误删原文件。

错误4:软连接路径解析问题

现象:软连接使用相对路径时,移动软连接文件后路径失效。

示例:

# 创建软连接(相对路径)
ln -s ../original.txt subdir/symlink
# 移动软连接到其他目录后,路径失效
mv subdir/symlink /tmp/
cat /tmp/symlink  # 报错,因路径解析失败

解决:
使用绝对路径创建软连接(如ln -s /full/path/to/original.txt symlink)。
或确保软连接与原文件的相对路径关系不变。

7.理论练习

问答题:硬链接和软连接的主要区别是什么?
答案:

  • 硬链接共享inode和磁盘数据块,软连接是独立文件存储路径。

问答题:为什么硬链接不能跨文件系统?
答案:

  • 因inode是文件系统唯一的,不同文件系统的inode不共享。

问答题:硬链接和软连接在文件修改时行为有何不同?
答案:

  • 硬链接:修改任一硬链接内容会影响所有硬链接(共享数据块)。
  • 软连接:修改原文件内容会影响软连接(通过路径访问)。

问答题:为什么硬链接不能链接目录?
答案:

  • 避免循环引用(如a -> b,b -> a),导致文件系统遍历陷入死循环。

问答题:软连接的路径是相对路径还是绝对路径?哪种更可靠?
答案:

  • 软连接的路径可以是相对或绝对路径。
  • 绝对路径更可靠,因移动软连接文件后相对路径可能失效。

问答题:删除原文件后,硬链接和软连接的行为有何不同?
答案:

  • 硬链接:仍可访问数据(数据块未释放)。
  • 软连接:失效(断链),访问时报错。

8.实操练习

练习:创建文件test.txt,为其创建硬链接test_hard和软连接test_soft,验证两者行为。

echo "Test Content" > test.txt

ln test.txt test_hard

ln -s test.txt test_soft

ls -li test.txt test_hard test_soft  # 硬链接inode相同,软连接不同
# 33616738 -rw-r--r-- 2 root root 13 6月  20 18:11 test_hard
# 33616739 lrwxrwxrwx 1 root root  8 6月  20 18:11 test_soft -> test.txt
# 33616738 -rw-r--r-- 2 root root 13 6月  20 18:11 test.txt

rm test.txt
# rm:是否删除普通文件 "test.txt"?y

cat test_hard  # 仍可访问
# Test Content

cat test_soft  # 报错
# cat: test_soft: 没有那个文件或目录

练习:在/tmp目录下创建软连接指向/etc/passwd,验证其内容。

ln -s /etc/passwd /tmp/passwd_softlink

ls -l /tmp/passwd_softlink
# lrwxrwxrwx 1 root root 11 6月  20 18:13 /tmp/passwd_softlink -> /etc/passwd

 # 输出/etc/passwd内容
cat /tmp/passwd_softlink 
# root:x:0:0:root:/root:/bin/bash
# bin:x:1:1:bin:/bin:/sbin/nologin
# daemon:x:2:2:daemon:/sbin:/sbin/nologin
# adm:x:3:4:adm:/var/adm:/sbin/nologin
# lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
# ……

练习:创建文件data.txt,为其创建硬链接data_hard和软连接data_soft,验证两者行为。

# 1. 创建文件
echo "Initial content." > data.txt

# 2. 创建硬链接和软连接
ln data.txt data_hard
ln -s data.txt data_soft

# 3. 验证inode和内容
# 硬链接inode相同,软连接不同
ls -li data.txt data_hard data_soft  
# 33616740 -rw-r--r-- 2 root root 17 6月  20 18:20 data_hard
# 33616741 lrwxrwxrwx 1 root root  8 6月  20 18:20 data_soft -> data.txt
# 33616740 -rw-r--r-- 2 root root 17 6月  20 18:20 data.txt

# 输出相同内容
cat data.txt data_hard data_soft      
# Initial content.
# Initial content.
# Initial content.

# 4. 修改硬链接内容,验证原文件和软连接
echo "Modified via hardlink." >> data_hard

cat data.txt # 输出包含新增内容
# Initial content.
# Modified via hardlink.

cat data_soft # 输出包含新增内容
# Initial content.
# Modified via hardlink.

# 5. 删除原文件,验证硬链接和软连接
rm data.txt
# rm:是否删除普通文件 "data.txt"?y

cat data_hard # 仍可访问
# Initial content.
# Modified via hardlink.

cat data_soft # 报错
# cat: data_soft: 没有那个文件或目录

练习:创建目录mydir,为其创建软连接mydir_symlink,验证是否可通过软连接访问目录内容。

# 1. 创建目录和文件
mkdir mydir
echo "File in mydir." > mydir/file.txt

# 2. 创建软连接
ln -s mydir mydir_symlink

# 3. 验证软连接
ls -l mydir_symlink # 输出指向mydir
# lrwxrwxrwx 1 root root 5 6月  20 18:46 mydir_symlink -> mydir

cat mydir_symlink/file.txt # 输出文件内容
# File in mydir.

image-20250826104858736

参考文章:Linux软连接和硬链接 - iTech - 博客园

linux 链接的使用 创建和删除符号连接(软、硬链接) - 追忆丶年华 - 博客园

在Linux中,什么是硬链接和软链接? - 黄嘉波 - 博客园

「Linux文件及目录管理」硬链接与软连接_huijianight的技术博客_51CTO博客

posted @ 2025-08-26 10:56  月映冷香如你  阅读(13)  评论(0)    收藏  举报