1. inode和block概述

在每个Linux存储设备或存储设备的分区被格式化(ext3,ext4等)之后,一般都有两部分:一部分是inode,另一部分是block。block是用来存储实际数据的,而inode用来存储这些数据的属性信息,包括文件的大小、属主、归属的用户组、读写权限、文件类型、修改时间,还包含指向文件实体的指针功能(inode节点到block的对应关系)等,但并不包含文件名。文件名一般被存储在其所在目录的block里面。

inode除了记录文件属性信息外,还会为每个文件进行信息索引,因此就有了inode的数值,用ls -li命令可以看到输出信息的第一列就是每个文件的索引数值:


[root@Howden ~]# ls -li
total 64
    26 -rw-r--r--. 1 root root   585 Feb 20 23:29 70-persistent-net.rules
147011 -rw-------. 1 root root  1206 Oct 17 13:46 anaconda-ks.cfg
151004 -rw-r--r--  1 root root   137 Oct 17 14:02 ifcfg-eth0.ori
130308 -rw-r--r--. 1 root root 30148 Oct 17 13:46 install.log
130309 -rw-r--r--. 1 root root  7119 Oct 17 13:45 install.log.syslog
157559 -rw-r--r--  1 root root   823 Feb 25 19:49 optimise_sysctl
157552 -rw-r--r--  1 root root  1150 Nov 23  2013 sysctl.conf.ori


2. 访问文件的简单流程
当一个用户在Linux系统中试图访问一个文件时,系统会先根据文件名去查找它的inode,看该用户是否具有访问这个文件的权限。如果有,就指向相对应的文件数据block;如果没有权限,就返回Permission denied。


3. inode的大小
由于inode要存放文件的属性信息,所以它也是有大小的。inode的默认大小在CentOS 5.x系统中是128字节,而在CentOS 6.x中是256字节。inode的大小在创建存储设备文件系统时是可以指定的,而在格式化之后就不能更改了。不过一般工作环境中不会有这个需求。可以用dumpe2fs命令来查看当前系统中的inode大小:

[root@Howden ~]# dumpe2fs /dev/sda3 | grep -i "inode size"
dumpe2fs 1.41.12 (17-May-2010)
Inode size:              256
[root@Howden ~]# dumpe2fs /dev/sda1 | grep -i "inode size"
dumpe2fs 1.41.12 (17-May-2010)
Inode size:              128
[root@Howden ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       9.2G  5.0G  3.7G  58% /
tmpfs           242M     0  242M   0% /dev/shm
/dev/sda1       194M   29M  155M  16% /boot


我的系统是CentOS 6.5,可以看出,/boot分区的默认inode大小仍然是128,而根分区(常规分区)是256。

4. block的大小

在ext3或者ext4文件系统中,block的大小一般是1k,2k或者4k。在我的CentOS 6.5系统中,引导分区的block大小是1k,常规分区是4k:

[root@Howden ~]# dumpe2fs /dev/sda1 | grep -i "block size"
dumpe2fs 1.41.12 (17-May-2010)
Block size:               1024
[root@Howden ~]# dumpe2fs /dev/sda3 | grep -i "block size"
dumpe2fs 1.41.12 (17-May-2010)
Block size:               4096


5. inode和block的数量
如果想查看磁盘中inode的数量和使用情况,可以用df -i命令:

[root@Howden ~]# df -i
Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/sda3      610800 110679 500121   19% /
tmpfs           61778      1  61777    1% /dev/shm
/dev/sda1       51200     38  51162    1% /boot


也可以用dumpe2fs命令查看某个分区中inode和block的总量:

[root@Howden ~]# dumpe2fs /dev/sda3 | grep -i "inode count"
dumpe2fs 1.41.12 (17-May-2010)
Inode count:              610800
[root@Howden ~]# dumpe2fs /dev/sda3 | grep -i "block count"
dumpe2fs 1.41.12 (17-May-2010)
Block count:              2438912
Reserved block count:     121945


6. 文件、inode和block之间的对应关系

磁盘读取文件数据是以block为单位读取的。一个文件无论多大都必须占用一个inode和至少一个block,一个block只能被一个文件使用,而一个inode可以被多个文件占用(硬链接)。


7. block大小的选择

由于一个block只能被一个文件使用,因此block并非越大越好。block越大,对于小文件(1k以下或者至少是4k以下)非常多的应用会十分浪费空间,但是对于大文件较多的应用,如视频等多媒体文件的读取,可以提升读取的效率,因为block越大,同样大小的文件需要读取的block数量就会越少,从而减少磁盘IO消耗。而如果block太小,就会降低磁盘读取大文件的效率,因为需要读更多数量的block。实际上,对于ext3/ext4文件系统,block的大小只有三种选择:1k、2k、4k。


8. 如何改变inode和block的大小

只能在格式化的时候改变inode和block的大小,具体命令如下(以ext4文件系统为例):

[root@Howden ~]# mkfs.ext4 -b 2048 -I 2048 /dev/sda2