1.什么是inode?文件存储在硬盘上,硬盘的最小存储单元称为“扇区”。每个扇区存储512个字节(相当于0.5KB)。操作系统在读取硬盘时,并不是一个扇区一个扇区读取,效率太低了。而是一次连续读取多个扇区,即一次读取一个“块”(block)。这个由多个扇区组成的“块”是文件访问的最小单位。“块”的大小,最常见的是4KB,即8个连续的扇区组成一个块。文件数据是以“块”的形式存储的,那么显然,我们还必须找到一个地方来存储文件的元数据,比如文件的创建者、文件的创建日期、文件的大小等等在。这个存放文件元信息的区域称为inode,中文翻译为“索引节点”。每个文件都有一个对应的inode,里面包含了与该文件相关的一些信息。2.inode的内容inode包含文件的元信息。具体有以下内容:文件的字节数文件所有者的UserID文件的GroupID文件的读、写、执行权限的时间戳,有3种:ctime指的是inode的最后一次更改时间,mtime是指文件内容的最后一次更改时间,atime是指文件的最后一次打开时间。链接数,即有多少个文件名指向inode文件数据块的位置。可以使用stat命令查看一个文件的inode信息:statexample.txt简而言之,除文件名外的所有文件信息都存储在inode中。至于为什么没有文件名,下面会详细说明。3、inode的大小inode也会占用硬盘空间,所以在格式化硬盘的时候,操作系统会自动将硬盘分成两个区域。一是数据区,存放文件数据;另一个是inode区(inode表),存放inode包含的信息。每个inode节点的大小一般为128字节或256字节。格式化时给出了inode节点总数,一般每1KB或每2KB设置一个inode。假设在一个1GB的硬盘中,每个inode节点的大小为128字节,每1KB设置一个inode,那么inode表的大小将达到128MB,占整个硬盘的12.8%。要查看inode总数和每个硬盘分区的已使用数,可以使用df命令。df-i查看每个inode节点的大小,可以使用如下命令:sudodumpe2fs-h/dev/hda|grep"inodesize"由于每个文件都必须有一个inode,所以可能会出现inode已经用完,但是硬盘还没有满的情况。此时无法在硬盘上创建新文件。四、inode号每个inode都有一个编号,操作系统用inode号来标识不同的文件。这里值得重申的是,Unix/Linux系统内部并不使用文件名,而是使用inode号来标识文件。对于系统来说,文件名只是inode号的别名或昵称,方便识别。从表面上看,用户通过文件名打开文件。其实这个过程在系统内部分为三个步骤:首先,系统找到文件名对应的inode号;第二,通过inode号获取inode信息;最后根据inode信息找到文件数据所在的block,并读出数据。使用ls-i命令,可以看到文件名对应的inode号:ls-iexample.txt5.目录文件在Unix/Linux系统中,目录(directory)也是文件的一种。打开一个目录其实就是打开一个目录文件。目录文件的结构非常简单,它是一系列目录条目(dirent)的列表。每个目录项由两部分组成:包含文件的文件名,和文件名对应的inode号。ls命令只列出目录文件中的所有文件名:ls/etcls-i命令列出整个目录文件,即文件名和inode号:ls-i/etc如果要查看详细信息文件,必须使用inode号,访问inode节点,读取信息。ls-l命令列出有关文件的详细信息。ls-l/etc了解了以上知识后,就可以了解目录的权限了。目录文件的读权限(r)和写权限(w)是针对目录文件本身的。由于目录文件中只有文件名和inode号,如果只有读权限,则只能获取文件名,不能获取其他信息,因为其他信息都存储在inode节点中,而读取文件中的信息inode节点需要执行目录文件权限(x)。6、硬链接一般情况下,文件名和inode号是“一一对应”的关系,每个inode号对应一个文件名。但是,Unix/Linux系统允许多个文件名指向同一个inode号。这意味着可以使用不同的文件名来访问相同的内容;修改文件内容会影响所有文件名;但是,删除一个文件名不会影响另一个文件名的访问。这种情况称为“硬链接”。ln命令可以创建硬链接:lnsourcefiletargetfile运行上述命令后,源文件和目标文件的inode号相同,都指向同一个inode。inode信息中有一项叫做“linknumber”,记录了指向该inode的文件名总数,此时会加1。反之,删除一个文件名会使inode节点中的“链接号”减1。当这个值减为0时,表示没有文件名指向这个inode,系统会回收这个inode号和其对应的块区域。这里顺便提下目录文件的“链接号”。创建目录时,默认生成两个目录项:“.”和”..”。前者的inode号是当前目录的inode号,相当于当前目录的“硬链接”;后者的inode号是当前目录的父目录的inode号,相当于父目录的“硬链接”。因此,任何目录中“硬链接”的总数总是等于2加上其子目录(包括隐藏目录)的总数。7.除了硬链接,软链接也有特殊情况。虽然文件A和文件B的inode号不同,但是文件A的内容就是文件B的路径。当读取文件A时,系统会自动将访问者引导至文件B。因此,无论打开哪个文件,文件B终于被读取了。此时,文件A被称为文件B的“软链接”(softlink)或“符号链接”(symboliclink)。这意味着文件A依赖于文件B而存在。如果文件B被删除,打开文件A会报错:“Nosuchfileordirectory”。这就是软链接和硬链接最大的区别:文件A指向文件B的文件名,而不是文件B的inode号,文件B的inode“链接号”不会如此变化。ln-s命令可以创建软链接。ln-s源文件或目录目标文件或目录八、inode的特殊作用由于inode号与文件名分开,这种机制导致了一些Unix/Linux系统特有的现象。有时,文件名包含特殊字符,无法正常删除。这时候直接删除inode节点就可以起到删除文件的作用。移动或重命名文件只会更改文件名,不会影响inode编号。打开一个文件后,系统用inode号来识别文件,不再考虑文件名。因此,一般来说,系统是无法从inode号知道文件名的。第3点使软件更新变得容易,无需关闭软件即可完成,无需重新启动。因为系统是通过inode号来识别运行文件的,而不是文件名。更新时,新版本的文件会生成一个新的同名文件的inode,不会影响正在运行的文件。下次运行软件时,文件名会自动指向新版本文件,旧版本文件的inode会被回收。
