ext2文件系统中的超级块及对应代码

在进行分区时,每个分区就是一个文件系统,而每个文件系统开始位置的那个块就称为超级块。超级块的作用是存储文件系统的大小、空的和填满的块,以及它们各自的总数和其他诸如此类的信息。这也就是说,要使用这一个分区来进行数据访问时,第一个要经过的就是超级块,所以超级块坏了,这个磁盘也就回天乏术了。

super block的中文名称是超级块,它是硬盘分区开头——开头的第一个byte是byte 0,从 byte 1024开始往后的1024 bytes。 超级块中的数据其实就是文件卷的控制信息部分,也可以说它是卷资源表,有关文件卷的大部分信息都保存在这里。例如:硬盘分区中每个block的大小、硬盘分区上一共有多少个block group、以及每个block group中有多少个inode。

超级块的结构为:

/* The Super Block comes first in the block group */

typedef struct tagEXT2_SUPER_BLOCK

{

uint32_t    s_inodes_count;       /* total no of inodes */

uint32_t    s_blocks_count;       /* total no of blocks */

uint32_t    s_r_blocks_count;     /* total no of blocks reserved for exclusive use  of superuser */

uint32_t    s_free_blocks_count;    /* total no of free blocks */

uint32_t    s_free_inodes_count;    /* total no of free inodes */

uint32_t    s_first_data_block;    /* position of the first data block */

uint32_t    s_log_block_size;    /* used to compute logical block size in bytes */

uint32_t    s_log_frag_size;        /* used to compute logical fragment size  */

uint32_t    s_blocks_per_group;    /* total number of blocks contained in the group  */

uint32_t    s_frags_per_group;    /* total number of fragments in a group */

uint32_t    s_inodes_per_group;    /* number of inodes in a group  */

uint32_t    s_mtime;            /* time at which the last mount was performed */

uint32_t    s_wtime;            /* time at which the last write was performed */

uint16_t    s_mnt_count;        /* number of time the fs system has been mounted in r/w mode without having checked */

uint16_t    s_max_mnt_count;    /* the max no of times the fs can be mounted in r/w mode before a check must be done */

uint16_t    s_magic;            /* a number that identifies the fs (eg. 0xef53 for ext2) */

uint16_t    s_state;            /* gives the state of fs (eg. 0x001 is Unmounted cleanly) */

uint16_t    s_pad;                /* unused */

uint16_t    s_minor_rev_level;    /*    */

uint32_t    s_lastcheck;        /* the time of last check performed */

uint32_t    s_checkinterval;        /* the max possible time between checks on the fs */

uint32_t    s_creator_os;        /* os */

uint32_t    s_rev_level;            /* Revision level */

uint16_t    s_def_resuid;        /* default uid for reserved blocks */

uint16_t    s_def_regid;        /* default gid for reserved blocks */

/* for EXT2_DYNAMIC_REV superblocks only */

uint32_t    s_first_ino;         /* First non-reserved inode */

uint16_t    s_inode_size;         /* size of inode structure */

uint16_t    s_block_group_nr;     /* block group # of this superblock */

uint32_t    s_feature_compat;     /* compatible feature set */

uint32_t    s_feature_incompat;     /* incompatible feature set */

uint32_t    s_feature_ro_compat;     /* readonly-compatible feature set */

uint8_t    s_uuid[16];        /* 128-bit uuid for volume */

char    s_volume_name[16];         /* volume name */

char    s_last_mounted[64];         /* directory where last mounted */

uint32_t    s_algorithm_usage_bitmap; /* For compression */

uint8_t    s_prealloc_blocks;    /* Nr of blocks to try to preallocate*/

uint8_t    s_prealloc_dir_blocks;    /* Nr to preallocate for dirs */

uint16_t    s_padding1;

uint32_t    s_reserved[204];        /* unused */

}  EXT2_SUPER_BLOCK;

而ext2read中进行超级块的读取函数为mount,此函数:

int Ext2Partition::mount()

{

EXT2_SUPER_BLOCK sblock;

int gSizes, gSizeb;        /* Size of total group desc in sectors */

char *tmpbuf;

//读取超级块数据,读取位置为分区的1024字节后的1024字节

read_disk(handle, &sblock, relative_sect + 2, 2, sect_size);    /* read superBlock of root */

if(sblock.s_magic != EXT2_SUPER_MAGIC)

{

printf("Bad Super Block. The drive %s is not ext2 formatted.\n", linux_name.c_str());

return -1;

}

//判断此分区是否支持ext2的特性

if(sblock.s_feature_incompat & EXT2_FEATURE_INCOMPAT_COMPRESSION)

{

printf("File system compression is used which is not supported.\n");

}

//得到块的大小

blocksize = EXT2_BLOCK_SIZE(&sblock);

//得到每个group中有多少个inode

inodes_per_group = EXT2_INODES_PER_GROUP(&sblock);

//得到每个inode结构体的长度

inode_size = EXT2_INODE_SIZE(&sblock);

printf("Block size %d, inp %d, inodesize %d\n", blocksize, inodes_per_group, inode_size);

//得到总的group的个数,用整个分区的块数/每个group的块的个数

totalGroups = (sblock.s_blocks_count)/EXT2_BLOCKS_PER_GROUP(&sblock);

//得到分区所有的group描述信息的大小

gSizeb = (sizeof(EXT2_GROUP_DESC) * totalGroups);

//得到所有group描述信息所占的扇区数

gSizes = (gSizeb / sect_size)+1;

//为所有group分配描述信息的空间

desc = (EXT2_GROUP_DESC *) calloc(totalGroups, sizeof(EXT2_GROUP_DESC));

if(desc == NULL)

{

printf("Not enough Memory: mount: desc: Exiting\n");

exit(1);

}

//分配所有group描述信息所占的字节长度的存储空间

if((tmpbuf = (char *) malloc(gSizes * sect_size)) == NULL)

{

printf("Not enough Memory: mount: tmpbuf: Exiting\n");

exit(1);

}

/* Read all Group descriptors and store in buffer */

/* I really dont know the official start location of Group Descriptor array */

if((blocksize/sect_size) <= 2)

{

//relative_sect是本分区相对于整个硬盘的开始扇区号

read_disk(handle, tmpbuf, relative_sect + ((blocksize/sect_size) + 2), gSizes, sect_size);

}

else

{

//relative_sect是本分区相对于整个硬盘的开始扇区号,偏移一个块的大小是为什么?偏移一个块是因为第一个块存储的是Boot Block等相关的信息

read_disk(handle, tmpbuf, relative_sect + (blocksize/sect_size), gSizes, sect_size);

}

//得到所有的group信息存储到缓存desc中

memcpy(desc, tmpbuf, gSizeb);

free(tmpbuf);

return 0;

}

时间: 2024-08-10 19:52:53

ext2文件系统中的超级块及对应代码的相关文章

文件系统VFS数据结构(超级块 inode dentry file)(收集整理)

Linux虚拟文件系统四大对象: 1)超级块(super block) 2)索引节点(inode) 3)目录项(dentry) 4)文件对象(file) 一个进程在对一个文件进行操作时各种对象的引用过程如下: 通过task_struct得到files_struct,然后通过文件描述符(int fd)获得相应的文件对象(file **fd),接下来获得目录项对象(dentry),最后得到索引节点对象(inode),该对象就包括具体操作该文件的相关操作,这些操作是从超级对象块中继承而来的.它与具体的

ext2文件系统

文件系统特性: 磁盘分区完毕后还需要进行格式化,因为每个操作系统所设定的文件属性.权限并不相同.比如Windows98是采用的FAT或FAT16,Windows2000后才有了NTFS,Linux正统系统则为ext2这一个. 传统的磁盘与文件系统之应用中,一个分割槽(partition)只能够被格式化成为一个文件系统,但由于新技术的产生,比如LVM.磁盘列阵(software RAID),这些技术能够将一个分割槽格式化为多个文件系统(例如LVM),也能将多个分割槽格式化为一个系统. 文件系统之运

Linux 文件系统及 ext2 文件系统

linux 支持的文件系统类型 Ext2: 有点像 UNIX 文件系统.有 blocks,inodes,directories 的概念. Ext3: Ext2 的加强版,添加了日志的功能.支持 POSIX ACL(Access control Lists,访问控制列表) . Isofs(iso9660): CDROM 文件系统. Sysfs:  基于 ram 的文件系统,起始于 ramfs.用于导出终端用户可以简便使用的内核对象(kernel objects). Procfs: proc 文件系

EXT2 文件系统

对文件系统而言,文件仅是一系列可读写的数据块.文件系统并不需要了解数据块应该放到物理介质上什么位置.这些都是设备驱动的任务.无论何时,只要文件系统需要从包含它的块设备中读取信息或数据,它就将请求底层的设备驱动读取一个基本块大小整数倍的数据块.EXT2文件系统将它所使用的逻辑分区划分成数据块组.每个数据块组都将那些对文件系统完整性最重要的信息复制出来,同时将实际文件盒目录看做信息与数据块. 罗即文件系统管理的是一个逻辑空间,这个逻辑空间就像一个大的数组,数组的每个元素就是文件系统操作的基本单位——

文件IO详解(一)---ext2文件系统详解

http://www.cnblogs.com/biyeymyhjob/archive/2012/07/26/2609649.html 讲解ext2整体的文件布局 http://www.cnblogs.com/peon/archive/2011/06/22/2086470.html 用实际磁盘中的数据来印证ext2文件系统的布局 磁盘存储数据的最小单元是扇区(Sector):ext2文件系统存储结构的最小单位是块(Block). ext2文件系统中文件的物理存储结构有三个基本组成部分:superb

Linux 文件系统错误的修复方法 ddrescue替代dd的恢复软件 备用超级块

Linux 文件系统错误的修复方法  ddrescue替代dd的恢复软件  备用超级块 最近处理的一件 linux 服务器断电导致文件系统启动后文件系统不可读写,数据不可用的案例,现总结下 Linux 文件系统错误的修复方法.EXT3-fs error (device hda3) in start_transaction: Journal has abortedIf your system abruptly loses power, or if a RAID card is beginning

ext2文件系统了解

一个磁盘可以划分成多个分区,每个分区必须先用格式化工具(例如mkfs命令)格式化成某种格式的文件系统,然后才能存储文件,格式化的过程会在磁盘上写一些管理存储布局的信息.下以ext2文件系统为例说明文件在磁盘上如何存储. 一个分区ext2文件系统的总体存储布局 启动块大小确定,1KB,启动块由PC标准规定,用来存储磁盘分区信息和启动信息,任何文件系统都不能使用启动块.启动块之后才是ext2文件系统的开始,ext2文件系统将整个分区划分成若干个同样大小的块组(Block Group),每个块组都是有

Linux - EXT2文件系统

文件系统特性 举例来说,windows 98 以前的微软操作系统主要利用的文件系统是 FAT (或 FAT16),windows 2000 以后的版本有所谓的 NTFS 文件系统,至于 Linux 的正统文件系统则为 Ext2 (Linux second extended file system, ext2fs)这一个.此外,在默认的情况下,windows 操作系统是不会认识 Linux 的 Ext2 的. 那么文件系统是如何运行的呢?这与操作系统的文件数据有关.较新的操作系统的文件数据除了文件

Linux系统的Ext2文件系统

下面我们正是你介绍Ext2文件系统 Ext2文件系统使用以inode为基础的文件系统. 文件系统一开始将inode与block规划好了,除非重新格式化,否则inode与block固定后就不再变动,但是当inode与block数量过多时,就不易于管理.因此Ext2在格式化的时候基本上是区分为多个块组(block group),每个块组都有独立的/inode/block/superblock系统.Ext2格式化后如图 在整体的规划中,文件系统最前面有一个启动扇区(boot sector),这个启动扇