软链接和硬链接

简介

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则是单独的一类文件, 类似于快捷方式

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原说明如下

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