详解 Linux 中的硬链接与软链接
在 Windows 中安装应用程序,通常安装向导会提示是否创建桌面快捷方式。如果选择同意创建,安装完成后会在桌面上看到对应应用程序的图标,如果想要使用这个应用程序只需要双击桌面上的快捷方式即可,这就是 Windows 中的快捷方式。Linux 链接文件类似于 Windows 中的快捷方式,Linux 链接文件分为硬链接和软链接,不过在具体介绍 Linux 中的硬链接和软链接之前,先来看看 Linux 文件系统中文件的具体结构。
在 Linux 文件系统中,一个文件被分成两个部分:元数据(metadata)与用户数据(user data)。元数据为文件的附加属性,如索引节点(Inode)、文件大小、文件创建时间、文件所有者等。「元数据中并不包含文件名,文件名仅仅是为了方便用户使用。Linux 文件系统为每一个保存在磁盘分区中的文件(无论什么类型)都分配一个索引节点号(Inode Number),索引节点号是文件在一个文件系统中的唯一标识,不同文件所对应的索引节点号是不相同的;」 用户数据,即文件数据块(data block),文件数据块中以二进制的形式记录着文件的真实内容。
如果想要查看对应文件的索引节点号可以使用ls -i
指令:
chenkc:~$ vim hello.txt
chenkc:~$ cat hello.txt
AI机器学习与深度学习算法
chenkc:~$ ls -i hello.txt
1837900 hello.txt
硬链接
在 Linux 中允许多个文件名指向同一个索引节点号,而硬链接(hard link, 也称链接)指的是通过索引节点号进行的链接。可以通过ln
指令为文件创建硬链接:
ln 源文件 链接文件
为 hello.txt 文件创建两个硬链接:
chenkc:~$ ln hello.txt hardlink_hello.txt
chenkc:~$ ln hello.txt hardlink_hello2.txt
chenkc:~$ ls -il
total 675432
1837900 -rw-r--r-- 3 chenkc chenkc 56 8-р с 24 21:34 hello.txt
1837900 -rw-r--r-- 3 chenkc chenkc 56 8-р с 24 21:34 hardlink_hello.txt
1837900 -rw-r--r-- 3 chenkc chenkc 56 8-р с 24 21:34 hardlink_hello2.txt
...
源文件和两个硬链接文件的索引节点号都为 1837900,而索引节点号为文件的唯一标识,「因此源文件和硬链接文件是仅文件名不同的相同文件,创建文件的硬链接相当于为文件又起了一个新的文件名。」
此时的 hello.txt、hardlink_hello.txt 以及 hardlink_hello2.txt 拥有相同的索引节点号,查看文件内容也会发现为同一个文件:
chenkc:~$ cat hello.txt
AI机器学习与深度学习算法
chenkc:~$ cat hardlink_hello.txt
AI机器学习与深度学习算法
chenkc:~$ cat hardlink_hello2.txt
AI机器学习与深度学习算法
执行ls -il
指令后发现在表示文件类型以及权限的 10 个字符之后有一个数字 3,对于文件来说 3 表示硬链接数,每一个硬链接数都可以看成是文件的一个文件名,此时inode:1837900
的文件拥有 3 个文件名。
假设我们现在删除硬链接对应的源文件 hello.txt:
chenkc:~$ rm -rf hello.txt
chenkc:~$ cat hardlink_hello.txt
AI机器学习与深度学习算法
chenkc:~$ cat hardlink_hello2.txt
AI机器学习与深度学习算法
「如果删除硬链接对应的源文件,硬链接文件仍然存在,这是因为硬链接是有着相同索引节点号仅文件名不同的文件,因此,删除一个硬链接文件并不影响其他有相同索引节点号的文件。我们可以为重要的文件创建硬链接,这样即使错误操作误删了文件,也不会重要文件造成影响。」 当文件没有任何文件名指向的时候,文件也会被删除,也就是此时的硬链接数为 0。硬链接相当于为文件创建了一个新的文件名,当删除其中一个链接的时候并不影响索引节点本身以及其它链接到该索引节点的文件名,所以这些链接是相对独立的,这也是为什么 Linux 中仅仅标识文件硬链接的数目,并没有显示的标识文件是否为硬链接文件的原因。
软链接
软链接(也称符号链接)可以看成是一个普通的文件, 「只不过这个文件中的数据块存放的是源文件的索引节点号。」 可以通过为ln
指令添加-s
(s: soft 的意思)选项创建软链接:
ln -s 源文件 链接文件
为 hello.txt 文件创建一个软链接:
chenkc:~$ ln -s hello.txt softlink_hello.txt
chenkc:~$ ls -il
total 675236
1837900 -rw-r--r-- 1 chenkc chenkc 36 8-р с 25 18:55 hello.txt
6705 lrwxrwxrwx 1 chenkc chenkc 9 8-р с 25 18:57 softlink_hello.txt -> hello.txt
...
源文件的索引节点号为 1837900,而软链接文件的索引节点号为 6705,显然源文件和软链接文件并不是同一个文件,其实从两个文件的大小也可以看出来,其中源文件大小为 36 个字节,而软链接文件大小仅仅为 9 个字节。
软链接文件的数据块中仅仅存放着源文件的索引节点号,这也是为什么源文件为 36 个字节,而软链接文件却有 9 个字节的原因。「由于软链接只不过是数据块中存放了源文件的索引节点号,因此删除软链接文件并不会影响源文件。但是如果删除源文件,由于软链接文件中指向的索引节点号对应的文件没有了,所以会导致软链接文件失效。」
chenkc:~$ rm -rf softlink_hello.txt # 删除软链接文件并不影响源文件
chenkc:~$ cat hello.txt
AI机器学习与深度学习算法
chenkc:~$ ll hello.txt softlink_hello.txt
-rw-r--r-- 1 chenkc chenkc 36 8-р с 25 19:16 hello.txt
lrwxrwxrwx 1 chenkc chenkc 9 8-р с 25 19:17 softlink_hello.txt -> hello.txt
chenkc:~$ rm -rf hello.txt
chenkc:~$ cat softlink_hello.txt
cat: softlink_hello.txt: No such file or directory
chenkc:~$ ll softlink_hello.txt
lrwxrwxrwx 1 chenkc chenkc 9 8-р с 25 19:17 softlink_hello.txt -> hello.txt # 红色
软链接不同于硬链接,在软链接中删除源文件会影响到软链接的使用,因此在 Linux 中会有很多地方标识文件是否为软链接:
-
ls -l
指令输出的文件,其中十个字符中的第一个字符代表文件类型,如果文件为软链接文件则为l
; - Linux 会使用特殊的颜色将软链接文件与其它文件进行区分,如果删除了源文件,软链接失效则软链接文件也会呈现失效的颜色;
「如果软链接文件和源文件不在同一个目录下,源文件要使用绝对路径而不能使用相对路径。」 软链接主要应用在两个方面:
- 一是方便管理,例如可以把一个复杂路径下的文件链接到一个简单路径下方便用户访问;
- 另一方面就是解决文件系统磁盘空间不足的情况。例如某个文件文件系统空间已经用完了,但是现在必须在该文件系统下创建一个新的目录并存储大量的文件,那么可以把另一个剩余空间较多的文件系统中的目录链接到该文件系统中,这样就可以很好的解决空间不足问题;
硬链接与软链接的区别
最后来简单总结一下硬链接和软链接的区别:
参考:
- http://www.itheima.com/
- https://www.linuxprobe.com/soft-hard-links-comments.html
- 灰色理论预测模型
- tweet情感分析流程
- Selenium2+python自动化52-unittest执行顺序
- 基于TensorFlow实现自编码器(附源码)
- Selenium2+python自动化53-unittest批量执行(discover)
- HTML/CSS/JavaScript学习笔记【持续更新】
- Selenium2+python自动化54-unittest生成测试报告(HTMLTestRunner)
- Selenium2+python自动化55-unittest之装饰器(@classmethod)
- 每天一个Linux命令(4)——mkdir
- 每天一个Linux命令(3)——pwd
- 11-移动端开发教程-zepto.js入门教程
- 【OpenCV学习笔记之一】图像加载,修改及保存
- 【干货】一种直观的方法认识梯度下降
- 漫谈Java IO之普通IO流与BIO服务器
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 会话技术 & JSP 的学习
- 2万字,实战 Docker 部署:完整的前后端,主从热备高可用服务!!
- http & request & response的学习
- JavaScript 错误处理大全【建议收藏】
- Java8 用 Stream 快速实现List转Map 、分组、过滤等操作
- swoole框架异常处理
- 使用composer本地开发项目
- GDAL数据集写入空间坐标参考
- html & CSS & JavaScript的学习
- 打卡群刷题总结0824——电话号码的字母组合
- 打卡群刷题总结0825——括号生成
- Ajax与Json的学习
- pytest文档48-切换环境(pytest-base-url)
- 打卡群刷题总结0826——组合总和
- 排序之简单排序