软链接 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--创建 ...
随机推荐
- WebRTC 及点对点网络通信机制
原文请查阅这里,略有删减,本文采用知识共享署名 4.0 国际许可协议共享,BY Troland. 这是 JavaScript 工作原理第十八章. 概述 何为 WebRTC ?首先,字面上已经给出了关于 ...
- JQuery学习(一)
本文是学习廖老师的Javascript全栈教程后的一些笔记. 使用jQuery: 方法一:下载jQuery库,并在html页面中引入,方式如下: 1 <html> 2 <head&g ...
- du命令、df命令、磁盘分区
df:汇报文件系统的磁盘使用空间[root@localhost ~]# df文件系统 1K-块 已用 可用 已用% 挂载点/dev/sda3 29140072 1022920 28117152 4% ...
- ServerVariables集合
当讨论Request对象内容时,要研究的集合之一就是ServerVariables集合.这个集合包含了两种值的结合体,一种是随同页面请求从客户端发送到服务器的HTTP报头中的值,另外一种是由服务器在接 ...
- B. Marvolo Gaunt's Ring 前缀后缀
B. Marvolo Gaunt's Ring 这种一般只有三个的都可以处理前缀和后缀,再枚举中间这个值. 这个和之前写过的C. Four Segments 前缀后缀 处理方式很像. #include ...
- springboot设置banner
下图是springboot项目启动的的打印数据,在log中可以清楚的看到有一个spring的banner图案,这个图案其实我们是可以自己进行设置的 我们在项目目录的resources目录下创建一个ba ...
- idea设置配置提示模板
File-->Settings-->LIve Templates-->+-->Template Group(模板名称)-->Live Template
- java基础 之 从Class.forName()跟.class的区别看类的初始化
代码如下: public class Test { public static void main(String[] args) throws Exception { System.out.print ...
- mac下xampp访问php显示403错误
错误描述 New xampp security concept: Access Forbidden Error 403 错误分析和解决 403就是我们访问的时候,被安全策略拒绝了,解决方法 找到文件 ...
- 王颖奇 20171010129《面向对象程序设计(java)》第十五周学习总结
实验十五 GUI编程练习与应用程序部署 实验时间 2018-12-6 学习总结: 理论部分: ◼ JAR文件◼ 应用程序首选项存储◼ Java Web Start JAR文件: 1.Java程序的打 ...