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资源重新释放出来了
- 可以正常创建文件了