软链接 vs. 硬链接
链接大家都用过,比如 Windows 中的快捷方式就是一种链接,可是 Linux 里又分硬链接和软链接,它们表示什么意思,又有什么区别呢,本文来给大家做一个解释。
Inode 索引节点
要想理解硬链接和软链接的区别,首先要明白什么是 Inode。Inode 是 Index node,索引节点的意思。每个文件都有一个 inode,里边保存着文件的元数据(meta data),包括:inode 号、文件大小、文件所有者、文件权限、文件类型、创建时间、硬链接数等等,除了文件名以外的所有文件信息都存储在这里。它是文件或者目录在一个文件系统中的唯一标识。
查看一个文件的 inode,可以用 stat 命令,或者 ls -i 选项来查看。下面分别用这两个命令来查看一个文件 myfile.txt 的 inode 号为 102171635

和元数据相对应的是用户数据(user data),或者也叫文件数据块(data block),文件的真实内容是存储在这里边的。我们通过一个文件名可以查到它对应的 inode,再通过 inode 去查看文件的内容。它们之间的关系可以用下面这张图来表示。

硬链接 Hard Links
当多个文件名指向同一个 inode 时,这种链接就被称为硬链接。比如像下面的这种情况,我们为原始文件 myfile.txt 创建了两个链接,hardlink1 和 hardlink2,它们都指向同一个 inode,所以它们都是硬链接。从图中可以看出,硬链接指向的文件内容其实就是原始文件的内容,所以硬链接的作用之一就是可以节省服务器的磁盘空间。

硬链接的另外一个作用就是可以防止文件被“误删”。因为 inode 会记录文件硬链接的次数,只有当硬链接等于 0 的时候,才会把存储着文件内容的数据块删除,所以比如我不小心把 myfile.txt 文件删除了,但是 inode 发现还有另外两个硬链接在,所以不会删除掉数据块,通过两个硬链接我们还是可以读取到文件内容。

硬链接可以通过 ln [选项] [源文件] [链接文件] 命令来创建,不过要注意硬链接只能对已经存在的文件进行创建,并且不能够跨文件系统。下面举一个例子来看一下硬链接和源文件的 inode号是否相同,以及删除掉源文件,是否还可以通过硬链接打开原文件。
首先创建一个文件 myfile.txt,然后分别给它创建两个硬链接 hardlink1 和 hardlink2。通过 ls -li 命令查看它们的 inode 号,发现相同,所以验证了我们所说的,硬链接和原文件指向同一个 inode 。另外从长列表中,我们还可以看到 inode 记录的硬链接次数(包括源文件自己),一共是3次。

接下来删除掉文件 myfile.txt,通过 ls -li 命令再看一下,发现 inode 记录的链接次数变成了 2,通过硬链接我们还是可以读取原来的文件内容,说明文件内容数据块并没有被删除,只有当硬链接次数变为 0 的时候,文件内容才会真正被删掉。

我们对硬链接的特点进行一下总结:
1) 硬链接文件都有相同的 inode 和 数据块
2) 删除掉一个硬链接文件,并不会影响 inode 号相同的其他文件,只有当 inode 记录的链接次数为 0 时,数据块才会被真正删除
3) 硬链接只能对已有文件进行创建
4) 硬链接不能跨文件系统创建
5) 普通用户不能对目录进行硬链接创建
软链接 Soft Links
软链接也被称为符号链接(symbolic link)。Linux 中的软链接和 Windows 的快捷方式非常相似。与硬链接的不同之处在于:
1) 它的 inode 与原文件不同
2) 它的数据块存储的是原文件的路径
我们用下面这张图来进行一下说明,我们为 myfile.txt 创建了一个软链接 softlink。可以看出,它的 inode 和 myfile.txt 的 inode 是两个完全不同的索引节点,myfile.txt 的数据块记录的是文件的内容,而软链接的数据块记录的是它指向文件的路径。

软链接的作用之一也是方便文件的管理,比如原文件的路径比较复杂,我们可以在简单的路径下创建一个软链接,这样比较方便用户访问。但是和硬链接不同的是,一旦原文件被删除,那么软链接就成了一个“死链接”,指向了一个不存在的文件。

软链接可以用命令 ln -s [源文件名或目录] [软链接文件名] 来进行创建。和硬链接不同之处在于,对不存在的文件也可以创建软链接,可以跨文件系统,对文件或者目录都可以创建软链接。
举一个例子,比如我们为 myfile.txt 创建一个软链接 softlink。通过 ls -li 命令查看,发现 inode 号完全不同,并且 myfile.txt 的链接次数还是 1,并没有增加,说明这里的链接次数是指硬链接,通过软链接我们可以读取源文件的内容。

删除原文件,软链接变成了“死链接”,通过它再去读取原来的文件内容,系统已经提示文件不存在了。

通过上面的实验验证,软链接的特点如下:
1) 软链接和其所指向的文件具有不同的 inode,并且其数据块存储的内容为其所指向文件的路径
2) 创建软链接,其指向文件的硬链接次数不会增加
3) 删除软链接并不影响原文件,但删掉原文件,软链接会成为一个“死”链接
4) 软链接可以指向文件,也可以指向目录
5) 软链接可以指向不存在的文件或目录
6) 软链接可以跨文件系统创建
最后
不管用软链接还是硬链接,都不会将原来的文件复制一份,都只是占用了磁盘较小的空间,但它们的原理还是完全不一样的。本文从 inode 的角度切入,对软链接和硬链接进行了解释。感兴趣的同学可以对 inode 结构体再做进一步研究,这样能够帮助我们更好的理解 Linux 的工作原理。
相关阅读:

- The End -
软链接 vs. 硬链接的更多相关文章
- linux命令大全之ln命令详解(创建软链接和硬链接)
ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接,分为软链接.硬链接.软链接相当于windows的快捷方式,下面是使用方法和示例 ln是linux中又一 ...
- linux中inode、软链接、硬链接
1 软链接 linux中软链接理解成window中的快捷方式.创建软链接的命令 ln -s 源文文件或目录 目标文件或目录 2 硬链接 创建硬链接的命令如下 ln 源文文件或目录 目标文件或目录 3 ...
- linux中软链接和硬链接的区别与小结
ln命令 该命令在文件之间创建链接.这种操作实际上是给系统中已有的某个文件指定另外一个可用于访问它的名称.对于这个新的文件名,我们可以为之指定不同的访问权限,以控制对信息的共享和安全性的问题. 如果链 ...
- linux 下的使用 ln 创建 软链接 和 硬链接
linux 下的一个指令 ln 作用: 创建软链接或者硬链接 Linux 系统下每创建一个文件,系统都会为此文件生成一个 index node 简称(inode) ,而每一个文件都包含用户数据(use ...
- Linux软链接和硬链接
Linux中的链接有两种方式,软链接和硬链接.本文试图清晰彻底的解释Linux中软链接和硬链接文件的区别. 1.Linux链接文件 1)软链接文件 软链接又叫符号链接,这个文件包含了另一个文件的路径 ...
- Linux 软链接和硬链接的理解与学习
理解前提: 首先要知道 Linux任意一个文件包含2个信息:第一个信息就是文件本身存的内容,第二个信息是文件的控制信息(读写,路径,大小等等),这2个信息是分开存储的,明白这点非常重要 理解总结: L ...
- 转: linux文件链接(软链接和硬链接)
链接:一种在共享文件和访问它的用户的若干目录项之间建立联系的一种方法. Linux中包括两种链接:硬链接(Hard Link)和软链接(Soft Link),软链接又称为符号链接(Symbolic l ...
- Linux之软链接与硬链接
什么是链接? 链接简单说实际上是一种文件共享的方式,是 POSIX 中的概念,主流文件系统都支持链接文件. 它是用来干什么的? 你可以将链接简单地理解为 Windows 中常见的快捷方式(或是 OS ...
- 理解inode 以及 软链接和硬链接概念区分
inode简单理解 本文来源自网络文章,并针对文章内容加以批注和修改.希望能帮到你! 一. 磁盘设备 说到inode,首先必须要提及下<操作系统>中磁盘存储器的管理一节.磁盘设备是一种相当 ...
- Windows和Linux创建软链接和硬链接
1.Wondows创建软链接和硬链接 mklink [/d] [/h] link target /d--创建目录软链接:默认为文件软链接:创建目录链接时必须使用该选项不然创出的软链接无效 /h--创建 ...
随机推荐
- 标准库sys
sys模块的主要函数介绍,结合官方文档说明和实例.This module provides access to some variables used or maintained by the int ...
- 限流 - Guava RateLimiter
2019独角兽企业重金招聘Python工程师标准>>> 限流 限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统,一旦并发访问/请求达到限制速率或者 ...
- windows下安装Pycham2020软件
1.在pycham官网下载安装软件https://www.jetbrains.com/pycharm/download/#section=windows 2.我下载的是64位的安装包,现在开始安装 3 ...
- AWS访问慢的原因分析及解决方案
中国区的用户在访问海外AWS服务器的时候会遇到访问很慢的情况,那如何快速访问海外AWS服务器,今天和大家一起聊一下这个话题. 首先,为什么中国的用户访问海外AWS会变慢? 我总结来下大概有以下几方面的 ...
- C语言编程入门题目--No.10
题目:打印楼梯,同时在楼梯上方打印两个笑脸. 1.程序分析:用i控制行,j来控制列,j根据i的变化来控制输出黑方格的个数. 2.程序源代码: #include "stdio.h" ...
- STL学习心得
STL的知识翻来复去,也就那么回事,但是真的想要熟练使用,要下一番功夫.无论是算法,还是STL容器,直白的说就是套路,然而对于一道题,告诉你是STL容器的题,让你套容器也绝非易事. 怎样使用容器,对于 ...
- JavaScript toFixed() 实现四舍五入保留两位小数
const num = 18.186; let result; result = num.toFixed(2) console.log(result) // 18.19 注意,返回值为String类型
- 从入门到精通(分布式文件系统架构)-FastDFS,FastDFS-Nginx整合,合并存储,存储缩略图,图片压缩,Java客户端
导读 互联网环境中的文件如何存储? 不能存本地应用服务器 NFS(采用mount挂载) HDFS(适合大文件) FastDFS(强力推荐
- 绕WAF文章收集
在看了bypassword的<在HTTP协议层面绕过WAF>之后,想起了之前做过的一些研究,所以写个简单的短文来补充一下文章里“分块传输”部分没提到的两个技巧. 技巧1 使用注释扰乱分块数 ...
- PUBG 1V3 线段树扫描线
PUBG 1V3 这个题目我觉得好难写啊. 感觉自己码力不太行啊. 题目大意是,给你n个人,n个人组成m个队伍,每个队伍最多4个人. 然后给你每一个人的位置队伍信息还有攻击范围. 问当一个队伍剩下一个 ...