一、inode是什么?
理解inode,要从文件储存说起。
文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。
操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。
文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。
每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。
二、inode的内容inode包含文件的元信息,具体来说有以下内容:
* 文件的字节数 * 文件拥有者的User ID * 文件的Group ID * 文件的读、写、执行权限 * 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。 * 链接数,即有多少文件名指向这个inode * 文件数据block的位置inode结构图:
inode要记录的数据非常多,但偏偏只有128bytes而已,而inode记录一个block号码要花掉4bytes,假设我一个文件有400MB,且每个block为4KB时,那么至少也要10万条block号码的记录。inode哪有那么多可记录的信息?为此,我们的系统聪明的将inode记录block号码的区域定义为12个直接,1个双间接,一个3间接记录区 这样子inode能够指定多少个block呢?我们以较小的1KB的block来说明:
(1) 12个直接指向 12*1K = 12K (2)每条block号码的记录会花去4bytes,因此1K的block大小能够记录256条记录。所以间接地256*1K = 256K (3)双间接 256*256*1K = 256^2K (4)三间接 256*256*256*1K = 256^3K总额:12+256+256*256+256+256+256=16GB 此时我们知道当文件系统将block格式化为1K大小时,能够容纳的最大文件为16GB,比较一下文件系统的限制表的结果可以发现结果是一致的。但是这个方法不能够用在2K及4K的block大小的计算中,因为2K的block将会受到Ext2文件系统本身的限制,所以计算的结果会有不符合 。
可以用stat命令,查看某个文件的inode信息:
[root@localhost ~]# stat anaconda-ks.cfg File: `anaconda-ks.cfg' Size: 1874 Blocks: 8 IO Block: 4096 regular file Device: fd00h/64768d Inode: 131083 Links: 1 Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2016-12-29 16:35:26.562699425 +0800 Modify: 2016-12-26 15:29:45.735999937 +0800 Change: 2016-12-26 15:29:49.750999936 +0800总之,除了文件名以外的所有文件信息,都存在inode之中。至于为什么没有文件名,下文会有详细解释。
三、inode的大小inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。
每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。
查看每个硬盘分区的inode总数和已经使用的数量,可以使用df命令:
[root@localhost ~]# df -i Filesystem Inodes IUsed IFree IUse% Mounted on /dev/mapper/vg0-root 1310720 7556 1303164 1% / tmpfs 125517 1 125516 1% /dev/shm /dev/sda1 51200 38 51162 1% /boot /dev/mapper/vg0-usr 655360 25449 629911 4% /usr /dev/mapper/vg0-var 1310720 1132 1309588 1% /var