理解linux inode

理解linux inode

linux中文件存储在磁盘上,文件内容划分为2部分进行存储:文件元数据文件内容数据

文件元数据 储存在 inode table 中,文件内容数据储存在磁盘的另一部分连续区域中。

文件系统

文件系统创建(格式化)时,就把存储区域分为2个连续的储存区域。一个是 inode table, 一个是 blocks(暂且这么命名吧)

  1. inode table 是由 inode 组成的表,每一个 inode 对应一个文件系统中的文件或目录。

    • 每个 inode 默认大小是128字节(1KB)或256字节(2KB)。
    • inode 的个数在磁盘格式化时便已给定。在文件系统的典型实现中,所有inode占文件系统储存的1%左右。
  2. blocks:是磁盘的另一端连续的空间,用于存储文件的内容。

    • 操作系统在读取磁盘时,通常是一次性读取一个"块"(block)。
    • 一个"块"通常是4k大小,由8个扇区组成,每个扇区大小为512字节。
      image.png

inode分配完了怎么办?

由于文件系统中每个 文件数据对象 都必须要有一个 inode ,因此当 inode table 用光后,即使磁盘未满也无法在磁盘上创建文件了。

"目录文件" 概念

实际上在文件系统中,file和dir都属于一种“目录文件”。

  • “目录文件”的结构是一个“目录项”列表。
  • 每个“目录项”由2部分组成:file/dir的名称 + file/dir的inode
  • 所以创建一个“目录文件”时,实际做了3件事:在其“父目录文件”中增加一个条目;分配一个inode;再分配一个存储块,用来保存当前被创建目录包含的文件与子目录。

文件系统创建一个 file 时做了哪些动作?

文件系统创建一个file时:

  • 在其“父目录文件”的列表中增加一个“目录项”
  • “目录项”的inode类别为“文件”

文件系统创建一个 dir 时做了哪些动作?

文件系统创建一个dir时:

  • 在其“父目录文件”的列表中增加一个“目录项”
  • “目录项”的inode类别为“目录”

文件系统 通过文件名打开文件 时做了哪些动作?

  • 首先,操作系统找到这个文件名对应的inode号码
  • 其次,通过inode号码,获取inode信息
  • 最后,根据inode信息,找到文件数据所在的block,读出数据

inode细节

inode 储存了 文件数据对象 的元数据,包括:所有者、访问权限(读、写、执行)、类型(是文件还是目录)、内容修改时间、inode修改时间、上次访问时间、对应的文件系统存储块的地址,等等。

当已知 文件数据对象inode,操作系统便能通过 inode 里面的元数据查出 文件内容数据 的存储地址。

操作系统实际上并不关心 文件数据对象 的文件名与目录名,一个 文件数据对象 可以有多个别名,操作系统允许通过 硬链接 和 软链接 的方式为 文件数据对象 创建别名。

# 硬链接
ln <source_file> <target_file>
# 指向的是 目标文件的inode

# 软链接
ln -s <src_file/src_dir> <target_file/target_dir>
# 指向的是 目标文件的文件名
参考

wikipedia
理解inode

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容