​链接大家都用过,比如 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 的工作原理。

相关阅读:

《Linux 目录详解》

《虚拟机安装 Linux 最完整攻略》

《Xshell 与 Xftp 的安装与使用》

《Linux,Unix,GNU 到底有什么样的渊源?》

- The End -

软链接 vs. 硬链接的更多相关文章

  1. linux命令大全之ln命令详解(创建软链接和硬链接)

    ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接,分为软链接.硬链接.软链接相当于windows的快捷方式,下面是使用方法和示例   ln是linux中又一 ...

  2. linux中inode、软链接、硬链接

    1 软链接 linux中软链接理解成window中的快捷方式.创建软链接的命令 ln -s 源文文件或目录 目标文件或目录 2 硬链接 创建硬链接的命令如下 ln  源文文件或目录 目标文件或目录 3 ...

  3. linux中软链接和硬链接的区别与小结

    ln命令 该命令在文件之间创建链接.这种操作实际上是给系统中已有的某个文件指定另外一个可用于访问它的名称.对于这个新的文件名,我们可以为之指定不同的访问权限,以控制对信息的共享和安全性的问题. 如果链 ...

  4. linux 下的使用 ln 创建 软链接 和 硬链接

    linux 下的一个指令 ln 作用: 创建软链接或者硬链接 Linux 系统下每创建一个文件,系统都会为此文件生成一个 index node 简称(inode) ,而每一个文件都包含用户数据(use ...

  5. Linux软链接和硬链接

    Linux中的链接有两种方式,软链接和硬链接.本文试图清晰彻底的解释Linux中软链接和硬链接文件的区别. 1.Linux链接文件 1)软链接文件  软链接又叫符号链接,这个文件包含了另一个文件的路径 ...

  6. Linux 软链接和硬链接的理解与学习

    理解前提: 首先要知道 Linux任意一个文件包含2个信息:第一个信息就是文件本身存的内容,第二个信息是文件的控制信息(读写,路径,大小等等),这2个信息是分开存储的,明白这点非常重要 理解总结: L ...

  7. 转: linux文件链接(软链接和硬链接)

    链接:一种在共享文件和访问它的用户的若干目录项之间建立联系的一种方法. Linux中包括两种链接:硬链接(Hard Link)和软链接(Soft Link),软链接又称为符号链接(Symbolic l ...

  8. Linux之软链接与硬链接

    什么是链接? 链接简单说实际上是一种文件共享的方式,是 POSIX 中的概念,主流文件系统都支持链接文件. 它是用来干什么的? 你可以将链接简单地理解为 Windows 中常见的快捷方式(或是 OS ...

  9. 理解inode 以及 软链接和硬链接概念区分

    inode简单理解 本文来源自网络文章,并针对文章内容加以批注和修改.希望能帮到你! 一. 磁盘设备 说到inode,首先必须要提及下<操作系统>中磁盘存储器的管理一节.磁盘设备是一种相当 ...

  10. Windows和Linux创建软链接和硬链接

    1.Wondows创建软链接和硬链接 mklink [/d] [/h] link target /d--创建目录软链接:默认为文件软链接:创建目录链接时必须使用该选项不然创出的软链接无效 /h--创建 ...

随机推荐

  1. 1月份中国综合PMI指数为53.2% 企业生产经营活动总体增速加快

    中新社北京1月31日电 (记者 王恩博)中国国家统计局31日发布数据显示,2019年1月份,中国综合PMI产出指数为53.2%,比上月上升0.6个百分点,表明中国企业生产经营活动总体增速加快. 其中, ...

  2. Guzzle 一个PHP的HTTP客户端

    Guzzle是一个PHP的HTTP客户端,用来轻而易举地发送请求,并集成到我们的WEB服务上. https://github.com/guzzle/guzzle 接口简单:构建查询语句.POST请求. ...

  3. 贪心--HDU 2021 发工资咯

    Description 作为杭电的老师,最盼望的日子就是每月的8号了,因为这一天是发工资的日子,养家糊口就靠它了,呵呵,但是对于学校财务处的工作人员来说,这一天则是很忙碌的一天,财务处的小胡老师最近就 ...

  4. CF思维联系– Codeforces-990C Bracket Sequences Concatenation Problem(括号匹配+模拟)

    ACM思维题训练集合 A bracket sequence is a string containing only characters "(" and ")" ...

  5. 数学--数论--HDU 6063 RXD and math (跟莫比乌斯没有半毛钱关系的打表)

    RXD is a good mathematician. One day he wants to calculate: output the answer module 109+7. p1,p2,p3 ...

  6. prufer编码学习笔记

    prufer 编码 对于一个无根树,他的 prufer 编码是这样确定的: 每次找到编号最小的一个叶子节点,也就是度数为\(1\)的节点,把和它相连的点,加入 prufer 编码序列的末尾,然后把这个 ...

  7. RF(ride 工具使用)

    1.新建项目 project,工程 suite,用例 testcase 新建 project:file -> new project,输入工程名,Type 选择 directory,选择工程存放 ...

  8. windows远程执行命令总结

    1. 利用Impacket Impacket是一个Python类库,用于对SMB1-3或IPv4 / IPv6 上的TCP.UDP.ICMP.IGMP,ARP,IPv4,IPv6,SMB,MSRPC, ...

  9. E. A Simple Task

    E. A Simple Task 这个题目的意思是 给你一个由小写字母组成的字符串,有两种操作 i j k 如果k==1 那么就是就把i 到 j 的这个区间非递减排序. i j k如果k==2 那么就 ...

  10. spring mvc从前台往后台传递参数的三种方式

     jsp页面: 第一种:使用控制器方法形参的方式(常用) 第二种:使用模型传参的方式(如果前台往后台传递的参数非常多,如果还使用形参的方式传递,非常复杂.我们可以使用模型传参的方式,把多 个请求的参数 ...