漫游计算机之理解inode

1,264 阅读4分钟

文章内容绝大部分阮一峰理解inode。感谢大佬的笔记,摘抄过来加深记忆。

inode是什么?

要理解inode,我们首先来看看文件是如何存储的。

我们知道,文件是存储在磁盘上的。磁盘的最小存储单元是“扇区(Sector)”。每个扇区大小为512字节。

操作系统读取磁盘时,为了提高效率会一次性连续地读取多个扇区,即一次性读取一个“块(block)”。这种由多个扇区组成的“块”,是文件存取的最小单位。一般“块”的大小为4K,即连续8个扇区组成一个块。

文件数据都存储在“块”中,文件的元信息例如文件的创建者,文件的创建日期,文件的读写权限等就存储在inode中。所以,inode(索引节点,i=index)是用来存储文件元信息的一种数据结构,每个文件对应一个inode,一个目录也对应一个inode。


inode内容有什么?

inode包含的是文件的元信息,具体内容有这些:

  1. 文件的读写权限
  2. 文件的拥有者User id
  3. 文件所属组Group id
  4. 文件的时间戳,共有三个:atime指最近一次访问文件的时间,ctime表示最近一次更改inode的时间,mtime表示最近一次更改文件内容的时间
  5. 文件占用块数
  6. 文件的字节数
  7. 文件数据block位置指针
  8. 文件版本
  9. 文件链接数
  10. 等等......

除了文件名以外,所有的文件信息都存在inode中。

使用stat filename可以查看某个filename文件的inode信息。

image


inode大小

inode也会消耗磁盘空间,所有磁盘在格式化时,操作系统自动将磁盘分为两个区域。一个数据区,存放文件数据;另一个是inode区,存放inode所包含的信息。每个inode节点的大小大概128字节或256字节。innode的总数在格式化就给定了,一般是每1KB或2KB就设置一个inode。 因此磁盘上是一系列的inode和一系列的块排列起来。

由于每个文件对应一个inode,当inode用光但磁盘还未满的情况下,是无法创建新文件的。


inode号码

每个inode都有一个号码,操作系统用inode号码来识别不同的文件。

注意,Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别名。

表面上,用户通过文件名打开文件。实际上,系统内部,这个过程分三步:首先,系统找到这个文件名对应的inode,然后通过inode获得inode信息,最后根据inode信息找到block位置,读出数据。

使用 ls -i filename 能获得文件的inode号码。

目录文件

目录也是一种文件,打开目录,实际上是打开目录文件(实际上Linux一切皆文件)。

目录文件的结构非常简单,就是一系列目录项的列表。每个目录项,由两部分组成:所包含的文件的文件名,以及该文件名对应的inode号码。

目录文件的读写权限,都是针对目录文件本身。如果只读,则只能获取到文件名。因为文件的其他信息都存在inode中,而读取inode节点内的信息需要目录文件有执行权限(x)。


硬链接 and 软链接

一般情况下,文件名和inode号码一一对应。但是Unix/Linux系统允许多个文件名指向同一个inode号码。

这意味着,可以用不同的文件名访问同样的内容。对文件内容的修改,会影响到所有文件名。但是删除一个文件名,不影响另一个文件名的访问。这种情况就叫做硬链接(Hard link)。

ln命令可以创建硬链接: ln 源文件 目标文件

inode中有一项用来记录链接数,记录指向该inode的文件总数。创建一个硬链接到该文件时,链接数+1,删除一个文件名时链接数-1。 当链接数为0时,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及对应的磁盘区域。

注意,目录文件的硬链接数总是等于2加上它的子目录总数(由于.,..两个默认的目录项)。

另外还有一种情况,文件A和文件B的inode虽然不一样,但是文件A的内容是文件B的位置信息。读取文件A时,系统会根据该位置信息自动将访问者导向文件B。因此无论打开那个文件,最终读取的都是文件B。这是,文件A就称为文件B的“软链接”(Soft link)或者“符号链接”。

这意味着,文件A依赖于文件B的存在,如果删除了文件B,打开文件A就会报错“No Such file or directory”。

添加-s选项创建软链接:ln -s 源文件或目录 目标文件或目录