1、Inode是什么?
要理解inode,要从文件储存说起。
文件由元数据和数据构成。
文件储存在硬盘上,最小的存储单位叫做“扇区(Sector)”。每个扇区存储512字节。操作系统读取硬盘时,不会一个扇区一个扇区地读取,这样非常低效;而是一次性连续读取多个扇区,即一次性读取一个“块(block)”。“块”由多个扇区组成,常见的大小有1K、2K、4K等,其中4K较常见。
文件的数据都存储在块(block)中,那么文件的元数据(比如文件的创建者、创建日期、大小等信息)也需要找个空间存储。存储文件元数据信息的区域就叫做inode,中文译作“索引节点”。
在linux系统中,每个文件会分配到一个inode,可以将inode简单理解为指针,它永远指向文件的具体存储位置。系统是通过inode来定位每个文件的。
2、Inode包含的内容
Inode包含下面的信息:
* 文件的字节数
* 文件拥有者的User ID
* 文件的Group ID
* 文件的读、写、执行权限
* 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
* 链接数,即有多少文件名指向这个inode
* 文件数据block的位置
3、inode的大小
inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。
查看每个硬盘分区的inode总数和已经使用的数量,可以使用df命令。df -i
查看每个inode的大小:dumpe2fs –h /dev/sda1| grep “Inode size”
4、inode号码
每个inode都有一个号码,操作系统用inode号码来识别不同的文件。
这里值得重复一遍,Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。
表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。
5、目录文件:
在unix/linux系统中,目录也是一种文件。目录由一系列的目录项(dirent)组成,每个目录项由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码。
简单来说,目录是用来关键文件名与Inode number的。
6、那么在linux中,文件系统查找文件的过程是怎样的呢。
以查找/var/log/somefile文件为例:
先查找/对应的inode号——>在对应inode表中找到/对应inode信息,通过该信息找到对应磁盘块——>在/磁盘块中找到var的inode号——>再到对应的inode表中找到var对应inode信息,获知其对应的磁盘块——>在var对应的磁盘块中找到log对应的inode号——>根据inode号找到log对应inode信息,找到对应的磁盘——>在log中找到somfile文件对应的inode号——>在inode表中找到somefile文件对应inode信息,查找到对应磁盘块——>再到somefile文件的磁盘块上获取文件的数据内容。至此,文件获取。
7、复制、移动和删除文件在inode上的表现
复制文件:分配空闲的inode——>在inode table里创建条目——>在目录里创建文件和inode的对应关系——>将文件写入块
移动文件:文件的移动分为两种情况。
第一种:源文件和目标文件在同一文件系统/分区上。文件移动的实现方式是:在目标目录下创建目标文件名与inode的对应关系——>删除源目录下的源文件名与inode的对应关系。完成。Ctime会被改写。在此情况下,数据在磁盘上的位置没有移动。
第二种:源文件与目标文件在不同的文件系统上。文件移动的实现方式是:
找到空闲的inode——>在inode下创建条目——>在目录下创建目标文件名和inode的对应关系——>将文件写入块——>同时源文件将被删除。Ctime会被改写,inode发生变化,数据在磁盘上的位置也相应地移动
删除文件:
删除文件的实质是减少inode的链接数,当链接数为0时,删除目录下文件名和inode的对应关系,将inode标记为可用。数据在块中并没有被移除,只是该块也被标记为可用,当有新数据写入并且需要用到该块时,该块上面的数据才会被覆盖。
8、软、硬链接的区别
8.1 什么是硬链接
一般情况下,文件名和inode号码是"一一对应"关系,每个inode号码对应一个文件名。
但是,Unix/Linux系统允许多个文件名指向同一个inode号码。这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为"硬链接"(hard link)。
源文件与目标文件的inode号码相同,都指向同一个inode。inode信息中有一项叫做"链接数",记录指向该inode的文件名总数,这时就会增加1。反过来,删除一个文件名,就会使得inode节点中的"链接数"减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域。
这里顺便说一下目录文件的"链接数"。创建目录时,默认会生成两个目录项:"."和".."。
前者的inode号码就是当前目录的inode号码,等同于当前目录的"硬链接";后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的"硬链接"。
所以,任何一个目录的"硬链接"总数,总是等于2加上它的子目录总数(含隐藏目录)。
硬链接创建方式:ln 源文件 链接文件
8.2 什么是软链接
文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的"软链接"(soft link)或者"符号链接(symbolic link)。
这意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:"No such file or directory"。
软连接创建方式:ln –s 源文件 链接文件
这是软链接与硬链接最大的不同:软链接指向文件的文件名,而不是文件的inode号码,文件的"链接数"不会因此发生变化。
原创文章,作者:M20-1钟明波,如若转载,请注明出处:http://www.178linux.com/26632