Linux文件系统之inode与软硬连接

一、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结构图:

294d1cfb39cd1b06.png

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/14363.html