“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就会被新档案给覆盖掉。
=============================================
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。