Linux的EXT系列文件系统
windows常用的文件系统有FAT和NTFS,而Linux的正规文件系统为EXT4(Linux fourth extended file system, Ext4fs),它是由EXT,EXT2,EXT3发展而来的。
操作系统的文件数据除了文件实际内容外,通常含有非常多的属性,例如操作系统的文件权限(rwx)与文件属性(所有者,群组,修改时间等)。文件系统会将这两部分的数据分别放在不同的块,权限与属性放置到inode中,至于实际数据则放置到data block块中。另外还有一个超级块(super block)会记录整个文件系统的整体信息,包括inode与block的总量,使用量,剩余量等。
每个inode与block都有编号,至于这三个数据的意义可以简略说明如下:
- super block: 记录此文件的系统的整体信息,包括inode、block的总量,使用量,剩余量,以及文件系统的格式与相关信息等;
- inode: 记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block号码;
- block: 实际记录文件的内容,若文件太大,会占用很多个block。
由于每个inode与block都有编号,而每个文件都会占用一个inode,inode内则有文件数据放置的block号码。因此,如果能找到文件的inode的话,很自然的就会知道文件放置数据的block号码,当然就能够读取文件。而且我们常常是只需要读取文件的权限或属性,这样设计就能够不读取block的内容,只从inode中读取,例如读取文件前一定会先校验权限,如果无权限直接拒绝读取。
EXT4文件系统在格式化的时候会划分出多个块组(block group),每个块组都有自己独立的inode/block/super block系统。block group结构如图:
- data block数据块,是用来存放文件内容的地方,EXT4文件系统支持的block大小有1KB,2KB,4KB三种。原则上块的大小与数量在格式化完成后就不能再改变了,如果文件大于一个块,则会占用多个块,如果不足一个块也会占用一个块,大多数发行版本的默认值是4K。
- inode table,inode对应表,inode记录的文件数据至少有下面这些:
- 该文件的访问权限
- 该文件的owner和group
- 该文件的大小
- 该文件的atime,ctime和mtime
- 该文件的特殊属性如SetUID等
- 该文件内容的地址
每个inode的大小固定为256bytes,每个文件都仅会占用一个inode,所以,文件系统能够创建的文件总数与inode的数量有关;系统读取文件时需要先找到inode,并分析inode所记录的权限与用户是否符合,若符合才能够实际读取Block的内容。