基于Linux面向多用户的特性,文件共享已成为必需的功能。在一个多用户系统中,如果每个用户都对某文件有读、写等操作需求,而此时操作系统不提供文件共享,那么只能对每个用户都创建一个该文件的副本。这样一来,大大浪费了存储空间,二来也不方便用户之间的协作。因此,在Linux系统中,采用了现在常用的两种文件共享方式——基于索引节点的共享方式(硬链接)和基于符号链的共享方式(软链接)。
一、基于索引节点的共享方式(硬链接)
1、前言
在讲这两种链接方式之前,我们先说一下Linux上的文件是什么样的。文件包括两个部分:文件本身的数据和元数据。文件本身的数据就是我们用户所需要的数据,存储在硬盘上的数据块中;而元数据就用来表示文件的属性,如文件大小、文件名、时间戳等等以及inode索引节点(inode具体定义这里不再详述)信息。而在这些元数据中,只有inode号才能唯一地标识某个文件(文件名并不能),基于这一点,下面详解硬链接的实现。
2、概念
硬链接可以理解为对现有的一个文件的引用。初始时,每个文件都有一个硬链接,即指向该文件inode的指针,inode中设置一个计数器count,初始为1,称为引用计数器。当有其他地方需要使用到这个文件的时候,可以不用复制,直接创建一个对该文件的引用,也就是再建立一个指向该文件inode的指针,此时引用计数器的值**+1**,我们称这种共享方式为基于索引节点的共享方式,也就是建立硬链接的方式,在这种共享方式中,文件目录中只设置文件名和指向inode节点的指针,由于inode唯一标识文件,因此文件名可以改变。
下面给出硬链接的图示:
这里共有3个用户,这三个用户共享1个文件,共创建了三个硬链接,共同指向同一个inode,inode中的引用计数器count == 3表示共有三个引用,该文件在三个用户系统中的文件名各不相同。
如果这时候用户2不再需要此文件,正确的做法是先将inode节点中的count值-1,然后删除自己文件目录中相应的目录项,也就是“1feg ptr1”这一条记录删除,即删除了一个硬链接,不会影响原文件和其他硬链接。当最终count == 0的时候,表明已经没有硬链接,即该文件已经没人使用,此时系统才会清空其所有数据。
同理,假设这个时候用户User4需要对这个文件进行操作,则生成一个指向inode的指针和文件名,建立硬链接,同时count+1。
总结:硬链接就可以理解为有着相同inode号的不同名文件(也可同名),这些文件都是对同一个inode的映射,可以防止用户误删数据。
3、特点
硬链接有以下几个特点:
(1) 所有的硬链接指向相同的inode以及数据块;
(2) 必须对已存在的文件(即已存在的硬链接)创建硬链接;
(3) 新建立的文件本身就是一个硬链接;
(4) 删除一个硬链接不影响其他的硬链接;在有多个硬链接的情况下删除某个硬链接,数据不会被删除;删除最后一个硬链接,对应数据全部清空。
(5) 不可以对目录(文件夹)建立硬链接;
(6) 硬链接与被链接文件有着相同的文件属性(权限、时间戳等);
(7) 新建一个硬链接,inode中的count+1,反之-1。
二、基于符号链的共享方式(软链接)
1、概念
软链接是指某文件 F’ 的用户数据块中存放的是另一文件 F或目录D 的路径名,称“某文件”是“另一文件”的软链接,“另一文件”是被软链接的文件,且这个路径名被视为符号链。
当用户2要访问被链接的文件F时,操作系统根据软链接文件F’中的路径名去访问文件F,从而实现多用户对文件F的共享。删除一个软链接,不会影响其他软链接和原文件。因此软链接可以理解为快捷方式。
软链接的文件占用的数据块与被链接文件不同,而且有自己的inode和文件属性信息。
2、特点
软链接有以下几个特点:
(1) 每个软链接都有自己的inode以及数据块;
(2) 原文件不存在时,亦可以创建软链接;
(3) 删除一个软链接,不影响被链接的文件;删除被链接的文件,则软链接无法找到原文件,变成悬挂的软链接;但原文件被重新创建(按原路径)时,软链接又重新发挥作用;
(4) 可以对目录建立软链接;
(5) 软链接与被链接文件有不同的文件属性(权限、时间戳等);
(6) 新建和删除软链接不改变count值。
三、例题
设文件file的inode当前的引用计数器值为3,先对file建立软链接f1,再对file建立硬链接f2,再对f1建立硬链接f3,再删除f2、f3。分别求file、f1中的引用计数器值。
解:对file建立软链接f1,不影响file的引用计数器的值,故还是3;对file建立硬链接f2,故引用计数器+1,变为4;软链接f1本身就是一个文件,故初始f1中的引用计数器值为1,对f1建立硬链接f3,故引用计数器值+1,变为2;最后删除f2,被硬链接文件file的引用计数器的值-1,变为3,删除f3,被硬链接文件f1的引用计数器的值-1,变为1。
因此最终答案为:
file的引用计数器的值:3;f1的引用计数器的值:1