引导块
位于文件卷最开始的第一扇区,这512 字节是文件系统的引导代码,为根文件系统所特有,其他文件系统这512 字节为空。
超级块 ( superblock )
一个文件系统总是由它的超级块来定义的,所以创建文件系统的同时超级块也被创建。它包含了文件系统的一些基本参数,例如文件系统中的数据块(data blocks )数和最大文件数等等。超级块中包含了一些临界数据,以便于进行灾难性的恢复。缺省的超级块总是固定地位于文件系统所在磁盘分区的开始处。超级块还有一个备份叫做冗余超级块,就像DOS 中的文件分配表的副本。冗余超级块和缺省的超级块不一样,它被分散地保存在磁盘分区上。
超级块位于文件系统第二扇区,紧跟引导块之后,用于描述本文件系统的结构。如i- 节点长度、文件系统大小等,其结构存放于/usr/include/sys/filsys.h 中,具体结构如下:
struct filsys
{
ushort s_isize; /* 磁盘索引节点区所占用的数据块数*/
daddr_t s_fsize; /* 整个文件系统的数据块数*/
short s_nfree; /* 在空闲块登录表中当前登记的空闲块数目*/
daddr_t s_free[NICFREE]; /* 空闲块登记表*/
short s_ninode; /* 空闲索引节点数*/
ino_t s_inode[NICINOD]; /* 空闲节点登记表*/
char s_flock; /* 加锁标志位*/
char s_ilock; /* 节点加锁标志位*/
char s_fmod; /* 超级块修改标志*/
char s_ronly; /* 文件系统只读标志*/
time_t s_time; /* 超级块上次修改的时间*/
short s_dinfo[4]; /* 设备信息*/
daddr_t s_tfree; /* 空闲块总数*/
ino_t s_tinode; /* 空闲节点总数*/
char s_fname[6]; /* 文件系统名称*/
char s_fpack[6];
long s_fill[13]; /* 填空位*/
long s_magic; /* 指示文件系统的幻数*/
long s_type; /* 新文件系统类型*/
};
i- 节点表 (i-node )
一个特定的文件被看成是目录或包含了指向它的内容的指针。每一个文件都有一个和i- 节点相关联的描述符。一个i- 节点包含了文件的属性,例如文件的所有者、最后修改时间、最后访问时间和指向此文件数据块的指针等等。如果一个文件的前12 个数据块被i- 节点结构中的变量直接指向,那么i- 节点结构可能还包含着指向间接文件数据块的指针以便将来扩充文件的内容。其实i- 节点结构中包含了3 个级别的数据块指针,一个文件有4096 个字节的数据块,则第一级间接数据块包含了1024 个字节,第二级间接数据块也包含了1024 个字节,并且被第一级间接数据块指向;同理,第二级间接数据块也指向第三级大小为1024 字节的间接数据块。不过在实际应用中第三级间接数据块很少被使用,因为一般没有那么大的文件。文件系统的数据块大小保存在超级块中,这就使在同一系统中同时访问不同数据块大小的文件系统成为可能。
i- 节点表存放在超级块之后,其长度是由超级块中的s_isize 字段决定的,其作用是用来描述文件的属性、长度、属主、属组、数据块表等,其数据结构在/usr/include/sys/ino.h 中,如下:
struct dinode
{
ushort di_mode;
short di_nlink;
ushort di_uid;
ushort di_gid;
off_t di_size;
char di_addr[40];
time_t di_atime;
time_t di_mtime;
time_t di_ctime;
};