Inode的结构图

https://www.cnblogs.com/xiexj/p/7214502.html

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

  • 文件的字节数
  • 文件拥有者的User ID
  • 文件的Group ID
  • 文件的读、写、执行权限
  • 文件的时间戳 access time(atime): 访问时间,当文件被读取时才更新 modify time(mtime): 数据修改时间,当文件的数据被修改时才更新 change time(ctime): 元数据修改时间,当文件的元数据(权限,大小,owner,group,mtime等)更新时则更新 ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
  • 链接数,即有多少文件名指向这个inode
  • 文件数据block的位置 可以用stat命令,查看某个文件的inode信息:

文件储存方式 文件在磁盘上分两部分存储,即文件元信息、 文件数据 硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。

操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个扇区( sector)组成一个 block。

操作系统格式化硬盘的时候,自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。

二、inode 大小 文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,储存文件元信息的区域就叫做inode,中文译名为"索引节点"。 每一个文件都有对应的inode,里面包含了与该文件有关的一些信息

总之,除了文件名以外的所有文件信息,都存在inode之中。至于为什么没有文件名,下文会有详细解释。 每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。 假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。 查看每个硬盘分区的inode总数和已经使用的数量,可以使用df命令。 df -i 查看每个inode节点的大小,可以用如下命令: sudo dumpe2fs -h /dev/hda | grep "Inode size" 由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。这时,就无法在硬盘上创建新文件。

三、inode号 每个inode都有一个号,操作系统用inode号来识别不同的文件。 这里值得重复一遍,Unix/linux系统内部不使用文件名,而使用inode号来识别文件。对于系统来说,文件名只是inode号便于识别的别称或者绰号。 表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号;其次,通过inode号,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据 使用ls -i命令,可以看到文件名对应的inode号: ls -i example.txt 四、目录文件 Unix/Linux系统中,目录(directory)也是一种文件。打开目录,实际上就是打开目录文件。 目录文件的结构非常简单,就是一系列目录项(dirent)的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码 ls命令只列出目录文件中的所有文件名: ls /etc ls -i命令列出整个目录文件,即文件名和inode号码: ls -i /etc 如果要查看文件的详细信息,就必须根据inode号码,访问inode节点,读取信息。ls -l命令列出文件的详细信息。 ls -l /etc 理解了上面这些知识,就能理解目录的权限。目录文件的读权限(r)和写权限(w),都是针对目录文件本身(即不同用户能以什么权限访问操作对该目录文件,例如这里不同用户对tmp目录文件(d可以查出tmp是目录文件,d表示directory,即目录)分别为rwxr-xr-x,第一组的三个字符,即rwx,表示文件拥有者用户的对该文件的读写权限,第二组的三个字符,即r-x,表示文件拥有者用户所在的用户组里的其他用户对该文件的读写权限,第三组的三个字符,即r-x,表示文件拥有者用户所在的用户组以外的用户对该文件的读写权限。一个某个用户下运行的进程访问操作该目录文件只能以该用户所具有的对该目录文件的权限进行操作)。由于目录文件内只有文件名和inode号码,所以如果只有读权限,只能获取文件名,无法获取其他信息