磁盘在使用前,需要分区和格式化,在windows下格式化磁盘,可以选择FAT,FAT32,NTFS等类型,在UNIX下格式化磁盘,可以选择EXT2,EXT3和SWAP等类型,格式化操作将在磁盘分区中创建文件系统,它们确定文件的存储方式和索引方法,确定磁盘空间分配和回收算法。
UNIX文件系统的存储由”目录—i节点—数据块”三级组成,其中目录存储了文件的层次结构,数据块存储了文件的具体内容信息,i节点是连接文件层次结构与其数据块内容的桥梁。
UNIX下的文件包括了文件类型,文件访问权限,文件属主ID,文件属组ID,文件链接数,文件长度和文件时间等,这些信息存储在文件对应的i节点中。
4.1文件系统的结构
大多数计算机都有若干磁盘,这些磁盘中包含着一个或多个分区,每个分区都有一个文件系统.UNIX文件系统将磁盘空间划分成一系列大小相同的块(block),全部块可划分为引导快,超级块,i节点区(inode区),和数据区四个部分。
1引导块:
引导块位于文件系统的第0号物理块,即文件系统的第一扇区,不属于文件系统管辖,保存着文件系统的引导代码。
2超级块:
超级块位于文件系统的第1号物理块,紧跟引导块之后,描述文件系统本身的结构信息,如文件系统的大小,空闲块数目,空闲块索引表,空闲i节点数目,空闲i节点索引表,封锁标志等。超级块的数据结构一般定义在文件”filsys.h”中。
Struct filsys
{
Ushort s_isize; //磁盘索引节点区所占用的数据块数
daddr_t s_fsize; //整个文件系统的数据块数
short s_nfree; //在空闲块登记表中当前登记的空闲块数目
daddr_t s_free; //空闲块登记表
short s_ninode; //空闲索引节点数
ino_t s_inode; //空闲节点登记表
chars_flock; //加锁标志位
chars_ilock; //节点加锁标志位
chars_fmod; //超级块修改标志
chars_ronly; //文件系统只读标志
time_t s_time; //超级块上次修改时间
short s_dinfo[4]; //设备信息
daddr_t s_tfree; //空闲块总数
ino_t s_tinode; //空间节点总数
chars_fname[6]; //文件系统名称
chars_fpack[6]; //文件系统包名称
longs_fill[13]; //填空位
longs_magic; //指示文件系统的幻数
longs_type; //新文件系统类型
}
3i节点区(inode区)
i节点区位于超级块之后,长度由超级块中的s_isize字段决定,它描述文件的属性,如长度,属主,属组,数据块表和最近访问时间等,i节点的数据结构一般定义在文件”ino.h”中
struct dinode
{
Ushort di_mode; //文件类型与权限
Short di_nlink; //文件链接数
Ushort di_uid; //文件属主ID
Ushort di_gid; //文件属组ID
Off_t di_size; //文件长度
Char di_addr[NADDR_BITES]; //文件磁盘块地址列表
Char di_gen; //file generation number
Time_t di_atime; //文件最近访问时间
Time_t di_mtime; //文件最近修改时间
Time_t di_ctime; //文件状态最近改变时间
}
文件系统通过i节点对文件进行控制和管理,其中,每个文件对应一个i节点,每个i节点具有唯一的节点号,记录了文件的属性和内容在磁盘上的存储位置,但文件名并不记录在i节点中,而是存储在目录文件中。
4数据区
文件的数据区位于i节点区之后,由众多相同容量的块组成,用于存储文件的内容,如果文件长度超过了一个块的最大容量,则该文件将被存储在多个块中,因此大文件很容易分布在成千上百个独立的磁盘块中。
文件数据区中各数据块的空闲情况由超级块记录,文件系统利用超级块中的记录完成对数据块的分配和回收。