inode是啥玩意:

当第一次使用磁盘,把磁盘分区并格式化的时候,整个分区会被划分为两个部分:

即inode区和data block(实际数据块)

这个inode即是(目录、档案)文件在一个文件系统中的唯一标识,需要访问这个文件的时候必须先找到并读取这个文件的 inode。 

Inode 里面存储了文件的很多重要参数,其中唯一标识称作 Inumber,

其他信息还有创建时间(ctime)、修改时间(mtime) 、

文件大小、属主、归属的用户组、读写权限、数据所在block号等信息,

具体来看可以分为:

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

  * 文件的字节数

  * 文件拥有者的User ID

  * 文件的Group ID

  * 文件的读、写、执行权限

  * 文件的时间戳,共有三个:ctime指inode上一次变动的时间(c=),mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。

  * 链接数,即有多少文件名指向这个inode

  * 文件数据block的位置

(扩展:atime mtime ctime 含义

文件的 Access time,atime 是在读取文件或者执行文件时更改的。
文件的 Modified time,mtime 是在写入文件时随文件内容的更改而更改的。
文件的 Create time,ctime 是在写入文件、更改所有者、权限或链接设置时随 Inode 的内容更改而更改的。 

   文件系统一开始就将inode与block规划好了,除非重新格式化,否则inode和block固定后就不会在发生变化。

每个inode与block都与自己的编号,inode就是记录档案的属性,一个档案占用一个inode,

同时记录此档案数据所在的block码。block则是实际记录档案的内容,若档案过大则会占用多个block。

   

   由于每个inode与block都有自己的编号,而每个文件都会占用inode,inode内有数据 block的位置,因此可以制动啊,如果能够找到文件的inode,就可以找到文件所放置数据的block号码,也就能够找到文件的时间数据所在了。所以inode就有指针的作用,而在inode结构中,并不是只有一种指针,而是有多种。

   在inode表中将第1 - 12块指针当作直接块指针,由于一个指针只能指向一个block块,所以如一个block块有4K的存储空间,那么使用直接块指针的文件最大不能超过48K,这时就需要用到间接块指针,或双重间接块指针,或三重间接块指针。

直接块指针

直接块指针就是inode中直接记录了block块的号码,直接指向block块,

假如一个文件的属性与权限数据放置在inode4号,而这个inode记录了档案数据的实际位置放置点位2,7,13,15这四个block号码,此时操作系统可以据此来排列磁盘的阅读顺序,可以直接将四个block的内容读出来,数据的读取如下图所示

间接块指针

间接块指针,其实和直接块指针大同小异,他们都是指针,只是直接块指针式直接指向的block块存储的是文件的数据,而间接块指针是将指向的block块继续当作指针块使用,所以间接指针指向的block块存储的是指针信息,它将继续指向下一个block块中存储的文件数据。

双重间接块指针

理解了间接指针块,那么双重间接指针块就容易理解了,它是在间接指针块的基础上将第二次指向的block块也当作指针使用,这样就可以指向更的的block块。

三重间接块指针

三重间接块指针的道理就和双重的道理一样了,只是把第三次指向的block块也当作指针块当作指针使用,这样就可以执行跟过的block块。

前面已经提到使用直接块指针的文件最大不能超过48K,假定一个指针块需要4个字节,一个block块有4K的存储空间,那么一个block块就可以存储1024个指针块,所以间接块指针的文件最大就可以存储1024*4K=4M的文件,以此类推使用双重间接块指针的文件最大存储空间就有1024*1024*4K=4G,使用三重间接块指针的文件最大存储空间就可以达到1024*1024*1024*4K=4T。

inode表结构如图所示:

spacer.gif

    总的来说,文件就有两部份组成:

    1、元数据:inode table(索引节点表)

    2、数据内容:数据块(block)

目录文件:    

  普通文件是由indoe+block构成,

在linux下目录也是一种文件,那么目录文件又是什么结构呢,

目录文件的结构非常简单,就是一系列目录项(dirent)的列表。每个目录项,由两部分组成:

1,所包含文件的文件名,

2,以及该文件名对应的inode号码。

通过目录项找到目录下文件的inode信息,然后就可以找到文件的block块及数据信息

如图所示:

spacer.gif

在文件系统中用户可以使用df命令查看每个磁盘分区的inode总数和已使用的数量,

命令:df -i

spacer.gif

我们可能遇到一种情况:

虽然磁盘显示仍有可用空间,但使用时却提示空间不足:

 产生这个问题,可能就是因为inode也占用一定的磁盘空间,但此时inode用完的所有inode空间, 那么即使磁盘仍有存储空间也无法使用!