linux文件系统之inode

2015-08-02 19:13:00
admin
原创 1892
摘要:linux文件系统之inode

一、inode是什么

文件储存在硬盘上面,硬盘的最小存储单位叫做扇区sector,每个扇区储存512字节。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个块,这种由多个扇区组成的块是文件存取的最小单位。最常见的块大小是4KB,即连续八个sector组成一个block。

文件数据都储存在块中,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等。这种储存文件元信息的区域就叫做inode,中文译名为索引节点。


二、inode的号码
每个inode都有一个号码,操作系统用inode号码识别不同的文件,文件名只是inode号码便于识别的别称。表面上用户通过文件名打开文件,实际上系统内部分成三个步骤:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码获取inode信息;最后,根据inode信息找到文件数据所在的block,读出数据。

查看文件inode号码:ls -i


三、inode的内容
inode包含文件的元信息,具体来说有以下内容:
* 文件的字节数
* 文件拥有者的User ID
* 文件的Group ID
* 文件的读写执行权限
* 文件的时间戳:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
* 链接数,有多少文件名指向这个inode
* 文件数据block的位置

查看文件inode信息:stat filename,
除了文件名以外,所有文件信息都存在inode之中。


四、inode的大小
inode会消耗硬盘空间,硬盘格式化的时候,操作系统自动将硬盘分成两个区:一个是数据区,存放文件数据;另一个是inode区,存放inode包含的信息。
每个inode节点的大小一般是128字节或256字节,inode节点的总数,在格式化时就给定,一般是每1KB或2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode区的大小就会达到128MB,占整块硬盘的12.8%。


查看inode节点的大小:dumpe2fs -h /dev/vdb1 | grep "Inode size",dumpe2fs用于查看文件系统信息。
查看硬盘inode使用情况:df -i


五、目录文件
linux系统中目录也是一种文件,打开目录实际上就是打开目录文件。目录文件的结构非常简单,就是一系列目录项列表,每个目录项由两部分组成:所包含文件的文件名,该文件名对应的inode号码。

列出目录中的所有文件名:ls /etc
列出目录中的所有文件名和inode号码:ls -i /etc


六、硬链接
一般情况下文件名和inode号码是一一对应,每个inode号码对应一个文件名。但是linux系统允许,多个文件名指向同一个inode,这意味着,可以用不同的文件名访问同样的内容,对文件内容进行修改会影响到所有文件名;但是删除一个文件名,不影响另一个文件名的访问。这种情况就被称为硬链接。

ln命令可以创建硬链接:ln 源文件 目标文件,使用上面这条命令生成目标文件,目标文件与源文件的inode号码相同,指向同一个inode,inode中有一项叫链接数,记录指向inode的文件名总数,这时就会增加1,反过来删除一个文件名,就会使得inode的链接数减1,当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码以及对应block区域。

这里顺便说一下目录文件的链接数。创建目录时,默认会生成两个目录项.和..,前者的inode号码就是当前目录的inode号码,等同于当前目录的硬链接,后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的硬链接。所以,任何一个目录的硬链接总数,总是等于2加上它的子目录总数,这里的2是父目录对其的硬链接和当前目录下的硬链接。


七、软链接
除了硬链接还有一种特殊情况,文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径,读取文件A时系统自动访问文件B,无论打开哪一个文件,最终读取的都是文件B,这时文件A就称为文件B的软链接或者符号链接。这意味着,文件A依赖文件B,如果删除文件B,打开文件A就会报错"No such file or directory",这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode链接数不会发生变化。

创建软链接:ln -s 源文件 目标文件


八、inode的特殊作用
由于文件名inode分离,这种机制导致了一些linux系统特有现象:
1、重命名文件或移动文件,只是改变文件名,不影响inode号码;
2、文件打开以后系统用inode号码来识别文件,不再考虑文件名,系统通常无法从inode号码得知文件名;

第2点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过inode号码来识别运行中的文件,不通过文件名。更新的时候,新版文件以同样的文件名生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名自动指向新版文件,旧版文件的inode则被回收。


九、inotify使用介绍

inotify是操作系统提供监控文件系统事件的机制,tailf使用inotify实现,常用参数:

/proc/sys/fs/inotify/max_user_watches,每个用户可以监控的文件数量上限;

/proc/sys/fs/inotify/max_user_instances,每个用户可以创建的监控实例上限;

/proc/sys/fs/inotify/max_queued_events,每个监控实例可以缓存的消息上限;

发表评论
评论通过审核之后才会显示。