嵌入式技术william hill官网
直播中

晓白嵌入式

8年用户 727经验值
擅长:嵌入式技术
私信 关注

Linux中的索引节点、硬连接和连接计数

索引节点inode

    Linux为每个文件分配一个称为索引节点的号码inode,可以将inode简单理解成一个指针,它永远指向本文件的具体存储位置。系统是通过索引节点(而不是文件名)来定位每一个文件。

    例如:假设我们在硬盘当前目录下建立了一个名为mytext文本文件,其内容只有一行:
This is my file.

    1、当然这行文字一定是存储在磁盘数据区某个具体位置里(物理上要通过磁头号、柱面号和扇区号来描述,在本例中假设分别是12030)

    2、假设其inode262457,那么系统通过一段标准程序,就能将这个inode转换成存放此文件的具体物理地址(1磁头、20柱面、30扇区),最终读出文件的内容:“This is my file.”  

    3、所以inode是指向一个文件数据区的指针号码,一个inode对应着系统中唯一的一片物理数据区,而位于两个不同物理数据区的文件必定分别对应着两个不同的inode号码。

文件拷贝命令:

我们键入命令:cp /home/zyd/mytext newfile 。在当前工作目录建立了一个新文件newfile,其实际操作主要包括如下三步:

1、在当前目录中增加一个目录项,其文件名域填入newfile,并分配了一个新的inode,假设是262456

2、将原文件(1磁头、20柱面、30扇区)的内容复制了一份到新的空闲物理块(假设是1磁头、20柱面、31扇区)

3、填写一些其他关键信息,使系统通过这些信息及inode号码可以完成物理地址的转换。

所以文件复制要分配新的inode和新的数据区,虽然两个文件的内容是一样的。

硬连接hardlink

我们实际使用文件时一般是通过文件名来引用的。通过上面的讨论,我们知道:

1inode号码肯定和一片完全属于一个文件的数据区一一对应。那么一个文件系统中两个或更多个不同的文件名能否对应同一个文件呢?答案是肯定的。

我们知道inode号码是记录在文件名对应的目录项中的,我们可以使两个或多个文件的目录项具有相同的inode值,实际上就使它们对应着同一个文件。

有几个目录项具有相同的inode号,我们就说这个文件有几个硬连接(hardlink),对于普通文件,ls -l命令的连接计数count域的数值就是本文件拥有的硬连接数。硬连接可以通过ln命令建立,

    例如:

ln /home/zyd/mytext hardlink_mytext

就建立了一个新的文件hardlink_mytext,这个文件的inode同样是262457。建立硬连接实际上只是增加了一个目录项,但并没有复制文件数据区,原文件的数据区由两个文件共享。这一方面能够节约大量磁盘空间,同时可以保证两个文件能同步更新。



ls -il’可以显示文件的inode(在下面最左边)

262456 -rw-rw-r-- 1 zyd zyd 17 Nov 3 14:52 newfile  (这是拷贝的文件文件)

262457 -rw-rw-r-- 2 zyd zyd 17 Nov 3 14:50 hardlink_mytext  (硬链接)

262457 -rw-rw-r-- 2 zyd zyd 17 Nov 3 14:50 mytext

硬链接文件有两个限制

1、不允许给目录创建硬链接;

2、只有在同一文件系统中的文件之间才能创建链接。

对硬链接文件进行读写和删除操作时候,结果和软链接相同。但如果我们删除硬链接文件的源文件,硬链接文件仍然存在,而且保留了愿有的内容。这时,系统就“忘记”了它曾经是硬链接文件。而把他当成一个普通文件。修改其中一个,与其连接的文件同时被修改。

连接计数count

前面我们介绍了,文件的连接计数域表明本系统中共有几个文件目录项的inode和本文件相同,也就是本文件共有几个硬连接。如上面的例子中hardlink_mytextmytext文件的count值都是2

那么对于目录,其count域的含义是什么呢?目录的count同样表示共有多少个目录项指向此目录,不过要详细说明必须进一步解释VFS文件系统的结构,为简单起见,只要这样理解就行了:(count-2)等于本目录包含的直接子目录数(就是只包括儿子,不包括孙子啦!)

例如:如果一个目录/abccount域为5,那么/abc目录一定包含3个子目录。

进一步说明:

硬连接文件实际上并不是一种新的文件类型,两个文件互为对方的硬连接。它们应该都是普通文件(谁能告诉我:其它类型的文件可以硬连接吗?)。两个文件除了名称或/和文件目录不同外,其它部分完全相同,更改了一个文件,另一个的文件长度、内容、更改时间等都将相应发生变化,更改了一个文件的权限位mode,另一个也会发生同样的变化。 (因为这些信息都保存在FCB即文件控制块中,FCB有放在索引结点(inode)中)

注意连接计数字段count,互为硬连接的两个文件的count值都是2,表明有两个inode指向同一文件的inode

当我们删除其中一个文件时,系统首先将(count-1)->count,如果结果是零,就将其目录项和数据区都删除,否则只将本目录项删除,数据区仍然保留,仍然可以通过另外的文件名访问。(关于linux文件的删除内部是怎么操作的?这里的写法似乎有点问题,删除的时候除了删除目录项外有删除数据区吗?)根据这个特性,可以通过为重要的文件建立硬连接的方法来防止其被误删除。

一个文件系统允许的inode节点数是有限的,如果文件数量太多,即使每个文件都是0字节的空文件,系统最终也会因为节点空间耗尽而不能再创建文件。所以当发现不能建立文件时首先要考虑硬盘数据区是否还有空间(可通过du命令),其次还得检查节点空间。

互为硬连接的多个文件必须位于同一个文件系统上。根设备及任何一个需要mount才能挂接进来的分区、软盘、NFS、光驱等都是一个独立的文件系统,每个文件系统有一个相应的设备号,不同文件系统中具有相同inode节 点的文件间没有任何联系。系统则通过设备号和inode号的组合唯一确定一个文件。

Linux之所以能支持多种文件系统,其实是由于Linux提供了一个虚拟文件系统VFSVFS作为实际文件系统的上层软件,掩盖了实际文件系统底层的具体结构差异,为系统访问位于不同文件系统的文件提供了一个统一的接 口。 实际上许多文件系统并不具备inode结构,其目录结构也和以上的讨论不同,但通过VFS,系统均为其提供了虚拟一致的inode和目录项结构。 所以,’ls -il’命令实际显示的inode应该是VFS inode,也就是说,inode是存在于内存中的数据结构,而不一定是实际的硬盘结构。但为Linux量身定做的ext2文件系统具备实际的inode和连接型目录项结构,所以,对于ext2文件系统,可以认为我们上面讨论的关于硬连接的概念是完全正确的。

软链接:(符号链接?)

软链接又叫符号链接,这个文件包含了另一个文件的路径名。可以是任意文件或目录,可以链接不同文件系统的文件。和win下的快捷方式差不多。链接文件甚至可以链接不存在的文件,这就产生一般称之为"断链"的问题(或曰“现象"),链接文件甚至可以循环链接自己。类似于编程语言中的递归.(在“汤 子瀛的操作系统”中是这样说符号链接的:这个符号链接本身也是文件――而不像上面的“硬链接”实际上是增加一个目录项,项中存在指向索引结点的指针――所 以符号链接有直接的索引结点,要耗费一定的磁盘空间,该符号链接这个文件中包含被链接文件的路径名。所以只有文件才拥有指向其索引结点的指针,而共享该文 件的其他用户,这通过符号链接,“只拥有该文件的路径名”)
============================================================================================
Unix中使用i节点(i node)来记录真实的物理文件及其位置,文件名只是指向i节点的一个连接。因此每个文件可以有多个名字,每个名字就称为文件的一个连接,而同一个文件的 所有连接所指向的i节点件完全相同。但在删除时只有全部删除这个i节点的全部连接,才能删除i节点、即删除这个文件本身。

$ ln l1 l2
$ ls -l l*
-rwxr-xr-x 2 user wheel 53212 Dec 4 12:36 l1
-rwxr-xr-x 2 user wheel 53212 Dec 4 12:36 l2

    上面的例子使用 ln创建了一个连接,然后在ls的结果中可以看到第二列的数字为2,这表示这个文件有两个连接。这样的连接可以建立在不同的目录中,但所有连接所在的目录 必须在同一个文件系统中,才能使用同样的i节点。由于连接是直接指向标识物理文件的i节点,因此这种连接又称为硬连接。
    另一种更灵活的连接方式是符号连接,它没有指向物理文件的 i节点,而是直接指向目录树上的另一个入口,那么当系统访问这个文件时,就沿着它指向的目录树的位置去查找具体文件。这样就能对任何文件系统中的文件和目 录建立连接,因此称为软连接。符号连接可以跨越文件系统,灵活性很大,能够突破物理文件系统的限制维护目录树的一致性,对于系统管理和维护很有用。但是这 种连接方式需要对目录树进行多次查找,增加了文件操作的额外步骤,因此效率较低,因此不应该使用多级连接,及某个符号连接指向的目录还是一个符号连接,甚 至发生符号连接的循环。应该尽量少用符号连接,并避免多级符号连接及符号连接的循环。

$ ln -s l1 /root/files
$ ls -l l*
lrwxrwxrwx 1 user wheel 12 Dec 4 12:36 l1 -> /root/files
$
  ===========================================================================
链接有两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln命令产生硬链接。

连接指通过索引节点来进行的连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户 就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和 其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件才会被真正删除。

与硬连接相对应,Lnux系统中还存在另一种连接,称为符号连接(Symbilc Link),也叫软连接。软链接文件有点类似于Windows的快捷方式。它实际上是特殊文件的一种。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。
touch f1(创建一个f1的文件)
ln f1 f2 创佳一个f2的硬连接
ln -s f1 f3 创建一个f3的软连接
时如果删除f3,f1,f2无影响;如果删除f2,对f1,f3也无影响,如果删除f1,那么因为f2也应用f1,所以并不影响f2节点的,touch 创建的文件仍然存在;但是此时f3因为是软连接,导致f3失效。如果删除f1,f2 ,那么touch 创建的文件会被删除

回帖(2)

晓白嵌入式

2017-8-20 10:40:12
深入交流学习可以加我qq***.
举报

晓白嵌入式

2017-8-21 10:20:49
深入交流加我qq***.
举报

更多回帖

发帖
×
20
完善资料,
赚取积分