Linux系统硬链接和软链接

三水寿可可 2020-11-10 18:08:05
linux 系统 链接


膜拜大佬写的文章。songguojun
https://www.cnblogs.com/songgj/p/9115954.html

在linux系统中有种文件是链接文件,可以为解决文件的共享使用。链接的方式可以分为两种,一种是硬链接(Hard Link),另一种是软链接或者也称为符号链接(Symbolic Link)。

硬链接

 硬链接是指通过索引节点来进行链接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都会给它分配一个编号,这个编号被称为索引节点编号号(Inode

Index)或者Inode,它是文件或者目录在一个文件系统中的唯一标识,文件的实际数据放置在数据区域(data block),它存储着文件重要参数信息,也就是元数据 (metadata),比如创建时间、修改时间、文件大小、属主、归属的用户组、读写权限、数据所在block号等,如下图所示。

 图片来源于网络
在Linux系统中,多个文件名指向同一索引节点(Inode)是正常且允许的。一般这种链接就称为硬链接。硬链接的作用之一是允许一个文件拥有多个有效路径名,这样用户就可以建立硬链接到重要的文件,以防止“误删”源数据(很多硬件,如netapp存储中的快照功能就应用了这个原理,增加一个快照就多了一个硬链接》。不过硬链接只能在同一文件系统中的文件之间进行链接,不能对目录进行创建。之所以文件建立了硬链接就会防止数据误删,是因为文件系统的原理是,只要文件的索引节点还有一个以上的链接(仅删除了该文件的指向),只删除其中一个链接并不影响索引节点本身和其他的链接(数据的实体并未删除),只有当最后一个链接被删除后,此时如果有新数据要存储到磁盘上,被删除的文件的数据块及目录的链接才会被释放,空间被新数据暂用覆盖。

软链接

 软链接(也叫符号链接),类似于windows系统中的快捷方式,与硬链接不同,软链接就是一个普通文件,只是数据块内容有点特殊,文件用户数据块中存放的内容是另一文件的路径名的指向,通过这个方式可以快速定位到软连接所指向的源文件实体。软链接可对文件或目录创建。

软链接作用:

便于文件的管理,比如把一个复杂路径下的文件链接到一个简单路径下方便用户访问。
节省空间解决空间不足问题,某个文件文件系统空间已经用完了,但是现在必须在该文件系统下创建一个新的目录并存储大量的文件,那么可以把另一个剩余空间较多的文件系统中的目录链接到该文件系统中。
删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接就变成了死链接。

软连接和硬链接的特点:

软链接:

1.软链接是存放另一个文件的路径的形式存在。
2.软链接可以 跨文件系统 ,硬链接不可以。
3.软链接可以对一个不存在的文件名进行链接,硬链接必须要有源文件。
4.软链接可以对目录进行链接。
硬链接:

  1. 硬链接,以文件副本的形式存在。但不占用实际空间。
  2. 不允许给目录创建硬链接。
  3. 硬链接只有在同一个文件系统中才能创建。
  4. 删除其中一个硬链接文件并不影响其他有相同 inode 号的文件。

不论是硬链接或软链接都不会将原本的档案复制一份,只会占用非常少量的磁碟空间。

linux系统可以用ln命令来创建链接文件。

ln命令格式:

ln [参数] [源文件或目录] [目标文件或目录]

主要参数:

-i 交互模式,文件存在则提示用户是否覆盖。
-s 软链接(符号链接)。
-d 允许超级用户制作目录的硬链接。
-b 删除,覆盖以前建立的链接
软链接 (符号链接) ln -s source target
硬链接 (实体链接)ln source target
案例:

给文件创建硬链接

复制代码
[root@localhost tmp]# mkdir dirIn 创建测试目录
[root@localhost tmp]# cd dirIn/
[root@localhost dirIn]# touch infile
[root@localhost dirIn]# ll
总用量 0
-rw-r--r-- 1 root root 0 5月 31 14:53 infile
[root@localhost dirIn]# ln infile infile_hard_file 在默认不带参数情况下,ln命令创建的是硬链接。
[root@localhost dirIn]# ll
总用量 0
-rw-r--r-- 2 root root 0 5月 31 14:53 infile
-rw-r--r-- 2 root root 0 5月 31 14:53 infile_hard_file
复制代码

给文件创建软链接

[root@localhost dirIn]# ln -s infile infile_soft_file 创建软链接用s参数
[root@localhost dirIn]# ls -l
总用量 0
-rw-r--r-- 2 root root 0 5月 31 14:53 infile
-rw-r--r-- 2 root root 0 5月 31 14:53 infile_hard_file
lrwxrwxrwx 1 root root 6 5月 31 15:03 infile_soft_file -> infile 软链接

我们知道硬链接是有着相同 inode 号仅文件名不同的文件,用ls命令查看。
[root@localhost dirIn]# ls -li
1177358 -rw-r--r-- 2 root root 0 5月 31 14:53 infile
1177358 -rw-r--r-- 2 root root 0 5月 31 14:53 infile_hard_file

上面源文件和硬链接文件inode号相同 (第一列就是inode号),指向同一个索引节点。

1177363 lrwxrwxrwx 1 root root 6 5月 31 15:03 infile_soft_file -> infile 软链接是一个链接文件,文件模式那块前面有个l字母,表示是个链接文件。
硬链接不能指向目录

[root@localhost dirIn]# ln dir infile dir是个目录
ln: "dir": 不允许将硬链接指向目录

软链接可以
[root@localhost dirIn]# ll -i
201884844 drwxr-xr-x 2 root root 19 5月 31 15:21 dir
1177358 -rw-r--r-- 3 root root 0 5月 31 14:53 infile
1177358 -rw-r--r-- 3 root root 0 5月 31 14:53 infile_hard_file
1177363 lrwxrwxrwx 1 root root 6 5月 31 15:03 infile_soft_file -> infile
1177365 lrwxrwxrwx 1 root root 3 5月 31 15:24 infile_soft_file_name -> dir
删除文件测试:

复制代码
[root@localhost dirIn]# echo "this a file" > infile 向文件中添加数据
[root@localhost dirIn]# cat infile 查看文件内容
this a file
[root@localhost dirIn]# cat infile_hard_file infile_soft_file 查看软链接和硬链接文件内容一致
this a file
this a file
[root@localhost dirIn]# rm -f infile 删除源文件
[root@localhost dirIn]# ls -lrti
1177363 lrwxrwxrwx 1 root root 6 5月 31 15:03 infile_soft_file -> infile
201884844 drwxr-xr-x 2 root root 19 5月 31 15:21 dir
1177365 lrwxrwxrwx 1 root root 3 5月 31 15:24 infile_soft_file_name -> dir
1177358 -rw-r--r-- 2 root root 12 5月 31 15:27 infile_hard_file
[root@localhost dirIn]# cat infile_hard_file 硬链接文件存在 内容和源文件内容一样。
原因:虽然删除源文件,但是任然有硬链接指向源文件inode
节点,所以不会被释放删除,
这里只是删除infile到inode节点的链接。
this a file
[root@localhost dirIn]# cat infile_soft_file 软链接文件已经不存在了,目录还会显示这个文件,
就是软链接文件已经失效。
cat: infile_soft_file: 没有那个文件或目录
复制代码

删除软链接
[root@localhost dirIn]# rm -f infile_soft_file 直接删除这个软链接文件就行
[root@localhost dirIn]# ll
drwxr-xr-x 2 root root 19 5月 31 15:21 dir
-rw-r--r-- 2 root root 12 5月 31 15:27 infile_hard_file
lrwxrwxrwx 1 root root 3 5月 31 15:24 infile_soft_file_name -> dir

版权声明
本文为[三水寿可可]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/huangrt/p/13955200.html

  1. 【计算机网络 12(1),尚学堂马士兵Java视频教程
  2. 【程序猿历程,史上最全的Java面试题集锦在这里
  3. 【程序猿历程(1),Javaweb视频教程百度云
  4. Notes on MySQL 45 lectures (1-7)
  5. [computer network 12 (1), Shang Xuetang Ma soldier java video tutorial
  6. The most complete collection of Java interview questions in history is here
  7. [process of program ape (1), JavaWeb video tutorial, baidu cloud
  8. Notes on MySQL 45 lectures (1-7)
  9. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  10. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  11. 精进 Spring Boot 03:Spring Boot 的配置文件和配置管理,以及用三种方式读取配置文件
  12. Refined spring boot 03: spring boot configuration files and configuration management, and reading configuration files in three ways
  13. 【递归,Java传智播客笔记
  14. [recursion, Java intelligence podcast notes
  15. [adhere to painting for 386 days] the beginning of spring of 24 solar terms
  16. K8S系列第八篇(Service、EndPoints以及高可用kubeadm部署)
  17. K8s Series Part 8 (service, endpoints and high availability kubeadm deployment)
  18. 【重识 HTML (3),350道Java面试真题分享
  19. 【重识 HTML (2),Java并发编程必会的多线程你竟然还不会
  20. 【重识 HTML (1),二本Java小菜鸟4面字节跳动被秒成渣渣
  21. [re recognize HTML (3) and share 350 real Java interview questions
  22. [re recognize HTML (2). Multithreading is a must for Java Concurrent Programming. How dare you not
  23. [re recognize HTML (1), two Java rookies' 4-sided bytes beat and become slag in seconds
  24. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  25. RPC 1: how to develop RPC framework from scratch
  26. 造轮子系列之RPC 1:如何从零开始开发RPC框架
  27. RPC 1: how to develop RPC framework from scratch
  28. 一次性捋清楚吧,对乱糟糟的,Spring事务扩展机制
  29. 一文彻底弄懂如何选择抽象类还是接口,连续四年百度Java岗必问面试题
  30. Redis常用命令
  31. 一双拖鞋引发的血案,狂神说Java系列笔记
  32. 一、mysql基础安装
  33. 一位程序员的独白:尽管我一生坎坷,Java框架面试基础
  34. Clear it all at once. For the messy, spring transaction extension mechanism
  35. A thorough understanding of how to choose abstract classes or interfaces, baidu Java post must ask interview questions for four consecutive years
  36. Redis common commands
  37. A pair of slippers triggered the murder, crazy God said java series notes
  38. 1、 MySQL basic installation
  39. Monologue of a programmer: despite my ups and downs in my life, Java framework is the foundation of interview
  40. 【大厂面试】三面三问Spring循环依赖,请一定要把这篇看完(建议收藏)
  41. 一线互联网企业中,springboot入门项目
  42. 一篇文带你入门SSM框架Spring开发,帮你快速拿Offer
  43. 【面试资料】Java全集、微服务、大数据、数据结构与算法、机器学习知识最全总结,283页pdf
  44. 【leetcode刷题】24.数组中重复的数字——Java版
  45. 【leetcode刷题】23.对称二叉树——Java版
  46. 【leetcode刷题】22.二叉树的中序遍历——Java版
  47. 【leetcode刷题】21.三数之和——Java版
  48. 【leetcode刷题】20.最长回文子串——Java版
  49. 【leetcode刷题】19.回文链表——Java版
  50. 【leetcode刷题】18.反转链表——Java版
  51. 【leetcode刷题】17.相交链表——Java&python版
  52. 【leetcode刷题】16.环形链表——Java版
  53. 【leetcode刷题】15.汉明距离——Java版
  54. 【leetcode刷题】14.找到所有数组中消失的数字——Java版
  55. 【leetcode刷题】13.比特位计数——Java版
  56. oracle控制用户权限命令
  57. 三年Java开发,继阿里,鲁班二期Java架构师
  58. Oracle必须要启动的服务
  59. 万字长文!深入剖析HashMap,Java基础笔试题大全带答案
  60. 一问Kafka就心慌?我却凭着这份,图灵学院vip课程百度云