硬连接和软连接

Linux下的两种连接文件及创建方式

在Linux下面的连接文件有两种——软连接和硬连接,虽然都是连接文件,但两者却有很大的区别:

一种是类似于Windows的快捷方式功能的文件(或目录),这种连接称为软连接
另一种则是通过文件系统的inode连接来产生新文件名,而不是产生新文件,这种称为硬连接

创建连接文件的方法非常简单,就是使用ln命令,ln file1 file2,则创建硬连接,file2为file1的硬连接,ln -s file1 file2,则创建软连接,file2为file1的软连接。

详述硬连接

在Linux下,每个文件都会占用一个inode,文件内容由inode的记录来指向,而想要读取文件,必须要经过目录记录的文件名来指向正确的inode号码才能读取,也就是说,其实文件名只与目录有关,但是文件的内容则与inode有关。

那什么硬连接?就是在某个目录下新建一条文件名连接到某inode号码的关联记录而已,简单来说,就是有多个文件名对应到同一个inode号码,注意,是多个文件名,不是多个文件

例子:

在这里插入图片描述
解释:
创建一个硬连接,并查看了相关文件的inode,从结果可以看出,这两个文件的inode是完全相同的(394220),而文件连接数则不是1而是2,而且crontab的文件类型是“-”而不是“l”,即它不是一个连接文件,这是因为有两个文件连接到了同一个文件/etc/crontab啊。

下面的图来解释:
在这里插入图片描述
解释:
从图中可以看到,你可以通过1或2的目录inode所指定的block找到两个不同的文件名,而不管使用哪个文件名均可以找到real这个inode,并通过这个inode去读取到最终的数据。

建立/root/crontab的那个文件不也需要一个inode和blocks吗?如图中的inode1不就是建立这个连接所要用的一个inode吗?其实不是这样理解的,因为/root这个目录早已在,而它里面的内容也早已记录在这个block中,即无论你添加还是不添加一个硬连接inode1和它所指向的那个目录的block都已经存在了,你建立的硬连接只是在这个inode1所指向的block中添加一条文件名的记录而已,在这个例子中,就是添加/root/crontab这条记录。所以没有增加inode和block的耗用。

软连接

软连接就是在创建一个独立的文件,而这个文件会让数据的读取指向指向它连接的那个文件的文件名。即只是利用文件来作为指向的操作,所以,当源文件被删除后,软连接会“打不开”,出现的情况就像大家熟悉的Windows中那样,提示“无法打开某个文件”。

例子:在这里插入图片描述
解释:
创建了一个软连接,从输出的结果中,我们可以看出它与硬连接的确是非常的不同。首先,这两个文件的inode号码并不相同,再者在文件类型方面,/etc/crontab为“-”,即普通的文件,而/root/crontab_sl则为“l”,即连接文件。

软连接文件,即此例子中的crontab_sl文件里面的内容是什么呢?大家可以看到它的大小只12B,其实它的内容就是“/etc/crontab”这12个字符而已

在这里插入图片描述
上图表示,由inode1读取到连接文件的内容仅有文件名,根据文件名连接到正确的目录去取得目标文件的inode,最终就能够读取到正确的数据了

从上面的输出结果中,大家应该已经看到软连接是要耗用inode和block的(因为inode号与源文件的inode不相同),对应上图就是耗用了inode1和它所指向的block

它与硬连接的不同之处在于,inode1在创建这个软件文件之前是没有被使用的inode,它不指任何的block,也是说图中它所指向的block也不没有被利用的。当要创建软连接时,inode1和它所指向的block才被利用了。而且这个block不是用来记录文件名的,而是真真正正的一个文件,用来记录文件信息,例如这里它的信息是“/etc/crontab”这12个字,它是放在目录/root下的文件。

inode的信息

inode是unix/linux操作系统中的一种数据结构,本质上是一个结构体,里面定义了一些变量,这些变量用来记录与文件相关的信息。在操作系统创建文件系统的时候就会创建大量的inode。inode相当于是一个索引结点,用来存放文件的基本信息。

查看文件的inode信息:stat+文件名
例子

在这里插入图片描述

注意:inode里面是不存储文件名的,上图中虽打印出来文件名,但是实际在inode中是没有文件名的,因为对于unix/linux来说文件名不太重要的。我们重点关注以下几个信息:inode编号和Links(链接数)

inode的存储 :
inode的存储会消耗硬盘空间,在硬盘格式化的时候,操作系统会将硬盘自动分成两个区域:一个是数据区用来存储文件数据,另一个是inode(inode table)区域(存放inode所包含的所有信息)。

inode的大小为128或256个字节,一般在Unix/Linux创建文件系统的时候就会同时创建大量的inode,通常将为inode表分配百分之一的文件系统磁盘空间,并且每次创建一个文件的时候都会为这个文件分配一个inode。**一个inode可与一个或多个文件相连接(**硬连接和软连接)。

如果inode耗尽,即使数据区还有大量的空间,文件系统也不能再创建文件,所以监测文件系统的inode的使用情况是很重要的。

列出文件系统的整体磁盘使用量:df
参数:

-a:列出所有的文件系统,包括系统特有的/proc文件系统;
-h:以GB、MB、KB等格式自行显示;
-i:不用硬盘容量,以inode的数量来显示;
-k:以KB的容量显示文件系统;
-T:连同该分区的文件系统也列出;
-m:以MB的容量显示文件系统。

例将系统内所有的文件列出:

在这里插入图片描述

解释:
1)Muntedon:磁盘挂载的目录所在。
2)Filesystem:文件系统所在分区。
3)1K-blocks:以1K为单位列出数据。
4)Used:已使用的磁盘空间。
5)Available:剩余的磁盘空间。
6)Used%:磁盘的使用率。当使用率高达90%时要注意,免得容量不足造成系统问题

例子:将系统内的所有特殊文件格式及名称都列出
在这里插入图片描述
例子:将目前各个分区当中可用的inode数量列出

在这里插入图片描述

inode编号 :
每一个inode都有编号,操作系统是用inode编码来识别不同的文件的。注意在Unix/Linux的内核中是不使用文件名的,而是使用inode编号来识别文件。对于操作系统来说,文件名只是inode编号的一个别名而已,操作系统通过文件名找到对应的inode之后,接下来就没文件名的事。

操作系统找到文件的这个过程分为三步

1)通过文件名找到对应的inode编号。

2)通过inode获取文件信息。

3)根据inode信息找到文件数据所存储的位置。

查看文件的inode编号:ls -i 文件名
例子:
在这里插入图片描述
评估文件系统的使用量:du

参数

-a:列出所有文件与目录容量;

-h:以人们易读的方式显示;

-s:列出总量;

-S:不包括总目录下的总计。

例子:
检查根目录下每个目录占用的容量
在这里插入图片描述
创建硬连接:ln 源文件 目标文件
例子:
在这里插入图片描述

创建软连接:ln -s 源文件名 目标文件名
例子
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值