摘要

本文将介绍如何在 Linux 中为文件创建硬练级和符号(软)链接,并探讨两者之间的相同和不同之处。

引言

符号链接与 Windows 中的快捷方式很像。Windows 中的快捷方式是一个带箭头的图标,空间占用一般很小,仅仅提供了一个指向目标文件的通道,Linux 中的符号链接也类似。符号链接应用很灵活,可以为任意文件创建符号链接。

虽然硬链接名字里面也有链接二字,但其与符号链接还是相当不一样的。要理解硬链接,我们得先了解若干基本概念。首先我们得搞明白 Linux 的文件是如何存储中,在 Linux 中当划分磁盘分区并格式化的时候,整个分区会被划分为两部分,即 Inode 区和 Data Block 区。

Linux 中每个文件都被分成两部分存放,一部分是文件的唯一标识,Inode-number 以及属性信息放在 Inode 区的一个 inode 中,Inode-number 和 inode 是一一对应的;另一部分是文件的实际数据,放在 Data Block 区中,在 Linux 中我们需要通过文件的 inode 来找到存放文件数据的 data block。在一个硬盘分区,不可能有两个文件公用一个 inode。自然也不可能有两个文件的 inode-number 是一样的。

如果我们将硬盘分区中所有的文件比作样一本书的话,inode 区就是其目录,data block 区对应其内容。我们必须通过目录才能找到具体的内容。我们可以通过 ls -il 列出文件的 inode-number(列出的第一个字段就是)。至此,我们初步弄明白了 Linux 中的文件到底是如何存储的,接下来我们还得弄明白 Linux 中的目录到底是怎样的文件。

Linux 中目录是一张表,每个表项代表一个文件。目录中有多少文件,就有多少表项。每个表项都包括两样数据,一是文件名,再就是 inode-number。因此 Linux 中存取文件的过程就是,通过文件名找到对应的 inode-number,再找到 inode,最后找到对应的数据。

硬链接就是在目录这张表中,让一个 inode-number 对应了多个文件名,文件 inode 和数据还是一份,没有变,只不过文件多了一个名字,这个名字就称为硬链接。

用法

符号链接

Linux 中使用 ln (link 的缩写)命令加上 -s(symbolic 的缩写) 选项创建符号链接。

ln -s [链接指向的文件] [链接名]

  • ln -s test/hello.sh hello:为 test 目录下的 hello.sh 文件创建一个名为 hello 的符号链接
$ mkdir test # 创建 test 目录
$ touch test/hello.sh # 在 test 目录下创建 hell.sh 文件
$ vi test/hello.sh # 编辑 test 目录下的 hello.sh 文件,写入内容:echo "hello"
$ ln -s test/hello.sh hello # 为 test 目录下的 hello.sh 文件创建名为 hello 的符号链接
$ chmod 764 test/hello.sh # 修改 test 目录下的 hello.sh 的权限为可执行
$ ls -l # 以长格式列出当前工作目录下的文件
总用量 4
lrwxrwxrwx 1 sdxx09 sdxx09   13 6月   7 09:31 hello -> test/hello.sh
drwxrwxr-x 2 sdxx09 sdxx09 4096 6月   7 09:30 test
$ ./hello # 直接执行 hello 可以打印出 hello 了,而不用转到 test 目录下去执行 hello.sh 文件(这就是符号链接的好处)
hello
$ rm test/hello.sh
$ ls -l
总用量 4
lrwxrwxrwx 1 sdxx09 sdxx09   13 6月   7 09:31 hello -> test/hello.sh # (这里会标红)
drwxrwxr-x 2 sdxx09 sdxx09 4096 6月   7 09:42 test
$ ./hello
-bash: ./hello: 没有那个文件或目录

虽然我们可以通过符号链接文件来读、写和执行文件,但却不代表符号链接文件和源文件是同一个文件。如果符号链接文件指定的源文件被删除,那这个符号链接文件就会失效(用 ls -l 列出会发现标红),读取或执行会显示“没有哪个文件或目录”的提示,这种情况下,我们就称这个符号链接断裂了。

硬链接

Linux 中使用 ln (link 的缩写)命令创建硬链接。

ln [链接指向的文件] [链接名]

  • ln 1.txt 2.txt:为 1.txt 文件创建一个名为 2.txt 的硬链接
$ touch 1.txt
$ ls -il
总用量 0
18388234 -rw-rw-r-- 1 sdxx09 sdxx09 0 6月   7 10:08 1.txt
$ ln 1.txt 2.txt
$ ls -il
总用量 0
18388234 -rw-rw-r-- 2 sdxx09 sdxx09 0 6月   7 10:08 1.txt
18388234 -rw-rw-r-- 2 sdxx09 sdxx09 0 6月   7 10:08 2.txt
$ ln 1.txt 3.txt
$ ls -il
总用量 0
18388234 -rw-rw-r-- 3 sdxx09 sdxx09 0 6月   7 10:08 1.txt
18388234 -rw-rw-r-- 3 sdxx09 sdxx09 0 6月   7 10:08 2.txt
18388234 -rw-rw-r-- 3 sdxx09 sdxx09 0 6月   7 10:08 3.txt
$ rm 2.txt
$ ls -il
总用量 0
18388234 -rw-rw-r-- 2 sdxx09 sdxx09 0 6月   7 10:08 1.txt
18388234 -rw-rw-r-- 2 sdxx09 sdxx09 0 6月   7 10:08 3.txt
$ rm 3.txt
$ ls -il
总用量 0
18388234 -rw-rw-r-- 1 sdxx09 sdxx09 0 6月   7 10:08 1.txt

创建前后,文件属性的第三个字段发生了改变,由一变成了二,表示文件的硬链接数目增加了一。当我们再为 1.txt 创建一个硬链接 3.txt 时,此时文件的硬链接数目变成了 3。但我们清楚,1.txt、2.txt、3.txt 本质上都是同一个文件。只不过这个文件有多个名字罢了。我们通过观察其 inode-number 可以发现,都是一样的,充分说明了这三个文件名实质上都指向了同一个文件。我们可以通过任意一个硬链接文件来读写和执行源文件。

如果将源文件删除掉,创建的硬链接并不会像符号链接一样断裂。不过文件属性中的硬链接数据会减一。我们为 1.txt 文件创建了两个硬链接 2.txt 和 3.txt,那么就相当于这个文件在文件系统中有了三个文件名。这三个文件名都指向同一个文件内容,有点像狡兔三窟的感觉。删除了一个文件,只是将某个文件名从文件系统中移除了,我们仍然能通过余下的文件名来访问这个文件的数据。事实上,只要文件还存在一个文件名,这个文件就一切正常。除非,你将三个文件都删除,我们才无法通过文件名找到文件 inode,进而访问文件数据,文件这才叫真真被删除。

硬链接由于文件系统限制,不如符号链接灵活。有两条需要注意:

  1. 强烈不推荐为目录创建硬链接。容易造成目录遍历死循环。具体原因很复杂,想了解的可以点击这里查看。
  2. 不能跨硬盘分区创建硬链接。比如你不能在 sda1 分区中创建一个指向 sda2 分区中源文件的硬链接。原因很简单,在不同的分区中文件的 inode-number 不再是唯一的。

参考

中国大学 MOOC | Linux系统管理 | 主题04 | 小节 2 | 创建文件链接

【Linux】创建文件链接(ln | 符号链接和硬链接)相关推荐

  1. linux创建文件软链接命令,Linux创建文件或目录软链接、硬链接的技巧

    有时Linux用户们为了使用方便,会想给电脑中的文件或目录创建软链接或硬链接.不过有些用户不清楚该怎么给这些文件或目录创建软链接或硬链接该怎么办呢?别急,现在小编就来教你解决的方法. 解决方法: 当我 ...

  2. linux拷贝到新建文件夹命令行,Linux创建文件touch,复制文件cp,tab补全,链接文件ln命令...

    一.创建文件 使用touch 可以创建空文件,例如opt目录下创建test2.txt文件.这种一般是有些程序必须要先创建文件,才能使用. 二. 复制文件 2.1 使用cp命令来复制文件,需要两个参数- ...

  3. Linux随笔2 - Linux的目录配置、文件元数据信息、符号链接与硬链接和常用文件和目录管理命令示例

    目录 1. Linux的目录配置与FHS(Filesystem Hierarchy Standard) 1.1 根目录(/)的意义与内容 1.1.1 FHS要求根目录中必须存在的目录 1.1.2 FH ...

  4. linux文件存储、inode、硬链接、软链接

    目录 介绍 inode的内容 inode的大小 inode号码 目录文件 硬链接 软链接 介绍 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector).每个扇区储存512 ...

  5. linux命令--ln软连接,硬链接

    ln:英文名link,链接的意思. Linux 系统中有软链接和硬链接两种特殊的"文件". 硬链接特征: 1) 硬链接文件跟源文件拥有相同的i(inode)节点和存储block块, ...

  6. 符号链接和硬链接有什么区别?

    最近我在求职面试时被问到这个问题. 我是诚实的,并说我知道符号链接的行为以及如何创建一个,但不理解硬链接的使用以及它与符号链接的区别. #1楼 使用任何Linux(ish)控制台可能有所帮助的一些很好 ...

  7. linux硬链接不能创建目录,为什么硬链接不允许用于目录?

    问题描述 我使用的是Ubuntu 12.04,我是一个非常新的Linux世界.当我尝试为任何目录创建硬链接并失败时,我感到非常惊讶.我可以为文件系统边界内的文件创建硬链接.我知道我们无法为文件系统以外 ...

  8. 软链接(Soft Link,符号链接)和硬链接(Hard Link)。

    目录 引言 创建软连接,硬链接 创建语句 二者区别 引言 链接是一种在共享文件和访问它的用户的若干目录项之间建立联系的一种方法.方便文件的共享使用,在Linux操作系统中引入了连接,链接被分为两种:软 ...

  9. linux 创建连接命令 ln -s 软连接

    这是linux中一个非常重要命令,请大家一定要熟悉.它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s, 具体用法是:ln -s 源文件 目标文件. 当 我们需要在不同 ...

最新文章

  1. Mashmokh and Numbers CodeForces - 415C
  2. cnblog写博客还不错嘛
  3. [转]Java——Servlet的配置和测试
  4. 1.3 用神经网络进行监督学习-深度学习-Stanford吴恩达教授
  5. 自然语言处理库——NLTK
  6. ❗HTML引入CSS的三种常用方式汇总❗
  7. lombok工具中@Data注解问题
  8. html云文件系统,一种HTML5云文件系统
  9. 【Python】statsmodels.formula.api模块中ols参数的解释
  10. 计算垂直平面与三维线段交点
  11. 大厂工作3年,我决定把大学到现在7年所有珍藏的书籍都分享一遍
  12. h264参数动态调整
  13. java新手初次面试要注意的事项
  14. java jive歌词翻译_Java Jive歌词 Java JiveLrc歌词
  15. 教你如何搜索百度网盘的资源 百度网盘资源搜索方法!
  16. windows10系统hosts文件不见了的解决方法
  17. 小公司做个网站多少钱,个人网站怎么制作
  18. mysql错误1197_mysql主从不同步问题 Error_code: 1197
  19. Python Tensorflow + CNN + Opencv 英雄联盟小地图识别,LOL Minimap Scanner
  20. 微信小程序开发——登录登出示例

热门文章

  1. 伍迷创意随想集 之 儿童乐学园
  2. opencv-meshgrid
  3. css3中perspective属性
  4. Python标准库:turtle库的简单快速入门
  5. NetBIOS漏洞攻防
  6. 维吉尼亚密码 (原理+代码)
  7. 板刷CF记录 #2459878
  8. 二维卡通动画制作学习教程
  9. Apollo高精地图分析
  10. 蓝牙三国q 1.92 java,蓝牙三国杀killhd