Linux之inode号(Linux文件存储、inode相关概念和作用及inode 节点耗尽故障处理的模拟实验)

一、相关概念

1.1 扇区、块

  • 我们都知道Linux系统的文件是存储在硬盘上的,而硬盘的最小存储单位叫做“扇区”(sector) ,每个扇区存储512字节(1K=1024字节,即一个扇区存储0.5K的信息)。
  • 操作系统在读取硬盘的时候,不是一个扇区一个扇区地读取的(这样效率太低),而是一次性连续读取多个扇区,一次性读取一个块,一个块一个块这样来读取的。
  • 一般连续八个扇区组成一个“块”(block),一个块是4K大小(即一次读取八个扇区),“块”(block)是文件的最小存储单位。

1.2 inode

  • inode ,中文译名“索引节点”,也叫“i节点”
  • Linux系统中文件的文件名和文件数据是分开存储的,而文件数据又分为实际数据元信息
  • 元信息类似于文件属性,包括文件的创建者、创建日期、文件大小、文件权限等信息,实际信息存储在块中,而存储文件元信息的区域就叫做inode,因此一个文件必须占用一个 inode, 并且至少占用一个block。
  • inode不包含文件名,文件名是存放在目录当中的。Linux系统中一切皆文件,因此目录也是一种文件。
  • 每个inode都有一个号码(即 inode号),操作系统用 inode号码来识别不同的文件。
    ————Linux内部使用 inode号来识别文件,而非文件名,对于系统来说,文件名是 inode号的别称,是便于用户识别文件的,文件名和 inode号是一一对应的关系,每个 inode号对应一个文件名。

硬盘分区后的结构:
在这里插入图片描述

  • 当用户在Linux系统中试图访问一个文件时,系统会先根据文件名去查找它对应的inode号码;通过inode号码,获取inode信息;根据inode信息,看该用户是否具有访问这个文件的权限;如果有,就指向相对应的数据block,并读取数据;如果没有就会返回。

访问文件的简单流程:
在这里插入图片描述

二、Linux 文件存储

2.1 inode的数量限制

  • inode也会消耗硬盘空间,所以格式化的时候,操作系统自动将硬盘分成两个区域:一个是数据区,存放文件数据;另一个是 inode区,存放 inode 所包含的信息。每个inode 的大小,一般是128 字节或256字节。
  • 通常情况下不需要关注单个inode的大小,而是需要重点关注inode总数,inode的总数在格式化时就已经定好了
    ——为什么需要重点关注inode总数,因为当inode用完时,即便磁盘还有空间也无法创建新文件了,因为在创建文件时需要一个inode号与之对应,而没有inode时自然无法创建新文件。
    执行“ df-i ”命令即可查看每个硬盘分区对应的的inode总数和已经使用的inode数量。
    在这里插入图片描述

2.2 inode 的内容

inode包含文件的元信息,具体有以下的内容:

  • 文件的字节数
  • 文件的拥有者 user ID
  • 文件的group ID
  • 文件的读、写、执行权限
  • 链接数,即有多少文件指向这个inode
  • 文件的时间戳
  • 两种方式查看某个文件的 inode信息
    方法一:stat [文件名]

示例:stat aa.txt
在这里插入图片描述

优点:可以查看文件inode 的详细信息

方法二:ls -i [文件名]

在这里插入图片描述
只能显示 inode号

2.3 Linux系统文件三个主要的时间属性

Linux系统文件三个主要的时间属性(即inode 里的时间戳)

  • ctime(change time)
    指的是最后一次改变文件或目录(属性)的时间
  • atime(access time)
    指的是最后一次访问文件或目录的时间
  • mtime(modify time)
    指的是最后一次修改文件或者目录(内容)的时间

三、inode的特殊作用

由于inode号码与文件名分离,导致一些Unix/Linux系统具有以下的现象:

  • 当文件名包含特殊字符,可能无法正常删除文件,直接删除inode,也可以删除文件
  • 移动或重命名文件时,只改变文件名,不影响inode号码
  • 打开一个文件后,系统通过inode号码来识别该文件,不再考虑文件名
  • 文件数据被修改保存后,会生成一个新的 inode 号码(原先的 inode 号会被释放)

如何通过删除inode号删除文件:
方法一(删除前需确认信息):find ./ -inum [inode号] -exec rm -i {} \ ;

在这里插入图片描述
方法二(直接删除):find ./ -inum [inode号] -delete
在这里插入图片描述

四、inode 节点耗尽故障处理(模拟实验)

  • 首先第一步新建一个磁盘
    在这里插入图片描述

  • 磁盘分区(因为是做实验,磁盘分区设为30M)
    在这里插入图片描述

  • 格式化
    输入:mkfs.ext4 /dev/sdb1
    在这里插入图片描述

  • 创建一个目录用来测试

  • 挂载
    在这里插入图片描述

  • “ df -i ”查看每个硬盘分区对应的的inode总数和已经使用的inode数量

  • 可以看到inode总数只有7680个且已经用了7669个了
    在这里插入图片描述

  • 进/test 目录下,只发现了一个空目录
    在这里插入图片描述

  • 使用for循环创建多个文件:for ((i=1; i<=7680; i++));do touch /test/file$i;done

  • 可以看到从7670后就无法创建文件了

  • 嫌麻烦也可以使用 touch {1…7680}.txt在这里插入图片描述

  • 可以“ ls -a ”看一下
    在这里插入图片描述

  • 再使用“ df -i ”查看一下,发现可以 inode号已经为零了
    在这里插入图片描述

  • “ df -Th ”查看磁盘空间使用情况,发现新建的磁盘虽然还有空间,但因为 inode号耗尽无法创建文件了

在这里插入图片描述
在这里插入图片描述

  • 解决方法也很简单,删除空白文件就行:
    rm -rf file*
    在这里插入图片描述
  • 使用“ df -i ”查看一下,发现 inode资源重新释放出来了
    在这里插入图片描述
  • 可以正常创建文件了
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_51613313/article/details/110533152
今日推荐