《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);
}    

问题

posted on 2022-10-03 19:28  20201310寸头  阅读(31)  评论(0编辑  收藏  举报