《Unix/Linux系统编程》第五周学习笔记
EXT2文件系统
ext2功能
Ext2(第二扩充文件系统)是一种功能强大、易扩充、性能上进行全面的优化的文件系统,也是目前Linux文
件系统实际上标准。Linux将Minix文件系统修改后用于Linux,但是文件系统有几个主要缺陷∶磁盘分区大小必须
小于64MB;必须使用14个字符定找的文件名;难于扩展。
Ext2的特点
节点中使用15个数据块指针,最大可支持4TB的磁盘分区;使用变长的目录项,既可以不浪费磁盘空间,又能支持
最长255个字符文件名称;使用位图来管理 数据块和节点的使用情况,解决Ext出现的问题;它在磁盘上布局做改
进,使数据的读/写更快、更有效、系统变得更加安全可靠。
文件操作
假设用户要对一个已有文件进行写操作,用户进程必须先打开这个文件,file结构记录此文件的当前位置,然后
用户把一个指向用户内存区的指针和请求写的字节数传送给系统,请求写操作,这时系统要进行两次映射。一组字节
到逻辑块的映射;逻辑块到物理块的映射;
磁盘布局
Ext2磁盘布局∶文件系统的逻辑空间最终要通过逻辑块到物理块的映射转化为磁盘等介质上的物理空间。一个文件
系统在磁盘如何布局,综合考虑如下因素∶最重要的保证数据的安全性;数据结构要高效地支持所有的操作;磁盘布局
应使数据查找的时间尽量缩短,提高效率磁盘布局应该考虑节省空间。Ext2磁盘布局在逻辑空间的映像如下
Ext2索引节点
Ext2索引节点∶和UNIX类的文件系统一样,使用索引节点来记录文件信息。每一个普通文件和目录都有唯一的
索引与之对应,索引节点中含有文件或目录的重要信息。当我们要访问一个文件或目录时,通过文件或目录名称首先
找到与之对应的索引节点,然后通过索引节点得到文件或目录的信息及磁盘上的具体的存储位置。
实践(模拟环境)(在上周博客中提及了很多实践代码这周代码是对上周代码的修改)
创建空文件
dd if=/dev/zero of=mydisk bs=1M count=30
格式化文件
mkfs.ext2 mydisk
虚拟一个设备
lostup/dev/loop11 mydisk
挂在文件到设备
mount/dev/loop11/opt/mydisk
查看内容
hexdump -n2048-s515k mydisk
显示超级快
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <ext2fs/ext2_fs.h>
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
typedef struct ext2_super_block SUPER;
SUPER* sp;
char buf[1024];
int fd, blksize, inodesize;
int print(char *s, u32 x)
{
printf("%-30s = %8d\n",s,x);
}
int super(char *device)
{
fd = open(device, O_RDONLY);
if (fd < 0)
{
printf("open %sfailed\n",device);
exit(1);
}
lseek(fd ,(long)1024*1,0);
read(fd, buf, 1024);
sp = (SUPER *)buf;
printf("%-30s = %8x ", "s_magic", sp->s_magic);
if(sp->s_magic != 0xEF53)
{
printf("NOT an EXT2 FS\n");
exit(2);
}
printf("EXT2 FS OK\n");
print("s_inodes_count",sp->s_inodes_count);
print("s_blocks_count",sp->s_blocks_count);
print("s_r_blocks_count",sp->s_r_blocks_count);
print("s_free_inodes_count",sp->s_free_inodes_count);
print("s_free_blocks_count",sp->s_free_blocks_count);
print("s_first_data_block",sp->s_first_data_block);
print("s_log_block_size",sp->s_log_block_size);
print("s_blocks_per_group",sp->s_blocks_per_group);
print("s_innodes_per_group",sp->s_inodes_per_group);
print("s_mnt_count",sp->s_mnt_count);
print("s_max_mnt_count",sp->s_max_mnt_count);
printf("%-30s = %8x\n","s_magic",sp->s_magic);
printf("s_mtime = %s",ctime(&sp->s_mtime));
printf("s_mtime = %s",ctime(&sp->s_wtime));
blksize = 1024 * (1 << sp->s_log_block_size);
printf("block size = %d\n" ,blksize);
printf("inode size = %d\n" ,sp->s_inode_size);
}
char *device = "vdisk";
int main(int argc, char *argv[])
{
if(argc < 1)
{
device = argv[1];
}
super(device);
}
问题
- 对于双重间接块和三重间接块不是很理解
- 解决方式:学了完整的ext2的视频教学(但是讲的不是很系统)链接:https://www.bilibili.com/video/BV1Yr4y1j7Fv/