磁盘在使用前,需要分区和格式化,在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节点区之后,由众多相同容量的块组成,用于存储文件的内容,如果文件长度超过了一个块的最大容量,则该文件将被存储在多个块中,因此大文件很容易分布在成千上百个独立的磁盘块中。 文件数据区中各数据块的空闲情况由超级块记录,文件系统利用超级块中的记录完成对数据块的分配和回收。