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目录条目
目录包含dir_entry结构
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文件系统的实现
问题与解决思路
为什么用df命令比du命令统计整个磁盘的已用空间更快?
详情可参照:
http://www.runoob.com/linux/linux-comm-df.html
http://www.runoob.com/linux/linux-comm-du.html
因为df命令只需要查看每个块组的块位图即可,而不需要搜遍整个分区。相反,用du命令查看一个较大目录的已用空间就非常慢,因为不可避免地要搜遍整个目录的所有文件。
Linux df命令用于显示目前在Linux系统上的文件系统的磁盘使用情况统计。
Linux du命令用于显示目录或文件的大小。
实践内容与截图,代码链接
1、查看文件操作系统
以上示例效果中还有一个叫做buffers memory的内存区块,这个区块缓存了文件系统的部分Inode信息,这样保证了操作系统不会随时到文件系统上寻找Inode——优化文件系统的读性能。cache memory区块和buffers memory区块由操作系统自行管理,它们只会使用当前没有被应用程序占用的空闲内存。当应用程序请求新的内存区块且空闲内存不够时,操作系统会释放部分cache memory区块或者buffers memory区块。
2、df、du命令学习
df(英文全拼:disk free)用于显示目前在Linux系统上的文件系统磁盘使用情况统计。
第二列指定一个特定的文件系统1K-块1K是1024字节为单位的总内存。用和可用列正在使用中,分别指定的内存量。
使用列指定使用的内存的百分比,而最后一栏"安装在"指定的文件系统的挂载点。
用一个-i选项的df命令的输出显示inode信息而非块使用量