软链接和硬链接

简介

Linux 文件系统中的链接 (link),我们可以将其视为文件的别名
链接又可分为两种:硬链接 (hard link) 与软链接 (symbolic link, 又称符号链接)

硬链接的意思是一个档案 (文件或目录) 可以有多个名称
而软链接的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置。

硬链接会被视为单独的文件,但是他们指向同一个文件块 (类似于 C 语言的引用)
软链接会被视为一种特殊的文件,他的含义和内容就是指向另一个文件 (类似于 C 语言的指针)

不论是硬链接或软链接都不会将原本的档案复制一份,只会占用非常少量的空间。

区别和图示

软链接:

  1. 软链接,以路径的形式存在。类似于 Windows 操作系统中的快捷方式
  2. 软链接可以 跨文件系统 ,硬链接不可以
  3. 软链接可以对一个不存在的文件名进行链接
  4. 软链接可以对目录进行链接
  5. 原文件的删除会真正删除文件,会导致软链接失效

硬链接:

  1. 硬链接,以文件副本的形式存在。但不占用实际空间。
  2. 不允许给目录创建硬链接
  3. 硬链接只有在同一个文件系统中才能创建
  4. 原文件的删除不会真正删除文件,硬链接也不会失效

图示如下

linux 文件系统如下,文件指向一个 inode (元数据块), inode 再指向实际的数据块

文件系统的索引结构
img

硬链接是创建新的文件名,指向同一个 inode (类似于引用的概念)

硬链接的结构
img

软链接是创建了新的文件结构,这个文件结构的含义就是指向另一个文件结构 (类似于指针的概念)

软链接的结构
img

实验验证

如下,f2 为 f1 的硬链接,f3 是 f1 的软链接
f1 和 f2 的 inode 相同,但是他们是两个独立的文件,只是指向同一个数据块
f3 则是单独的一类文件,类似于快捷方式

sh
1
2
3
4
5
6
7
8
[root@Linux]$ touch f1 #创建一个测试文件f1
[root@Linux]$ ln f1 f2 #创建f1的一个硬连接文件f2
[root@Linux]$ ln -s f1 f3 #创建f1的一个符号连接文件f3
[root@Linux]$ ls -li # -i参数显示文件的inode节点信息
total 0
9797648 -rw-r--r-- 2 root root 0 Apr 21 08:11 f1
9797648 -rw-r--r-- 2 root root 0 Apr 21 08:11 f2
9797649 lrwxrwxrwx 1 root root 2 Apr 21 08:11 f3 -> f1

此外

  1. 删除符号连接 f3, 对 f1,f2 无影响;
  2. 删除硬连接 f2,对 f1,f3 也无影响;
  3. 删除原文件 f1,对硬连接 f2 没有影响,导致符号连接 f3 失效;
  4. 同时删除 f1 和硬链接 f2, 源文件会被删除

linux 下的 link 命令

用法
ln [参数][源文件或目录][目标文件或目录]

参数如下

--backup[=CONTROL] 备份已存在的目标文件
-b 类似 --backup ,但不接受参数
-d 允许超级用户制作目录的硬链接
-f 强制执行
-i 交互模式,文件存在则提示用户是否覆盖
-n 把符号链接视为一般目录
-s 软链接(符号链接)
-v 显示详细的处理过程

windows 下的 mklink 命令

cmd 中的 mklink 原说明如下

plaintext
1
2
3
4
5
6
7
8
9
MKLINK [[/D] | [/H] | [/J]] Link Target

/D Creates a directory symbolic link. Default is a file
symbolic link.
/H Creates a hard link instead of a symbolic link.
/J Creates a Directory Junction.
Link Specifies the new symbolic link name.
Target Specifies the path (relative or absolute) that the new link
refers to.
  • /d 给目录创建符号链接,简称符号链接、软链接
  • /h 创建硬链接,简称硬链接
  • /j 给目录创建联接点,简称软链接

没有指定参数时,默认文件软链接

注意:
建议使用绝对路径,必须使用英文双引号将路径括起来
命令之间必须有空格

mklink 妙用 - 释放 c 盘空间

众所周知传统 windows 电脑磁盘分多个区,容易出现 C 盘空间不够

于是,我们就可以把 C 盘的一些非系统文件 (如 user 目录,appdata 之类的) 通过目录链接 (/j, 即软链接) 的方式转移到其他盘,而且不会影响系统使用

  • 复制粘贴原目录到你想要的位置
  • 在目录的原位置创建软链接 mklink /j 目录名 目录移动到的位置

比如,我把 c 盘的.cache 目录移动到 E 盘,就是 mklink /j .cache E:\.cache


参考文章
https://zhuanlan.zhihu.com/p/67366919
https://www.jianshu.com/p/b1614a073087
https://cloud.tencent.com/developer/article/1690636