Linux中的硬链接和软链接

在Windows操作系统中,我们经常会给一个文件创建一个快捷方式到桌面上,给其取一个自定义的文件名,然后可以通过该快捷方式来操作该文件,比较方便地共享了该文件。在Linux中也有类似快捷方式的方法来实现文件的共享,分别是文件的硬链接和软连接。

1. 硬链接

我们知道在Linux的文件系统中,一个文件在磁盘分区中对应一个inode和多个block,inode用来记录文件的属性信息,而block用来存放文件的数据。inode在文件系统中唯一标识一个文件。我们平时访问文件的时候是通过文件名来进行的,但是文件的文件名并不是存放在此文件的inode中,而是存放在该文件所在目录的目录文件中,所以我们在读取一个文件的时候,首先从目录文件中找到该文件名对应的inode,然后去读取inode。我们这里需要留意的是一个文件对应一个inode。我们可以通过stat和ls -i命令来获取文件的inode编号。如下:

这里写图片描述

可以看出,新建一个文件之后将获取一个inode,并且可以得知其连接数为1。这里的连接数指的是,可以根据目录文件连接到该inode的文件名。也就是说,我们可以在取一个新的名字,然后将这个新的名字也连接到该inode上了。是的,这个新的名字就是硬链接了。创建硬链接的命令为如下:

ln [-sf] 源文件 目标文件
参数:
-s:如果不加任何参数就进行连接,就是hard link,-s为symbolic link
-f:如果目标文件存在时,就主动将目标文件直接删除后再创建

我们创建一个硬链接:

这里写图片描述

可以看出两个文件liz和liz_hard_link所对应的inode编号一模一样,并且文件的连接数已经变成2了。

因此,我们可以设置多个文件名对应同一个inode,创建硬链接的时候磁盘空间中的inode数量不会改变,它只是在某个目录下的block中多写入一个关联数据而已,既不会增加inode也不会消耗block数量。

另外,硬链接存在两个限制:
- 不能跨越文件系统
- 不能连接到目录

首先不能跨越文件系统。虽然inode在同一文件系统在是唯一标识一个文件的,但是不同文件系统中的inode可能相同,如果跨越文件系统创建硬链接的话,那么我们的硬链接对应的inode编号将弄不清楚该连接到哪里去了。

其次,不能连接到目录。这可能会造成目录混乱。主要是因为在在Linux中目录已经存在了两种硬链接了,就是当前目录(.)和前一级目录(..),如下:

这里写图片描述

从上图我们可以看到对于目录LinkTest,其下面没有其它目录文件了,所以其只对应两个连接,当前目录连接(.)和它本身LinkTest。其连接数我们可以看到是2。现在我们在其下再创建一个目录文件,那么LinkTest的连接数将变成3了,因为还多了一个上一级目录这个身份了。如下:

这里写图片描述

可以看到连接数变成3了。

言归正传,我们现在已经有了目录/home/liz/LineTest/lizdir了,现在如果我们创建一个目录LineTest的硬链接LineTest_hd,则在lizdir下面进行cd .将会混乱到底是进入了LineTest_hd还是LineTest了,会使得目录变得混乱。

2. 软链接

软链接也可以称为符号连接(symbolic link)。符号连接将创建一个独立的新的文件,但是这个文件比较特殊,它会让数据的读取指向它连接的那个文件的文件名。假设文件a是一个符号连接,连接到文件b,则a也有单独的inode,但是对a进行读写的时候会直接转向到b中去。其实软连接的概念跟Windows中的快捷方式差不多了。
这里需要注意到的是,symbolic link会消耗inode和block,是一个真真正正的独立的文件。如下:

这里写图片描述

从上图可以看出,符号连接文件liz_soft_link是一个连接文件,连接数为1,因为符号连接会创建一个独立的文件inode。另外其文件名后面有一个箭头指向其连接的文件。现在我们对连接文件进行读写的时候将会直接操作liz文件,如下:

这里写图片描述

可以看到从连接文件中写入数据的时候就是直接写入到了原始文件了。

最后,符号连接可以连接到目录文件详细解说

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值