Linux中的软链接与硬链接

前言

最近复习了一下Linux,看到软硬链接这里。当初学Linux时没学到这,所以就来补一下课。顺便记录,方便日后查阅。

明确问题

需要明确四个问题

  1. 软链接是什么
  2. 硬链接是什么
  3. 软链接和硬链接的区别
  4. 硬链接和单纯的复制的区别

先说结论

  1. 软链接是什么?
    软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。
  2. 硬链接是什么?
    硬链接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬链接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个链接并不影响索引节点本身和其它的链接,只有当最后一个连接被删除后(硬链接数归0),文件的数据块及目录的链接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬链接文件均被删除
  3. 软链接和硬链接的区别
    软链接文件的大小和创建时间和源文件不同。软链接文件只是维持了从软链接到源文件的指向关系,不是源文件的内容。
    硬链接文件和源文件的大小和创建时间一样。硬链接文件的内容和源文件的内容一模一样,相当于copy了一份。但不是不同的copy,硬链接是同步更新的。
    简单的来说,软链接是快捷方式,而硬链接是’指针’(不是严格意义的指针)。
  4. 硬链接和单纯的复制的区别
    其实上面已经回答清楚了,具体来说硬链接是复制了文件的inode(节点),inode是操作系统指定文件的依据,每个文件有且只有一个inode,所以操作硬链接就是操作源文件。而复制则可以看成新建一个文件并拷贝原文件的内容。可以说,硬链接就是源文件的亲兄弟;复制是源文件的克隆,两者独立。

对结论的验证

测试的平台是我的阿里云ECS,CentOS 7.3 64位

1. 软连接

命令格式

ln -s 源文件 链接文件

测试

我们创建一个用于测试的txt文件
touch test.txt
修改一下文件内容
vi test.txt
查看一下内容
cat test.txt
在这里插入图片描述
接着,分别用绝对路径和相对路径创建test.txt的软连接,进行对比。

ln -s /root/test.txt absolute_test.txt
ln -s test.txt relative.txt

在这里插入图片描述
在这里插入图片描述
可以看到,三者的内容是一致的。那么用绝对路径和相对路径创建的软连接是没有区别的吗?让我们来验证一下。
首先查看一下文件的详细信息
ls -l
在这里插入图片描述
可以看到,软连接所创建的文件大小以及创建时间与源文件是不同的。
创建一个用于测试的文件夹test
mkdir test
然后把relative.txt(相对路径)移动到test下
mv relative.txt test
在这里插入图片描述
我们此时再查看一下该文件的内容
cat test/relative.txt
在这里插入图片描述
哦嚯,看不了了!这是为什么呢?
不难理解,相对路径是相对于当前或者说操作目录的,此时的relative.txt链接的对象是同级目录下的test.txt,而test目录下是没有test.txt的,自然查看不了。此时我们如果在test下创建一个test.txt文件(或把源test.txt复制到test下),relative.txt则会重新链接到它。
所以,在创建文件的软链接时,源文件建议要用绝对路径,方便在软链接文件移动后也能正常使用。
接着,我们修改一下软链接文件的内容。
在这里插入图片描述
修改完成后,查看一下源文件,发现内容同步了。
在这里插入图片描述
反之,修改源文件,软链接文件的内容也会同步。

2. 硬链接

命令格式

ln 源文件 链接文件

创建一个/root/test.txt的硬链接文件hard.txt
ln /root/test.txt hard.txt
接着,查看一下内容和详细信息
在这里插入图片描述
可以看到,硬链接文件的文件大小和创建时间都与源文件一致,并且硬链接数为2。同时注意到,hard.txt后没有指向源文件test.txt,就好像copy出来的文件一样,但是它与单纯的copy是不同的。
我们可以复制test.txt与hard.txt进行对比。
cp test.txt copy.txt
在这里插入图片描述
在这里插入图片描述
可以看到,无论是复制的文件还是硬链接的文件,它们的大小以及内容是与源文件相同,但是复制的文件创建时间不同。
此时修改一下源文件的内容再次查看
在这里插入图片描述
可以看到,hard.txt被同步了,而copy.txt没有改变。
接着我们把源文件删除试试
在这里插入图片描述
可以看到,hard.txt还是存在的,内容也未改变。
此时再看一下软链接的内容是否还可以查看。
在这里插入图片描述
可以看到,软链接文件失效了。
让我们来最后看一下上面提到的inode,通俗的讲i节点是文件和目录的唯一标识,每个文件和目录必有i节点,不然操作系统就无法识别该文件或系统,就像没有上户口的黑户。
在这里插入图片描述
可以看出硬链接文件和源文件i节点号相同,并且一个i节点可以对应多个文件名,而软链接不然。
原理如下
在这里插入图片描述
在Linux中,文件名和文件的数据是分开存放的。可以看到,131445这个节点对应的文件名就是test.txt与hard.txt。可以这么理解,系统是只认inode的,而文件名就是对inode的映射,很显然他们是两两不影响映射关系的。形象的来讲,一个人(inode),他有两个肾(test.txt,hard.txt)(当然,这里具这个例子并不恰当,因为肾对于人来说只能有两个,而文件名对于inode来说可以有无数多个。但是足够形象,便于理解。),他挖了一个(删掉hard.txt),这个举动对于另外一个肾(test.txt)是没有影响的,且对于他来说也是没影响的。
但是如果两个肾都挖去(硬链接数归0),这个人就活不了了(文件释放)。可以知道,源文件的一个硬链接就是其本身,所以在没有其他硬链接的情况下,文件的硬链接数就为1。图也解释了硬链接的同步更新,对源文件修改,操作系统只认i节点,于是操作系统就将修改内容写进所有i节点相同名字不同的文件。
而软链接是怎么样的呢?
在这里插入图片描述
可以看到,软链接文件是依赖于源文件的,所以当我们删除源文件时,软链接也会失效。这一点在windows上的快捷方式上体现的很好。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值