inode的基本理解
首先,让我们对于文件存储有一个基本概念,这对下面的理解有帮助。
一、文件存储
文件存在硬盘上,硬盘的最小存储区叫做“扇区”,每个扇区存储512个字节(0.5KB),在操作系统读取硬盘时,不会一个扇区一个扇区得去读取,效率太低,系统会一次性连续读取多个扇区,即一次性读取一个块(block),这种由多个扇区组成的“块”,是文件读取的最小单位,而“块”的大小,最常见的是4KB,即8个连续的扇区组成的“块”。
文件数据存储在“块”中,而很显然,我们需要找到一个地方来存储文件“元信息”
例:文件创建者,文件创建日期,文件大小等,这种存储文件元信息的区域就叫做inode,他的中文名字叫做:索引节点,每个文件都有他自己对应的inode,里面包含了该文件的一些信息
二、inode 内容
inode包含文件的“元信息”
Size 文件字节数
Links 链接数,即有多少个文件指向该文件
Uid 文件拥有者的User ID
Inode 文件数据block的位置
Gid 文件的Group ID
Blocks 块数
IO Blocks 块的大小
Device 设备号码
Access 文件的读,写,执行权限
文件的三个时间戳:
change 文件上一次的变动时间
Modify 文件内容上一次变动时间
Access 文件上一次打开时间
要查看某个文件的inode信息,可以使用stat命令,
格式:stat 文件名
除了文件名以外的所有关于文件的信息,都存在inode中
三、inode的大小
inode也会消耗磁盘空间,所以当磁盘进行格式化时,操作系统将自动把硬盘分为两个区域,一个数据区,存放文件数据,另一个是inode区,存放inode所包含的信息。
每个inode节点大小,一般是128/256字节。inode节点的总数,在格式化的时候就已经给定了。
一般1KB/2KB设置成一个inode。
假定在一块1GB的硬盘上,每个inod节点的大小是128字节,每1KB设置一个inode,那么inode table的大小达到了128MB,这占据了整个硬盘的12.8%
要查看每个硬盘分区的inode总数与已经使用的数量,可以用df命令
要查看每个inode的大小,可以使用如下命令;
sudo dumpe2fs -h 文件名
由于每个文件必须有1个inode,因此有可能发生inode 已用完,但是硬盘还没有存满的情况,此时,无法在硬盘上创建新文件
四、inode号码
每个inode都有一个号码,操作系统用inode号码来识别不同的文件
注意:Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件,对于系统来说,文件名只是inode号码便于识别的别称。
表面上,用户通过文件名打开文件
实际上,在Linux系统中分为三步:
首先,系统找到这个文件名对应的inode号码
之后,通过inode号码,获取inode信息
最后,根据inode信息,找到文件数据所在的block,读出数据。
使用如下命令可以看到文件名对应的inode号码
五、目录文件
Linux/Unix系统中,目录也是一种文件,打开目录,实际上是打开目录文件,目录文件的结构非常简单,是一系列目录项(direct)的列表。每个目录项有两部分组成:所包含文件的文件名,以及该文件名对应的inode号码。
ls 命令只列出目录文件的所有文件名,而ls -i命令可以列出整个目录文件,即文件名以及inode号码。
要想查看文件的详细信息,必须根据inode号码来访问inode节点信息。
目录文件的读权限(r)和写权限(w)都是针对目录本身。
由于目录文件内只有文件名和inode号码,如果只有读权限,那么只能看到文件名,无法获取其他信息。
因为其他信息都存在inode节点上,而读取inode节点内部信息需要目录文件的执行权限(x)