Linux 文件系统 inode 简介

271 阅读3分钟

这是我参与8月更文挑战的第16天,活动详情查看:8月更文挑战

当在磁盘、分区或者卷上创建文件系统(格式化)之后,就会被划分为两个部分:

  • 元数据 metadata:也叫 inode,用来存储 block 数据的信息,包括:
    • inode 编号
    • 文件的 ownerowner group
    • 访问许可 readwriteexecute
    • 类型 type
    • 创建时间 ctime、最近一次的读取时间 atime、最近修改的时间 mtime
    • 文件大小
    • 定义文件特性的标记位 flag,如 SetUID
    • 文件真正内容的指针 pointer
  • 数据块 data block:用来存储数据

inode 有两个功能:记录档案属性和指针。操作系统通过 inode 值可以快速地找到文件所对应的数据块。

inode 里面没有文件对象的名称。

inode 表包括:

  • 文件对象的 inode 编号
  • 除了文件名以外的所有文件信息
  • 指向数据块区域的指针

一个文件系统中,inode 表中可以保存的记录总数是固定的。如果表用完了,即使数据区域中还有空闲空间,也不能创建文件。

inode 位图:

  • 以二进制的方式记录 inode 表中哪条记录是空闲的

block 位图:

  • 以二进制的方式记录 block 区域哪块是空闲的

block 区域中:

  • 如果是文件,将占用一个或多个块
  • 对于目录来说,其实是一种特殊的文件,它在块中保存该目录中文件的名称,以及子目录的名称,还有它们对应的 inode 编号。

所以一个文件对象的名称不是保存在 inode 区域中,而是保存在该文件对象的父文件夹的个 block 块中。

目录是一种特殊的文件,虽然在图形界面中它像一个文件夹,但是在文件系统中,它不是一个容器,可以把它理解成路径的映射表。

创建文件的流程:

  • 查找 inode 位图,寻找一个空闲的编号,比如 16777349,将其标记为占用
  • 查找 /etc/ 目录,在数据块中创建新文件名,以及刚才分配的 inode 编号 16777349
  • 下面开始写数据,查看 block 位图,分配空闲的块给文件
  • block 区域写入文件的实际数据
  • inode 区域创建新文件对象的 inode 信息

虽然文件的创建流程是分好几步的,但是它是一个具备原子性的事务,要么全部成功,要么全部失败。

删除文件的流程:

  • 找到文件所处文件夹的块区域,删除文件名以及 inode
  • 删除 inode 区域中待删除文件的 inode
  • inode 位图和 block 位图标记为空闲

rm 这种删除操作,实际上不会操作文件 block 区域的数据,以后在创建其他文件时,才会覆盖标记为空闲的块。所以可以通过 block 区域中的数据实现文件回复。文件粉碎也是使用随机 01 数据,或者全 01 的数据,来覆盖原始文件数据块,使文件难以恢复。