Linux系统硬链接和软链接说明 - 运维笔记
在linux系统中有种文件是链接文件,可以用来解决文件的共享使用。链接的方式可以分为两种,一种是硬链接(Hard Link),另一种是软链接或者也称为符号链接(Symbolic Link)。先来查看下Linux系统中哪些是链接文件:
[root@ss-server lib64]# ls -l
drwxr-xr-x. 4 root root 4096 Nov 29 2018 nss
drwxr-xr-x. 3 root root 4096 Oct 31 2018 openssl
lrwxrwxrwx. 1 root root 19 Nov 29 2018 p11-kit-proxy.so -> libp11-kit.so.0.3.0
lrwxrwxrwx. 1 root root 13 Nov 29 2018 p11-kit-trust.so -> libnssckbi.so
drwxr-xr-x 29 root root 4096 Jan 2 2019 perl5
drwxr-xr-x. 2 root root 4096 Nov 29 2018 pkcs11 第一列权限位标识第一个字符显示的是文件类型,-为一般文件,d为目录,而l显示的就是链接文件,并且是软链接文件(符号链接文件)!
一、硬链接说明
硬链接是指通过索引节点来进行链接。在Linux文件系统中,保存在磁盘分区中的文件不管是什么类型都会给它分配一个编号,这个编号被称为索引节点编号(Inode Index)或者Inode,它是文件或目录在一个文件系统中的唯一标识,文件的实际数据放置在数据区域(data block),它存储着文件重要参数信息,即元数据 (metadata),比如创建时间、修改时间、文件大小、属主、归属的用户组、读写权限、数据所在block号等,如下图所示:

在Linux系统中,多个文件名指向同一索引节点(Inode)是正常且允许的,一般这种链接就成为硬链接。硬链接的作用之一是允许一个文件拥有多个有效路径名,这样用户就可以建立硬链接到重要的文件,以防止"误删"源数据 。不过硬链接只能在同一文件系统中的文件之间进行链接,不能对目录进行创建。之所以文件建立了硬链接就会防止数据误删,是因为文件系统的原理是,只要文件的索引节点还有一个以上的链接(仅删除了该文件的指向),只删除其中一个链接并不影响索引节点本身和其他的链接(数据的实体并未删除),只有当最后一个链接被删除后,此时如果有新数据要存储到磁盘上,被删除的文件的数据块及目录的链接才会被释放,空间被新数据暂用覆盖。
二、软链接说明
软链接也叫符号链接,类似于windows系统中的快捷方式,与硬链接不同,软链接就是一个普通文件,只是数据块内容有点特殊,文件用户数据块中存放的内容是另一文件的路径名的指向,通过这个方式可以快速定位到软连接所指向的源文件实体。软链接可对文件或目录创建。
软链接作用
1. 便于文件的管理,比如把一个复杂路径下的文件链接到一个简单路径下,方便用户访问。
2. 节省空间解决空间不足问题,某个文件系统空间已经用完了,但是现在必须在该文件系统下创建一个新的目录并存储大量的文件,那么可以把另一个剩余空间较多的文件系统中的目录链接到该文件系统中。
需要注意:删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接就变成了死链接。
三、软连接和硬链接的特点
软链接
1. 软链接是存放另一个文件的路径的形式存在。
2. 软链接可以跨文件系统 ,硬链接不可以。
3. 软链接可以对一个不存在的文件名进行链接,硬链接必须要有源文件。
4. 软链接可以对目录进行链接。
硬链接
1. 硬链接,以文件副本的形式存在。但不占用实际空间。
2. 不允许给目录创建硬链接。
3. 硬链接只有在同一个文件系统中才能创建。
4. 删除其中一个硬链接文件并不影响其他有相同 inode 号的文件。
需要明白:不论是硬链接或软链接都不会将原本的档案复制一份,只会占用非常少量的磁碟空间。
四、链接文件创建命令 "ln"
ln命令格式
ln [参数] [源文件或目录] [目标文件或目录]
主要参数
-i 交互模式,文件存在则提示用户是否覆盖。
-s 软链接(符号链接)。
-d 允许超级用户制作目录的硬链接。
-b 删除,覆盖以前建立的链接
软链接,即符号链接创建方法
# ln -s source target
硬链接,即实体链接创建方法
# ln source target
链接操作示例
给文件创建硬链接
[root@ss-server ~]# mkdir /opt/test #创建测试目录
[root@ss-server ~]# cd /opt/test
[root@ss-server test]# touch file1
[root@ss-server test]# ll
total 0
-rw-r--r-- 1 root root 0 Dec 9 16:38 file1
[root@ss-server test]# ln file1 file_hard #在默认不带参数情况下,ln命令创建的是硬链接。
[root@ss-server test]# ll
total 0
-rw-r--r-- 2 root root 0 Dec 9 16:38 file1
-rw-r--r-- 2 root root 0 Dec 9 16:38 file_hard 给文件创建软链接
[root@ss-server test]# ln -s file1 file_soft #创建软链接用"-s"参数
[root@ss-server test]# ll
total 0
-rw-r--r-- 2 root root 0 Dec 9 16:38 file1
-rw-r--r-- 2 root root 0 Dec 9 16:38 file_hard
lrwxrwxrwx 1 root root 5 Dec 9 16:39 file_soft -> file1 #软链接文件 硬链接是有着相同 inode 号仅文件名不同的文件,用ls命令查看。
[root@ss-server test]# ls -li
total 0
917510 -rw-r--r-- 2 root root 0 Dec 9 16:38 file1
917510 -rw-r--r-- 2 root root 0 Dec 9 16:38 file_hard
917511 lrwxrwxrwx 1 root root 5 Dec 9 16:39 file_soft -> file1 如上:
源文件和硬链接文件inode号相同 (第一列就是inode号),指向同一个索引节点。
软链接是一个链接文件,文件模式那块前面有个l字母,表示是个链接文件。 硬链接不能指向目录
[root@ss-server test]# mkdir litest
[root@ss-server test]# ln litest li_hard
ln: ‘litest’: hard link not allowed for directory 软链接可以执行目录
[root@ss-server test]# ln -s litest li_soft
[root@ss-server test]# ll
total 4
-rw-r--r-- 2 root root 0 Dec 9 16:38 file1
-rw-r--r-- 2 root root 0 Dec 9 16:38 file_hard
lrwxrwxrwx 1 root root 5 Dec 9 16:39 file_soft -> file1
lrwxrwxrwx 1 root root 6 Dec 9 16:48 li_soft -> litest
drwxr-xr-x 2 root root 4096 Dec 9 16:47 litest 覆盖以前建立的链接,使用-b参数,相当于变相删除链接文件
[root@ss-server test]# ln test1 test_hard
ln: failed to create hard link ‘test_hard’: File exists
[root@ss-server test]#
[root@ss-server test]# ln -b test1 test_hard
[root@ss-server test]# ln -s -b litest li_soft
[root@ss-server test]# ln -s -b test1 test_soft 删除文件测试
[root@ss-server test]# echo "this is test" > file1 #向文件中添加数据
[root@ss-server test]# cat file1 #查看文件内容
this is test
[root@ss-server test]# cat file_hard file_soft #查看硬链接和软链接文件内容是否一致
this is test
this is test [root@ss-server test]# rm -f file1 #删除源文件
[root@ss-server test]# ls -li
total 8
917510 -rw-r--r-- 1 root root 13 Dec 9 16:49 file_hard
917511 lrwxrwxrwx 1 root root 5 Dec 9 16:39 file_soft -> file1
917513 lrwxrwxrwx 1 root root 6 Dec 9 16:48 li_soft -> litest
917512 drwxr-xr-x 2 root root 4096 Dec 9 16:47 litest 发现硬链接文件存在 内容和源文件内容一样!
原因:虽然删除源文件,但是仍然有硬链接指向源文件inode节点,所以不会被释放删除,这里只是删除file1源文件到inode节点的链接。
[root@ss-server test]# cat file_hard
this is test 发现软链接文件已经不存在了,目录还会显示这个文件,就是软链接文件已经失效。
[root@ss-server test]# cat file_soft
cat: file_soft: No such file or directory 删除软链接(直接rm删除即可)
[root@ss-server test]# rm -f file_soft #直接删除这个软链接文件就行
[root@ss-server test]# ll -li
total 8
917510 -rw-r--r-- 1 root root 13 Dec 9 16:49 file_hard
917513 lrwxrwxrwx 1 root root 6 Dec 9 16:48 li_soft -> litest
917512 drwxr-xr-x 2 root root 4096 Dec 9 16:47 litest 可以使用unlink命令取消链接关系(硬链接和软链接都可以)
[root@ss-server test]# unlink file_hard
[root@ss-server test]# unlink li_soft
[root@ss-server test]# ll -li
total 4
917512 drwxr-xr-x 2 root root 4096 Dec 9 16:47 litest
五、cp和mv场景下的链接情况
1)如果对一个软链接文件再次进行硬连接,则硬连接之后的那个文件还是软链接文件!
[root@ss-server test]# touch test1
[root@ss-server test]# ln -s test1 test_soft
[root@ss-server test]# ls -l
total 4
drwxr-xr-x 2 root root 4096 Dec 9 16:47 litest
-rw-r--r-- 1 root root 0 Dec 9 17:12 test1
lrwxrwxrwx 1 root root 5 Dec 9 17:13 test_soft -> test1 由于源文件test_soft本身就是一个软链接文件,所以由它硬链接之后的文件test_hard1还是软链接文件!
并且test_hard1文件的源文件指向并不是test_soft,而是最初的实体源文件test1!!
可以看出,test_soft和test_hard1同样为指向test1源文件的软链接文件,inode节点号都一样(如下都是917511)
[root@ss-server test]# ln test_soft test_hard1
[root@ss-server test]# ls -li
total 4
917512 drwxr-xr-x 2 root root 4096 Dec 9 16:47 litest
917510 -rw-r--r-- 1 root root 0 Dec 9 17:12 test1
917511 lrwxrwxrwx 2 root root 5 Dec 9 17:13 test_hard1 -> test1
917511 lrwxrwxrwx 2 root root 5 Dec 9 17:13 test_soft -> test1 2)当源文件cp拷贝到另一个文件时,链接文件跟源文件内容保持一致,并不会跟源文件的备份文件不会保持一致!!
[root@ss-server test]# rm -f test_hard1
[root@ss-server test]# ll
total 4
drwxr-xr-x 2 root root 4096 Dec 9 17:30 litest
-rw-r--r-- 1 root root 0 Dec 9 17:12 test1
lrwxrwxrwx 1 root root 5 Dec 9 17:27 test_soft -> test1
[root@ss-server test]# ln test1 test_hard
[root@ss-server test]# ls -l
total 4
drwxr-xr-x 2 root root 4096 Dec 9 17:30 litest
-rw-r--r-- 2 root root 0 Dec 9 17:12 test1 #源文件
-rw-r--r-- 2 root root 0 Dec 9 17:12 test_hard #硬连接文件
lrwxrwxrwx 1 root root 5 Dec 9 17:27 test_soft -> test1 #软链接文件 [root@ss-server test]# echo "hello world,haha" > test1
[root@ss-server test]# cp test1 test_bak
[root@ss-server test]# ll -li
total 16
917512 drwxr-xr-x 2 root root 4096 Dec 9 17:30 litest
917510 -rw-r--r-- 2 root root 29 Dec 9 17:39 test1
917511 -rw-r--r-- 1 root root 17 Dec 9 17:37 test_bak
917510 -rw-r--r-- 2 root root 29 Dec 9 17:39 test_hard
917516 lrwxrwxrwx 1 root root 5 Dec 9 17:27 test_soft -> test1 [root@ss-server test]# cat test1 test_bak
hello world,haha
hello world,haha
[root@ss-server test]# cat test_soft test_hard
hello world,haha
hello world,haha
[root@ss-server test]# echo "heihei,nice" >> test1
[root@ss-server test]# cat test_soft test_hard
hello world,haha
heihei,nice
hello world,haha
heihei,nice
[root@ss-server test]# cat test1
hello world,haha
heihei,nice
[root@ss-server test]# cat test_bak
hello world,haha 3)当源文件mv更名为另一个文件时,则链接文件跟源文件mv之后的文件内容保持一致!
[root@ss-server test]# mv test1 test_mv
[root@ss-server test]# echo "123456" >> test_mv [root@ss-server test]# ls -li
total 16
917512 drwxr-xr-x 2 root root 4096 Dec 9 17:30 litest
917511 -rw-r--r-- 1 root root 17 Dec 9 17:37 test_bak
917510 -rw-r--r-- 2 root root 36 Dec 9 17:51 test_hard
917510 -rw-r--r-- 2 root root 36 Dec 9 17:51 test_mv
917516 lrwxrwxrwx 1 root root 5 Dec 9 17:27 test_soft -> test1 [root@ss-server test]# cat test_hard #硬连接文件跟源文件mv更名后的文件保持一致(inode号和内容都保持一致)
hello world,haha
heihei,nice
123456 [root@ss-server test]# cat test_soft #由于源文件更名,之前做的软链接文件成为了死链文件!
cat: test_soft: No such file or directory
软链接只认文件名,硬链接不仅认文件名,还认文件inode节点号。所以源文件mv更名后(文件mv前后,inode节点号不变),硬链接文件也跟着文件inode节点号过去了。
############# 需要注意 ################
硬链接限制 ["Invalid cross-device link错误"]:
1)不能跨文件系统。
2)只能在同一个分区建立数据关联。
3)不能连接目录。
软链接可以跨文件系统,可以在不同分区创建软链接文件!!!
Linux系统硬链接和软链接说明 - 运维笔记的更多相关文章
- Linux系统硬链接和软链接介绍
1.链接的概念 在Linux系统中链接分为硬链接和软连接两种,一种为硬链接,另一种为软连接或符号链接(symbolic Link).ln命令就是创建链接文件的,在默认不带参数的情况下,执行ln命令创建 ...
- 【Linux】Linux系统硬链接和软链接
在linux系统中有种文件是链接文件,可以为解决文件的共享使用.链接的方式可以分为两种,一种是硬链接(Hard Link),另一种是软链接或者也称为符号链接(Symbolic Link). 查看lin ...
- Linux系统——硬链接与软链接
文件属性软硬连接: 链接有两种,一种为硬链接(Hard Link),另一种为软链接或符号链接(Symbolic Link或Soft Link). 建立硬链接时,链接文件和被链接文件必须位于同一个文件系 ...
- 二、Linux系统硬链接和软链接详细介绍与实践
链接的概念 在linux系统中,链接可分为两种:一种被称为硬链接(Hard LinK),另一种被称为软链接或符号链接(Symbolic Link).在默认不带参数的情况下,执行ln命令创建的链接是硬链 ...
- linux系统 硬链接和软链接
背景: 当几个用户同在一个项目里工作时.经常须要共享文件. 假设一个共享文件同一时候出如今属于不同用户的不同文件夹下.工作起来就非常方便. 比如B和C文件夹下有一文件D是两者都能够訪问和改动的共享文件 ...
- 理解 Linux 的硬链接与软链接(待研究)
从 inode 了解 Linux 文件系统 硬链接与软链接是 Linux 文件系统中的一个重要概念,其涉及文件系统中的索引节点 (index node 又称 inode),而索引节点对象是 Linux ...
- Linux 的硬链接与软链接
Linux 的硬链接与软链接 http://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/ 若一个 inode 号对 ...
- 理解Linux的硬链接与软链接-转载
理解Linux的硬链接与软链接 来自:https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/index.html
- 转:理解 Linux 的硬链接与软链接
Linux 的文件与目录 现代操作系统为解决信息能独立于进程之外被长期存储引入了文件,文件作为进程 创建信息的逻辑单元可被多个进程并发使用.在 UNIX 系统中,操作系统为磁盘上的文本与图像.鼠标与键 ...
随机推荐
- git 操作说明
第一步:代码提交到本地仓库 第二步:更新远程服务器代码到本地,如果有冲突需要优先解决,解决冲突后执行第一步操作 第三步:推送本地代码到远程服务器,可以使用source Tree 或者工具自带的配置gi ...
- Python3 IO编程之操作文件和目录
如果我们要操作文件,目录,可以在命令行下面输入操作系统提供的各种命令来完成.比如ls,cp等命令 如果要在python程序中执行这些目录和文件的操作怎么办?其实操作系统提供的命令指示简单地调用了操作系 ...
- UML学习笔记:活动图
UML学习笔记:活动图 活动图 活动图是UML中描述系统动态行为的图之一,用于展现参与行为的类的活动或动作.在UML里,活动图很类似于流程图,但是有一些区别: 活动图着重表现系统行为,描述对象活动的顺 ...
- tomcat配置SLL证书
1.将jks证书复制到conf目录下 2.解除注释:88行至96行 修改代码 <Connector port="443" protocol="org.apache. ...
- git push时出现大文件的处理方法
最近在提交项目时出现报错 文件限制只能100M,但是里面有个文件202M,超过了码云的限制. 所以顺手就把这个文件删除了 然后发现还是同样的报错,反复检查目录还是不行,找了资料说,需要git rm 命 ...
- linux 源码安装JAVA jdk
下载Linux环境下的jdk1.8,请去(官网)中下载jdk的安装文件: 由于我的Linux是64位的,因此我下载jdk-8u131-linux-x64.tar.gz. 下载之后 解压命令进行解压 1 ...
- os删除文件或者文件夹
最近在使用os.remove删除目录时报错了,这里记录下os操作文件或者目录的常用方法 递归删除文件或文件夹 import shutil shutil.rmtree() 文件的重命名 os.renam ...
- 【转帖】如果进入CPU的世界,时间会是怎样的?
如果进入CPU的世界,时间会是怎样的? 2018-02-26 20:52:46 world6 阅读数 1295更多 分类专栏: 网络 缓存服务 架构 版权声明:本文为博主原创文章,遵循CC 4.0 ...
- [转帖]C语言计算时间函数 & 理解linux time命令的输出中“real”“user”“sys”的真正含义
C语言计算时间函数 & 理解linux time命令的输出中“real”“user”“sys”的真正含义 https://blog.csdn.net/willyang519/article/d ...
- Redis--hash类型操作命令
哈希类型hash redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象 哈希类型hash——基本命令 hset /hget /hms ...