一天一点学习Linux之Inode详解

2011年04月05日 Linux基础 评论 32 条 阅读 39,063 views 次

在Linux文件系统中,很多人对Inode都不太明白,今天我就和大家一起来分享一下我对Inode的认识,如果有理解错误的地方,请大家多多批评指点。
在上一篇一天一点学习Linux之认识文件系统中,在最后给出了一张EXT3文件系统结构图,里面已经涉及到了Inode的相关信息——图的左下角部分,今天,我们就专门对这一部分进行一下详解,希望通过今天的内容,能帮助大家更清楚的了解Inode。


先看看Inode的结构图

inode

再来了解一下文件系统如何存取文件的

1、根据文件名,通过Directory里的对应关系,找到文件对应的Inode number
2、再根据Inode number读取到文件的Inode table
3、再根据Inode table中的Pointer读取到相应的Blocks

这里有一个重要的内容,就是Directory,他不是我们通常说的目录,而是一个列表,记录了一个文件/目录名称对应的Inode number。如下图

Directory

Directory:
A directory is a mapping between the human name for the file and the computer's inode number.
所以说,这个Directory不是文件,我们可以看作是文件系统中的一个属性,只是用来关键文件名与Inode number。这个一定要理解好,否则后面关于硬链接的内容,就不容易理解了。

我在一天一点学习Linux之文件与目录权限的基本概念中讲到
第二栏表示的是有多少文件连接到inode
如果是一个文件,此时这一字段表示这个文件所具有的硬链接数,
如果是一个目录,则此字段表示该目录所含子目录的个数。

现在是不是容易理解了?如果你还不是很明白,那么下面我们就再通过实例让大家明白。

我们以RHEL6系统为例

在根目录下创建一个test目录,我们进入此目录,进行操作。
[root@yufei test]# pwd
/test
[root@yufei test]# touch testfile
[root@yufei test]# mkdir testdir
创建实验文件和目录
[root@yufei test]# ls -li
total 4
977 drwxr-xr-x. 2 root root 4096 Apr  5 16:48 testdir
976 -rw-r--r--. 1 root root    0 Apr  5 16:47 testfile
查看到文件与目录的Inode和inode count分别为
977 <-----> 2 <-----> testdir
976 <-----> 1 <-----> testfile

现在目录的链接数为2,文件的链接数为1。为什么会这样呢?其实很好理解。对于目录而言,每个目录里面肯定会有两个特殊目录,那就是.和..这两个目录,我们前面的课程中也讲到,.表示当前的目录,而..则是表示上层目录。我们也知道,在Linux系统中,是从根来开始查找的,要想找到某个目录,必需要先找到他的上层目录,所以说,空目录(严格的来说,不能叫空目录)是有两个链接到相应的Inode number的。作为文件很明显,他只有一个链接到相应的Inode number。也不用多说,

下面我们就来看看这个链接数是如何改变的。
继续上面的操作
[root@yufei test]# ln testfile testfile.hard
[root@yufei test]# ln -s testfile testfile.soft
对testfile建立一个硬链接和一个软链接
[root@yufei test]# ls -il
total 4
977 drwxr-xr-x. 2 root root 4096 Apr  5 16:48 testdir
976 -rw-r--r--. 2 root root    0 Apr  5 16:47 testfile
976 -rw-r--r--. 2 root root    0 Apr  5 16:47 testfile.hard
978 lrwxrwxrwx. 1 root root    8 Apr  5 17:03 testfile.soft -> testfile

再查看文件和目录的属性,我们就发现:创建一个硬链接后,testfile的inode count增加了一个。而且testfile和testfile.hard这两个的Inode number是一样的。这个硬链接就是重新创建了一个文件名对应到原文件的Inode。实质就是在Directory中增加了一个新的对应关系。通过这个例子,你是不是更清楚了,这个Inode count的含义了。他就是指,一个Inode对应了多少个文件名。

下面我们再来看看硬链接的其他特点

[root@yufei ~]# watch -n 1 "df -i;df"
Every 1.0s: df -i;df                            Tue Apr  5 21:52:53 2011

Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda1             960992  105415  855577   11% /
tmpfs                  63946       1   63945    1% /dev/shm
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda1             15118728   2747612  11603116  20% /
tmpfs                   255784         0    255784   0% /dev/shm
用上面的命令可以实时查看系统中所剩的block和inode的变化数量。
建议大家不要用deumpe2fs和tune2fs这两个命令,如果使用他们来