“An inode stores all the information about a regular file, directory, or other file system object, except its data and name. ”

每个文件都对应一个 i 节点,i 节点存储了除文件名和文件内容之外的所有信息。

了解一下文件系统如何存取文件的:
1、根据文件名,通过Directory里的对应关系,找到文件对应的Inode number
2、再根据Inode number读取到文件的Inode table
3、再根据Inode table中的Pointer读取到相应的Blocks

文件夹也是一种文件,创建的时候需要占用一个inode,而对应的data block则存目录的内容,内容则是该目录下所有文件(文件夹)的名字和对应的inode number。

unlink 和 rm 的关系

执行unlink()函数并不一定会真正的删除文件,它先会检查文件系统中此文件的连接数是否为1,如果不是1说明此文件还有其他链接对象,因此只对此文件的连接数进行减1操作。若连接数为1,并且在此时没有任何进程打开该文件,此内容才会真正地被删除掉。在有进程打开此文件的情况下,则暂时不会删除,直到所有打开该文件的进程都结束时文件就会被删除。

  • superblock:记录此filesystem 的整体信息,包括inode/block的总量、使用量、剩余量, 以及档案系统的格式与相关信息等;
  • inode:记录档案的属性,一个档案占用一个inode,同时记录此档案的资料所在的block 号码;
  • block:实际记录档案的内容,若档案太大时,会占用多个block 。

在读取一个文件时,总是从根目录开始读取,每一个目录或者文件,在VFS中,都是一个文件对象,每一个文件对象都有唯一的一个inode与之对应。根目录的inode号为0,在superblock里,可以很快根据inode号索引到具体的inode,因此读取到的第一个inode就是根目录的。读取到了该目录后,内核对象会为该文件对象建立一个dentry,并将其缓存起来,方便下一次读取时直接从内存中取。而目录本身也是一个文件,目录文件的内容即是该目录下的文件的名字与inode号,目录文件的内容就像一张表,记录的文件名与其inode no.之间的映射关系。根据路径即可找到当前需要读取的下一级文件的名字和inode,同时继续为该文件建立dentry,dentry结构是一种含有指向父节点和子节点指针的双向结构,多个这样的双向结构构成一个内存里面的树状结构,也就是文件系统的目录结构在内存中的缓存了。有了这个缓存,我们在访问文件系统时,通常都非常快捷。

link 和 cp 的关系
拷贝文件(cp)会重新创建一个文件并且复制相同的内容,
占用新的空间,新的inode,这是两个文件
而硬链接实际上是增加了原来文件的count,并创建了一个连接,当你删除一个源文件或者一个硬链接后,count减1,到0后删除文件。

cp对inode的影响:

1. 当复制行为发生的时候,系统会找到一个空inode number,然后将数据写入到inode table 

2. 并且会新增一个目录,把文件的档案名称对应到inode number 

3. 当inode number和inode table处理好了之后,系统才会将文件内容复制到新增的文件中 

mv对inode的影响:

前提:使用mv命令搬移的文件目的地跟原文件在同一文件系统内

1. 系统会新建一个目录项,将新档案名称对应到inode number 

2. 删除旧档案

(搬移档案的行为对inode table没有任何影响,也不会将档案搬移到其他的block)

rm对inode的影响:

1. 系统会减去文件的link count数字,然后将对应的inode number标记为可使用

2. 而文件所占用的block也会打上可以使用的“标签”

3. 最后移除文件名称和目录项

 ============================================

PS:

当我们使用rm命令的时候,系统并不会真正删除这个资料。除非有档案非要将资料存储在原来档案的这些block中。这    样原来的block就会被新档案给覆盖掉。 

 =============================================   

https://blog.csdn.net/lqt641/...


仇实
23 声望0 粉丝

头像为AI合成