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 源文件名 目标文件名
例子