inode

inode (index node)是指在许多“类Unix文档系统”中的一种数据结构,用于描述文档系统对象(包括文档目录设备文档socket管道等)。每个inode保存了文档系统对象数据的属性和磁盘块位置[1]文档系统对象属性包含了各种元数据(如:最后修改时间[2]) ,也包含用户组(owner)和权限数据[3]

命名

Unix先驱丹尼斯·里奇[4],inode这个命名的来源可能是文档系统的存储组织为一个扁平数组,分层目录信息使用一个数作为文档系统这个扁平数组的索引值(index)。

细节

Unix上的文档描述符、文档表与inode表 [5]

文档系统创建(格式化)时,就把存储区域分为两大连续的存储区域。一个用来保存文档系统对象的元信息数据,这是由inode组成的表,每个inode默认是256字节或者128字节。另一个用来保存“文档系统对象”的内容数据,划分为512字节的扇区,以及由8个扇区组成的4K字节的块。块是读写时的基本单位。一个文档系统的inode的总数一般情况下是固定的。这限制了该文档系统所能存储的文档系统对象的总数目。典型的实现下,所有inode占用了文档系统1%左右的存储容量。

文档系统中每个“文档系统对象”对应一个“inode”数据,并用一个整数值来辨识。这个整数常被称为inode号码(“i-number”或“inode number”)。由于文档系统的inode表的存储位置、总条目数量都是固定的,因此可以用inode号码去索引查找inode表。

Inode存储了文档系统对象的一些元信息,如所有者、访问权限(读、写、执行)、类型(是文档还是目录)、内容修改时间、inode修改时间、上次访问时间、对应的文档系统存储块的地址,等等。知道了1个文档的inode号码,就可以在inode元数据中查出文档内容数据的存储地址。

文档名与目录名是“文档系统对象”便于使用的别名。一个文档系统对象可以有多个别名,但只能有一个inode,并用这个inode来索引文档系统对象的存储位置。

  • inode不包含文档名或目录名的字符串,只包含文档或目录的“元信息”。
  • Unix的文档系统的目录也是一种文档。打开目录,实际上就是读取“目录文档”。目录文档的结构是一系列目录项(dirent)的列表。每个目录项,由两部分组成:所包含文档或目录的名字,以及该文档或目录名对应的inode号码。
  • 文档系统中的一个文档是指存放在其所属目录的“目录文档”中的一个目录项,其所对应的inode的类别为“文档”;文档系统中的一个目录是指存放在其“父目录文档”中的一个目录项,其所对应的inode的类别为“目录”。可见,多个“文档”可以对应同一个inode;多个“目录”可以对应同一个inode。
  • 文档系统中如果两个文档或者两个目录具有相同的inode号码,那么就称它们是“硬链接”关系。实际上都是这个inode的别名。换句话说,一个inode对应的所有文档(或目录)中的每一个,都对应着文档系统某个“目录文档”中唯一的一个目录项。
  • 创建一个目录时,实际做了3件事:在其“父目录文档”中增加一个条目;分配一个inode;再分配一个存储块,用来保存当前被创建目录包含的文档与子目录。被创建的“目录文档”中自动生成两个子目录的条目,名称分别是:“.”和“..”。前者与该目录具有相同的inode号码,因此是该目录的一个“硬链接”。后者的inode号码就是该目录的父目录的inode号码。所以,任何一个目录的"硬链接"总数,总是等于它的子目录总数(含隐藏目录)加2。即每个“子目录文档”中的“..”条目,加上它自身的“目录文档”中的“.”条目,再加上“父目录文档”中的对应该目录的条目。
  • 通过文档名打开文档,实际上是分成三步实现:首先,操作系统找到这个文档名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文档数据所在的block,读出数据。

Linux系统使用struct inode作为数据结构名称。BSD派生的系统,使用vnode名称,其中v表示“virtual file system”。

POSIX inode

POSIX 标准强制规范的文档系统的行为受到传统 UNIX 文档系统的深刻影响。可以用短语“文档串行号”来形容inode,定义为文档系统范围的唯一文档标识符。[6]上述的文档串行号和包含此文档的设备ID一起,在整个系统上对应唯一的文档。[7]

在POSIX系统上,可使用stat系统调用取得文档的下列属性:[7]

  • 字节为单位表示的文档大小。
  • 设备ID,标识容纳该文档的设备。
  • 文档所有者的User ID。
  • 文档的Group ID
  • 文档的模式(mode),确定了文档的类型,以及它的所有者、它的group、其它用户访问此文档的权限。
  • 额外的系统与用户标志(flag),用来保护该文档。
  • 3个时间戳,记录了inode自身被修改(ctime, inode change time)、文档内容被修改(mtime, modification time)、最后一次访问(atime, access time)的时间。
  • 1个链接数,表示有多少个硬链接指向此inode。
  • 文档系统存储位置的指针。通常是1K字节或者2K字节的存储容量为基本单位。

可以查询一个文档的inode号码及一些元信息。

推论

  • 一个文档系统对象可以有多个名字,这些具有硬链接关系的文档系统对象名字具有相同的inode号码,彼此是平等的。即首个被创建的文档并没有特殊的地位。这与符号链接不同。一个符号链接文档有自己的inode,符号链接文档的内容是它所指向的文档的名字。因此删除符号链接所指向的文档,将导致这个符号链接文档在访问时报错。
  • 删除一个文档或目录,实际上是把它的inode的链接数减1。这并不影响指向此inode的别的硬链接。
  • 一个inode如果没有硬链接,此时inode的链接数为0,文档系统将回收该inode所指向的存储块,并回收该inode自身。
  • 从一个inode,通常是无法确定是用哪个文档名查到此inode号码的。打开一个文档后,操作系统实际上就抛掉了文档名,只保留了inode号码来访问文档的内容。库函数getcwd()用来查询当前工作目录的绝对路径名。其实现是从当前工作目录的inode逐级查找其上级目录的inode,最后拼出整个绝对路径的名字。
  • 历史上,对目录的硬链接是可能的。这可以使目录结构成为一个有向图,而不是通常的目录树的有向无环图。一个目录甚至可以是自身的父目录。现代文档系统一般禁止这些混淆状态,只有根目录保持了特例:根目录是自身的父目录。这项限制最著名的一个例外可在Mac OS X(10.5或更高版本)上找到:它允许超级用户创建目录的硬链接。[8]
  • 一个文档或目录在文档系统内部移动时,其inode号码不变。文档系统碎片整理可能会改变一个文档的物理存储位置,但其inode号码不变。非UNIX的FAT及其衍生的文档系统是无法实现inode不变这一特点。
  • inode文档系统中安装新库十分容易。当一些进程正在使用一个库时,其它进程可以替换该库文档名字的inode号码指向新创建的inode,随后对该库的访问都被自动引导到新inode所指向的新的库文档的内容。这减少了替换库时重启系统的需要。而旧的inode的链接数已经为0,在使用旧函数库的进程结束后,旧的inode与旧函数库文档会被系统自动回收。
  • 一些文档系统,由于inode表在文档系统创建时就已经确定并且不能再动态增加,添加的文档数量可能会用尽inode。这导致文档系统还有空闲的存储空间,但已经没有空闲的inode可供使用了。例如,一个电子邮件服务器可能会被大量的小文档用尽所有inode,但是却没有填满文档存储空间。部分文档系统,如JFSXFS,能够动态地增加inode,因此不会用尽inode。

实际考虑

系统管理员使用的很多进程往往用inode号码来替代文档名来访问文档系统。例如磁盘完整性检查进程fsckpfiles。因此,inode号码与文档全路径名的互查是需要的。可以用find带参数选项-inumls带参数选项(-i做到。

参考文献

  1. Tanenbaum, Andrew S. 3rd. : 279.
  2. JVSANTEN. . Linux Howtos and FAQs. [2020-01-20]. (原始内容存档于2020-09-21).
  3. . ibm.com. [2020-01-20]. (原始内容存档于2018-10-02).
  4. Linux Kernel list archive 页面存档备份,存于. Retrieved on 2011-01-12.
  5. Bach, Maurice J. . Prentice Hall. 1986: 94. Bibcode:1986duos.book.....B.
  6. . The Open Group. [10 January 2018]. (原始内容存档于2013-04-29).
  7. . The Open Group. [15 January 2018]. (原始内容存档于2022-01-30).
  8. . Stack Overflow. 16 Jan 2011 [5 Jan 2020]. (原始内容存档于5 January 2020).

外部链接

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.