EXT2文件系统
知识点归纳以及自己最有收获的内容
1.EXT2文件系统
Linux一直使用EXT2(Card等1995)作为默认文件系统;EXT3中增加的主要内容是日志文件;EXT4增加:磁盘块的分配;
2.EXT2文件系统数据结构
2.0EXT2在硬盘上的索引节点的数据结构如下:
EXT2通过索引节点中的数据块指针数组进行逻辑块到物理块的映射。在EXT2索引节点中,数据块中数组共有15项,前12个为直接指针,后三个分别为“一次间接指针”、“二次间接指针”、“三次间接指针”,EXT2默认的物理块大小为1KB,块地址占4个字节,所以每个物理块可以存储256个地址。
2.1通过mkfs创建虚拟磁盘
mke2fs [-b blksize -N ninodes] device nblocks
在设备上创建一个带有nblocks个块(每个块大小为blksize字节)和ninodes个索引节点的EXT2文件系统。
2.2虚拟磁盘布局
Block#0:引导块 B0是引导块,文件系统不会使用它。它用来容纳一个引导程序,从磁盘引导操作系统。
2.3超级块
Block#1:超级块(在硬盘区分中字节偏移量为1024)B1是超级块,用于容纳整个文件系统的信息。
2.4块组描述符
Block#2:
块组描述符块(硬盘上的s_first_data_block+1)Block#8:
块位图Block#9:
索引节点位图
2.5索引节点
Block#10:
索引(开始)节点,每个文件用一个128字节(EXT4中是256字节)的唯一索引节点结构体表示
2.6数据块
紧跟在索引节点后面的是文件存储数据块。
2.7目录条目
3邮差算法
例:一个城市有M个街区,编号从0到M-1。每个街区有N座房子,编号从0到N-1。每座房子有一个唯一的街区地址,用(街区,房子)表示,其中0≤街区<M,0≤房子<N。外人不熟悉该街区寻址方案,采用线性方法将房子地址编为0,1,…,N-1,N,N+1等。已知某个街区地址BA=(街区,房子),如何转换为线性地址LA,相反,已知线性地址,如何转换为街区地址?
LA=N*block + house;
BA=(LA/N, LA%N); (只有从0开始计数转换才有效)
4编历EXT2文件系统树
编历一个EXT2文件系统和一个文件的路径名,例如/a/b/c,问题是如何找到这个文件。查找文件相当于查找其索引节点。
4.1编历算法
(1)读取超级块;
(2)读取块组描述符块(1+s_first_data_block),以访问组0描述符;
(3)读取InodeBeginBlock,获取/的索引节点,即INODE#2;
(4)将路径名标记为组件字符串,假设组件数量为n;
(5)从(3)中的根索引节点开始,在其数据块中搜索name[0];
(6)使用索引节点号ino来定位相应的索引节点。Ino从1开始计数,使用邮差算法计算包含索引节点的磁盘块及其在该块中的偏移量;
(7)由于(5)~(6)步将会重复n次,所以最好编写一个搜索函数。
4.2将路径名转换为索引节点
已知一个包含EXT2文件系统和路径名的设备,例如/a/b/c/d,编写一个C函数:INODE *path2inode(int fd, char *pathname);返回一个指向文件索引节点的INODE指针;如果文件不可访问,则返回0。
4.3显示索引节点磁盘块
编写一个C程序showblock,可打印文件的所有磁盘块(编号);
5 EXT2文件系统的实现
实践部分
在一个名为vdisk的虚拟磁盘文件上创建一个EXT2文件系统,有1440个大小为1KB的块
问题与解决思路
为什么用df命令比du命令统计整个磁盘的已用空间更快?
详情可参照:
http://www.runoob.com/linux/linux-comm-df.html
http://www.runoob.com/linux/linux-comm-du.html
因为df命令只需要查看每个块组的块位图即可,而不需要搜遍整个分区。相反,用du命令查看一个较大目录的已用空间就非常慢,因为不可避免地要搜遍整个目录的所有文件。