打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
索引节点
Linux文件系统使用索引节点来记录文件信息,作用类似于Windows下的文件分配表。索引节点是一个结构,它包含了一个文件的长度、创建及修改时间、权限、所属关系、磁盘中的位置等信息。一个文件系统维护了一个索引节点的数组,每个文件或目录都与索引节点数组中的唯一一个元素对应。系统给每个索引节点分配了一个号码,也就是该节点在数组中的索引号,称为索引节点号。
linux文件系统将文件索引节点号和文件名同时保存在目录中。
所以,目录只是将文件的名称和它的索引节点号结合在一起的一张表,目录中每一对文件名称和索引节点号称为一个连接。
对于一个文件来说有唯一的索引节点号与之对应,对于一个索引节点号,却可以有多个文件名与之对应。
因此,在磁盘上的同一个文件可以通过不同的路径去访问它。
uinx 如何跟踪索引节点
摘自<<UNIX Power Tools>>, 看了后觉得很不错, 都来学习基础知识.
能够在UNIX专家酒会上讨论索引节点(inode)是社交成功的关键.可能这看上去对用户吸引力并不大, 但迟早用户需要知道索引节点是什么.
严格地说,索引节点是UNIX文件系统的一个重要部分. 通常用户不用考虑它们,但知道它们是什么确实很有必要.
索引节点是磁盘上用于描述文件的一种数据结构. 它保存了文件的大部分重要信息,包括文件数据块(用户关心的文件部分)在磁盘上的地址. 每个索引节点都有自己的标识号, 称为索引号(i-number). 实际上用户根本不需要关心文件在磁盘上的物理地址, 也不用关心索引号----除非是要找出对文件的链接. 但用户关心下列信息, 而它们都被保存在文件的索引节点中:
文件所有权: 拥有文件的用户和组
文件访问模式: 不同的用户和组是否可以读, 写或执行文件.
文件时间标记: 文件最后一次被修改的时间, 最后被访问的时间和索引节点最后被修改的时间.
文件类型: 是否为常规文件, 特殊文件或者其他类型的抽象伪装文件.
文件系统第一次被创建时(通常是磁盘第一次初始化时), 会为每一个文件系统创建若干数量的索引节点. 该数目是文件系统所能容纳的最大文件数. 只要不重新初始化文件系统, 就不能改变这个数目, 否则会损坏该文件系统上所有的数据. 很有可能(虽然很少见)文件系统会将索引节点全部用光,就像有可能用完存储空间一样----当文件系统中有很多很多小文件时,这种情况就可能发生.
使用ls –l命令会显示出在大部分信息. ls –i option显示文件的索引号. 而stat命令则可以列出索引节点中的几乎所有信息.
2.2 文件系统
事实上,Linux 系统中每个分区都是一个文件系统,有它自己的顶层目录和下面的目录层次结构。然后将这些单独的文件系统形成一个系统的总的目录层次结构。其办法是:将一个文件系统的顶层目录挂装到另外一个文件系统中的子目录上,使它们成为一个整体。
举一个例子:在安装 Linux 时的时候,把一个硬盘分为三个分区。其中一个分区是安装的是根文件系统。第二个分区安装的是 /usr 文件系统;第三个分区安装的是 /home 文件系统。在目录树中,/home 目录及其子目录都安装在第三个分区中;/usr 目录及其子目录都安装在第二个分区中;在标准目录结构中,除去 /home 和 /usr 的其他目录安装在第一个分区中。因此通过 /home 和 /usr 这样的目录,将三个分区连结在一起,成为一个完整的文件系统。
因此在 Linux 中,各个分区不是通过驱动器盘符来组成一个完整的文件系统,而是通过类似上例中的 /home、/usr 这样的目录来把各个分区连接在一起。我们称 /home 和 /usr 这样的目录为挂装点。
存在磁盘中的文件,系统都分配给它一个号码,称为该文件的索引节点号(inode number)。它实际上是存在盘上的一个数组的入口索引号。数组的每个元素是一个索引节点,它保存了一个文件的管理信息,其中包括文件的建立时间,文件的所属关系,文件保存在磁盘中的位置等。正是这个文件索引节点号和文件名同时保存在目录中。所以,从本质上讲,目录只是将文件的名称和它的索引节点号结合在一起的一张表,目录中每一对文件名称和索引节点号称为是一个连接。因此同一个索引节点号可以出现在一个以上的连接中。也既是单个文件允许有多个有效路径名。这样做的好处是可以在不同的目录结构下,通过不同的路径访问同一个文件,而这个文件在磁盘中只有一个拷贝,节省了硬盘空间。同时,要删除一个文件或者目录,只有在同一个索引节点属于唯一一个连接时,才能成功。因此可以防止不必要的误删除。
从上述概念中可以看出来,在一个文件系统中,索引节点号是唯一的,但是在不同的文件系统中又如何呢?如果要在不同的文件系统之间建立连接的话,就不能使用共享索引节点的方法。此时需要用 ln -s 来建立两者之间的符号连接。符号连接是 Linux 特殊文件类型的一种。事实上,它是一个文本文件,其中包含它提供连接的另一个文件的路径名。请注意,符号连接不但能应用于不同的文件系统之间,也可以应用于同一文件系统之内,而索引节点的连接只能用于同一文件系统之内。
对操纵索引节点连接的 ln 和 mv 命令介绍。
索引节点、硬连接和连接计数
索引节点inode:
QUOTE:
Linux为每个文件分配一个称为索引节点的号码inode,可以将inode简单理解成一个指针,它永远指向本文件的具体存储位置。系统是通过索引节点(而不是文件名)来定位每一个文件。
例如:
假设我们在硬盘当前目录下建立了一个名为mytext文本文件,其内容只有一行:
CODE:
[Copy to clipboard]
This is my file.
CODE:
[Copy to clipboard]
1、当然这行文字一定是存储在磁盘数据区某个具体位置里(物理上要通过磁头号、柱面号和扇区号来描述,在本例中假设分别是1、20、30)。
2、假设其inode是262457,那么系统通过一段标准程序,就能将这个inode转换成存放此文件的具体物理地址(1磁头、20柱面、30扇区),最终读出文件的内容:“This is my file.”
3、所以inode是指向一个文件数据区的指针号码,一个inode对应着系统中唯一的一片物理数据区,而位于两个不同物理数据区的文件必定分别对应着两个不同的inode号码。
文件拷贝命令与硬链接的区别:
CODE:
[Copy to clipboard]
# cp /home/zyd/mytext newfile
在当前工作目录建立了一个新文件newfile,其实际操作主要包括如下三步:
QUOTE:
1、在当前目录中增加一个目录项,其文件名域填入newfile,并分配了一个新的inode,假设是262456。
2、将原文件(在1磁头、20柱面、30扇区)的内容复制了一份到新的空闲物理块(假设是1磁头、20柱面、31扇区)。
3、填写一些其他关键信息,使系统通过这些信息及inode号码可以完成物理地址的转换。
所以文件复制要分配新的inode和新的数据区,虽然两个文件的内容是一样的。
硬连接hardlink:
QUOTE:
我们实际使用文件时一般是通过文件名来引用的。通过上面的讨论,我们知道:
1个inode号码肯定和一片完全属于一个文件的数据区一一对应。那么一个文件系统中两个或更多个不同的文件名能否对应同一个文件呢?答案是肯定的。
我们知道inode号码是记录在文件名对应的目录项中的,我们可以使两个或多个文件的目录项具有相同的inode值,实际上就使它们对应着同一个文件。
有几个目录项具有相同的inode号,我们就说这个文件有几个硬连接(hardlink),
对于普通文件,ls -l命令的连接计数count域的数值就是本文件拥有的硬连接数。硬连接可以通过ln命令建立,
例如:
CODE:
[Copy to clipboard]
# ln /home/zyd/mytext hardlink_mytext
就建立了一个新的文件hardlink_mytext,这个文件的inode同样是262457。建立硬连接实际上只是增加了一个目录项,但并复制文件数据区,原文件的数据区由两个文件共享。这一方面能够节约大量磁盘空间,同时可以保证两个文件能同步更新。
CODE:
[Copy to clipboard]
'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
连接计数count:
前面我们介绍了,文件的连接计数域表明本系统中共有几个文件目录项的inode和本文件相同,也就是本文件共有几个硬连接。如上面的例子中hardlink_mytext和mytext文件的count值都是2。
那么对于目录,其count域的含义是什么呢?目录的count同样表示共有多少个目录项指向此目录,不过要详细说明必须进一步解释VFS文件系统的结构,为简单起见,只要这样理解就行了:(count-2)等于本目录包含的直接子目录数(就是只包括儿子,不包括孙子啦!)。
CODE:
[Copy to clipboard]
例如:如果一个目录/abc的count域为5,那么/abc目录一定包含3个子目录。
QUOTE:
进一步说明:
硬连接文件实际上并不是一种新的文件类型,两个文件互为对方的硬连接。它们应该都是普通文件(谁能告诉我:其它类型的文件可以硬连接吗?)。两个文件除了名称或/和文件目录不同外,其它部分完全相同,更改了一个文件,另一个的文件长度、内容、更改时间等都将相应发生变化,更改了一个文件的权限位mode,另一个也会发生同样的变化。
QUOTE:
注意连接计数字段count,互为硬连接的两个文件的count值都是2,表明有两个inode指向同一文件的inode。
当我们删除其中一个文件时,系统首先将(count-1)->;count,如果结果是零,就将其目录项和数据区都删除,否则只将本目录项删除,数据区仍然保留,仍然可以通过另外的文件名访问。根据这个特性,可以通过为重要的文件建立硬连接的方法来防止其被误删除。
一个文件系统允许的inode节点数是有限的,如果文件数量太多,即使每个文件都是0字节的空文件,系统最终也会因为节点空间耗尽而不能再创建文件。所以当发现不能建立文件时首先要考虑硬盘数据区是否还有空间(可通过du命令),其次还得检查节点空间。
QUOTE:
互为硬连接的多个文件必须位于同一个文件系统上。根设备及任何一个需要mount才能挂接进来的分区、软盘、NFS、光驱等都是一个独立的文件系统,每个文件系统有一个相应的设备号,不同文件系统中具有相同inode节 点的文件间没有任何联系。系统则通过设备号和inode号的组合唯一确定一个文件。
Linux之所以能支持多种文件系统,其实是由于Linux提供了一个虚拟文件系统VFS,VFS作为实际文件系统的上层软件,掩盖了实际文件系统底层的具体结构差异,为系统访问位于不同文件系统的文件提供了一个统一的接 口。
实际上许多文件系统并不具备inode结构,其目录结构也和以上的讨论不同,但通过VFS,系统均为其提供了虚拟一致的inode和目录项结构。
所以,'ls -il'命令实际显示的inode应该是VFS inode,也就是说,inode是存在于内存中的数据结构,而不一定是实际的硬盘结构。
但为Linux量身定做的ext2文件系统具备实际的inode和连接型目录项结构,所以,对于ext2文件系统,可以认为我们上面讨论的关于硬连接的概念是完全正确的。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
索引节点、硬连接与符号连接
Linux中链接分为哪两种?
linux 软连接和硬链接的区别
从文件 I/O 看 Linux 的虚拟文件系统
linux文件系统基础知识
如何实现一个文件系统
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服