*inode*

    当我们需要打开一个文件的时候,往往是输入打开文件的命令加上文件名,这时操作系统就会去硬盘上查找对应的文件,这里应该知道,Unix/Linux系统内部并不使用文件名来查找相应的文件,而是通过一个叫“文件索引节点”的inode来进行查找,而这个inode用来存放文件的元信息,比如文件的创建者、文件的size和文件的时间信息等等,而每一个文件也相应的对应一个inode。


*inode内容*

一个文件的inode往往包含以下信息

  1. 文件名和文件大小

  2. 文件链接数

  3. 文件的所属者Uid,文件的所属组Gid

  4. 文件的读写权限

  5. 文件的时间戳(Access:文件上一次打开的时间

             Modify:文件内容上一次变动的时间

             Change:inode上一次变动的时间)

  6. 文件数据Block的位置


可以用stat命令查看文件的inode信息

wKioL1cFz4yAeUuTAAA2FB6GFc8982.png


也可以用ls -i 文件名 来查看文件的inode号

wKiom1cFzyWBMX9iAAAL3H7Qf54899.png


表面上我们通过文件名来打开一个文件,实际上这里操作系统将经历如下步骤,首先找到文件名对应的inode号,其次通过inode号码获取相应的inode信息,最后根据inode信息找到文件数据的存储位置,读取相应的文件数据。



*硬链接*

    在说文件的硬链接之前我想先提一下在C++中的深浅拷贝问题,浅拷贝就是多个指针指向同一块new出来的空间,在delete的时候就会有问题,所以我们一般用深拷贝,深拷贝中有写时拷贝也有用引用计数,其中引用计数就是用一个计数器来统计有多少个指针指向同一块空间,当计数器归零时才释放这块空间,否则多个指针共用一块空间,空间并不释放。

    文件的硬链接其实就是引用计数的思想,Unix/Linux系统中允许多个文件对应同一个inode号码,也就是可以用不同的文件名访问同一个文件,也可以进行修改,但会影响所有硬链接文件,删除一个文件,并不影响其他文件的访问,这就是硬链接(hard link)。

    可用ln 源文件 目标文件 这条命令来创建硬链接,当创建完成,文件的inode信息中,文件的链接数会+1,如下图:


wKiom1cF4MDhBAqHAABMWHPUWWE011.png


而当删除一个硬链接文件时,文件inode信息中文件的链接数就会-1,而当文件的链接数减到0时,系统就会回收这个inode号码以及block区域供下一个新创建的文件使用:


wKiom1cF4PyCmT7bAABYBW7QM9Q332.png


*软链接*

    举个栗子,有文件A和文件B,其inode号码并不相同,但文件A中的内容是文件B的路径,因此访问文件A时其实就是访问的文件B,此时文件A就叫文件B的软链接(soft link)或符号链接(symbolic link)。

可以用ln -s 源文件 目标文件 命令来创建文件的软链接,软链接中文件inode信息中文件的链接数并不会发生变化:


wKioL1cF406QzvMBAABT894Riqc666.png


软链接中文件A依赖文件B而存在,当删除了文件B,打开文件A时系统就会报错:

wKiom1cF5pXQSDzYAABohyJ-D48390.png


《完》