要说inode,还得首先从硬盘的物理格式说起,硬盘的最小存储单位是扇区,也就是sector,每个扇区存储512个字节。而一般文件系统都会有自己的最小读写单位,它就是block,一般可以有1KB、2KB、4KB等几种,现在比较常见的是4KB的,也就是连续的八个sector组成一个block。
文件的具体数据是存储在block中的,于是我们想找到这些block,就需要存储它们的元信息啦,于是就有了inode,也有人称为索引节点,我们可以用stat filename 的方式来查看一个文件的inode信息,它主要包含文件的字节数、文件的UID、文件的GID、文件的读写执行权限、文件的时间戳、文件的链接数和文件的block的位置。值得注意的是每个文件都必须有一个inode,因此有可能发生inode用光的情况,如果此时的磁盘还未存满,那么也无法在磁盘上重新创建文件了。我们可以用ls
的-i参数来查看具体的inode值。
因为inode中保存了一定的数据信息,因此inode也需要占据一定的磁盘空间,在格式化硬盘的时候,操作系统自动将硬盘分成两个区域,一个是数据区,一个是inode区。每个inode节点的大小,一般是128字节或256字节。而inode节点的总数,它是在格式化的时候就已经给出了,一般没1KB或者2KB就设置一个inode。
在*nix系统中,目录也是一种文件,目录的结构也很简单,它就是一系列目录项的列表,它由两部分组成:所包含的文件名,以及该文件名对应的inode号码。而且每个目录在被创建时,会默认生成两个目录项.和.. 前者的inode号码就是当前目录的inode号码,等同于当前目录的硬链接,而后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的硬链接,因此,任何一个目录的硬链接总数,总是等于2加上他的子目录总数,这里的子目录是包含隐藏目录的,这里的2就是父目录对其的硬链接和当前目录下的.硬链接。
如果源文件与目标文件都指向同一个inode,那么他们就是互为硬链接,而inode信息中有一项叫做链接数,它记录指向该inode的文件名总数,如果我们删除一个文件名,则inode节点中的链接数会减少1,当这个值减少为0的时候,系统会收回这个inode号码,以及其所对应的block区域。
如果文件名包含特殊字符而难以删除时,我们可以直接删除其inode值来删除文件。如果文件被移动或者重命名的时候,只是改变文件名,不影响inode号码。当我们打开一个文件之后,系统就会用inode来识别该文件了,它不再考虑文件名,因此系统无法从inode来得到文件名,但是可以从文件名来找到inode。