在磁盘上创建一个文件系统通常有两个阶段。第一步格式化磁盘,以使磁盘驱动程序可以将块号转换成对应的磁道和扇区,从而可以读和写磁盘上的物理块。现在的硬磁盘已经由厂家预先格式化,因此不需要重新格式化;在Linux上可以使用superformat或fdformat等实用程序对软盘进行格式化。第二步才涉及创建文件系统,这意味着建立前面博文中详细描述的那些磁盘文件系统数据结构。
Ext2文件系统是由C程序mke2fs创建的。mke2fs采用下列缺省选项,用户可以用命令行的标志修改这些选项:
- 块大小:1024字节(小文件系统的缺省值)
- 片大小:等于块的大小(因为块的分片还没有实现)
- 所分配的索引节点个数:每8192字节的组分配一个索引节点
- 保留块的百分比:5%
mke2fs程序执行下列操作:
1. 初始化超级块和组描述符。
2. 作为选择,检查分区是否包含有缺陷的块;如果有,就创建一个有缺陷块的链表。
3. 对于每个块组,保留存放超级块、组描述符、索引节点表及两个位图所需要的所有磁盘块。
4. 把索引节点位图和每个块组的数据映射位图都初始化为0。
5. 初始化每个块组的索引节点表。
6. 创建/root目录。
7. 创建lost+found目录,由e2fsck使用这个目录把丢失和找到的缺陷块连接起来。
8. 在前两个已经创建的目录所在的块组中,更新块组中的索引节点位图和数据块位图。
9. 把有缺陷的块(如果存在)组织起来放在lost+found目录中。
让我们看一下mke2fs是如何以缺省选项初始化Ext2的1.44 MB软盘的。
软盘一旦被安装,VFS就把它看作由1412个块组成的一个卷,每块大小为1024字节。为了查看磁盘的内容,我们可以执行如下Unix命令:
[root@localhost]# dd if=/dev/fdO bs=1k count=1440 | od -tx1 -Ax > /tmp/dump_hex
从而获得了AMP目录下的一个文件,这个文件包含十六进制的软盘内容的转储。
通过查看dump_hex文件我们可以看到,由于软盘有限的容量1.44MB(约等于1474560个字节),一共需要1440个块,那么一个单独的块组描述符就足够了。我们还注意到保留的块数为72(1440块的5%)。
软盘中的第一个块是引导块,第二个块是超级快ext2_super_block,第三个块是组描述符ext2_group_desc,第四个块是数据块的位图(所以ext2_group_desc中的bg_block_bitmap等于4),第五个块是索引节点的位图(所以ext2_group_desc中的bg_inode_bitmap等于5)。
根据缺省选项,索引节点表必须为每8192个字节设置一个索引节点,也就是有184个索引节点存放在紧挨着索引节点的位图那个块的后23个块中,也就是第6~28个块。
下表是对一个软盘执行mke2fs程序后的磁盘分布:
块 内容
0 引导块
1 超级块
2 仅包含一个组描述符的块
3 数据块位图
4 inode 位图
5-27 inode 表,其中:1到10号inode保留(2号inode是根目录的inode);11号inode是lost+found;12-184号inode空闲
28 根目录 (包括 .、..、和lost+found)
29 lost+found 目录 (包括 . and ..)
30-40 预分配给lost+found目录的保留的块
41-1439
空闲块