Ext2文件系统
在上图中可以看出,ext2文件系统将整个分区划成若干个同样大小的块组(Block Group),从Block Group 0 到Block Group n。
- 启动块(boot block)
文件系统中存储的最小单位是块(Block),而上图中启动块(Boot Block)的大小是确定的,就是1KB,启动块是由PC标准规定的,用来存储磁盘分区信息和启动信息,任何文件系统都不能使用启动块。启动块之后才是ext2文件系统的开始。 - Block Group
ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。 - 超级块(Super Block)
存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了。 - 块组描述符表(GDT,Group Descriptor Table)
块组描述符表是由很多块组描述符组成,整个分区分成多少个块组就对应有多少个块组描述符。每个块组描述符(Group Descriptor)存储一个块组的描述信息,例如在这个块组中从哪里开始是inode表,从哪里开始是数据块,空闲的inode和数据块还有多少个等等。 - 块位图(Block Bitmap)
Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用 - inode位图(inode Bitmap)
每个bit表示一个inode是否空闲可用。 - i节点表
包含文件/目录的几乎全部-适用于放置在硬盘上的,需要长久保存的信息。
例如:文件所有者,文件类型,i节点号(存放在目录块中),主次设备号,连接计数,访问/修改时间,IO块长,文件字节数等等。
可以用stat函数(#include )获取相关i节点信息信息。 - 数据区:存放文件内容
文件索引过程
dentry是一个目录项(Directory entry),相当于一个文件目录,该文件目录里面有很多文件。其实本质就是一个dir_entry结构体,重要成员有文件的inode索引号,文件名等,存储着文件的信息
struct ext2_dir_entry_2 {
__u32 inode; /* 文件的inode号 */
__u16 rec_len; /* 目录项长度 */
__u8 name_len; /* 文件名包含的字符数 */
__u8 file_type; /* 文件类型 */
char name[EXT2_NAME_LEN]; /* 文件名 */
};
当要查找test.txt文件时,会先从dir_entry结构体中找到与文件名相匹配的inode节点,然后再根据test.txt文件的inode编号找到对应的inode结构体,而在inode结构体中会有一个i_block成员(i_block在inode结构体中是一个非常重要的成员),该成员指出了test.txt文件中的数据在磁盘中的存储位置。
进程与文件关系
v节点因为它除了包含i节点之外,自身的内容实在是不怎么多,重点看一下文件表吧。
文件表包括:
文件状态标志:包含读,写,添写,同步和非阻塞等各种文件打开/当前状态。
当前文件偏移量:记录文件指针位置
V节点/I节点:文件类型和对此文件进行各种操作的函数的指针,这些信息都是在打开文件时候由磁盘读入内存的。
可用fcntl函数(#include )修改文件表内容。
硬链接与软链接
硬链接
真正找到磁盘上文件的并不是文件名,而是inode。 其实在linux中可以让多个文件名对应于同一个inode。
ln [filename] [newfilename]
[root@localhost linux]# touch abc
[root@localhost linux]# ln abc def
root@localhost linux]# ls -1i
abc def 263466 abc 263466 def
软链接
硬链接是通过inode引用另外一个文件,软链接是通过名字引用另外一个文件法.
ln -s [filename] [newfilename]
软链接文件是一个单独的文件,数据中存储源文件的路径,可以理解为快捷方式,如果源文件被删除,则软链接文件失效。
硬链接是多个文件使用一个inode结点,即使删除源文件,只是硬链接数减1,直到减到0才会删除文件。