EXT4文件系统学习(10)VFS之磁盘结构Group和superblock

2024-04-24 19:18

本文主要是介绍EXT4文件系统学习(10)VFS之磁盘结构Group和superblock,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

direntry建立了各级目录和文件之间的联系,inode建立了文件与数据之间联系,但这还不够,还需要记录inode和数据块从哪里开始从哪里结束,以及哪些是空闲的,这样才能正确的分配文件。

Group

块组是一个逻辑概念,把一个分区分成若干个组,用来限制文件的数据块不要过于散落,尽量保证一个文件的数据块在一个组,这样可以提高读写效率,

格式化一个ext4文件系统后在磁盘上的结构:

Group 0: (Blocks 1-8192)Primary superblock at 1, Group descriptors at 2-2Reserved GDT blocks at 3-246Block bitmap at 247 (+246)Inode bitmap at 251 (+250)Inode table at 255-499 (+254)5481 free blocks, 1916 free inodes, 7 directoriesFree blocks: 1268-2657, 2866-4096, 5327-6112, 6119-8192Free inodes: 39, 46-1960

超级块

超级块记录着一个分区的整体信息,有多少inode,多少个组,多少个block数据块,多少个空闲块。

Group descriptors组描述符记录了这个组中的inode数量,空闲块数量等信息。

Block bitmap是数据块的位图,记录着数据块的状态。

Inode bitmap是inode的位图,记录着inode的状态。

磁盘超级块结构如下:

/** Structure of the super block*/
struct ext4_super_block {
/*00*/	__le32	s_inodes_count;		/* Inodes count */inode总数量__le32	s_blocks_count_lo;	/* Blocks count */block总数量__le32	s_r_blocks_count_lo;	/* Reserved blocks count */预留block总数量__le32	s_free_blocks_count_lo;	/* Free blocks count */空闲block总数量
/*10*/	__le32	s_free_inodes_count;	/* Free inodes count */空闲inode总数量__le32	s_first_data_block;	/* First Data Block */第一个数据块的编号__le32	s_log_block_size;	/* Block size */块大小,一般是4KB,可配置__le32	s_log_cluster_size;	/* Allocation cluster size */分片功能没有启用
/*20*/	__le32	s_blocks_per_group;	/* # Blocks per group */每个组中多个个块__le32	s_clusters_per_group;	/* # Clusters per group */__le32	s_inodes_per_group;	/* # Inodes per group */__le32	s_mtime;		/* Mount time */
/*30*/	__le32	s_wtime;		/* Write time */__le16	s_mnt_count;		/* Mount count */被挂载的总次数__le16	s_max_mnt_count;	/* Maximal mount count */最大挂载次数,达到后就会进行文件系统检测__le16	s_magic;		/* Magic signature */__le16	s_state;		/* File system state */文件系统状态,为0表示被mount状态,挂载之前会检测此状态防止重复挂载__le16	s_errors;		/* Behaviour when detecting errors */__le16	s_minor_rev_level;	/* minor revision level */
/*40*/	__le32	s_lastcheck;		/* time of last check */上一次文件系统检测的时间__le32	s_checkinterval;	/* max. time between checks */检测的最大间隔__le32	s_creator_os;		/* OS */__le32	s_rev_level;		/* Revision level */
/*50*/	__le16	s_def_resuid;		/* Default uid for reserved blocks */__le16	s_def_resgid;		/* Default gid for reserved blocks *//** These fields are for EXT4_DYNAMIC_REV superblocks only.** Note: the difference between the compatible feature set and* the incompatible feature set is that if there is a bit set* in the incompatible feature set that the kernel doesn't* know about, it should refuse to mount the filesystem.** e2fsck's requirements are more strict; if it doesn't know* about a feature in either the compatible or incompatible* feature set, it must abort and not try to meddle with* things it doesn't understand...*/__le32	s_first_ino;		/* First non-reserved inode */__le16  s_inode_size;		/* size of inode structure */inode占用空间大小,一般是256字节__le16	s_block_group_nr;	/* block group # of this superblock */__le32	s_feature_compat;	/* compatible feature set */
/*60*/	__le32	s_feature_incompat;	/* incompatible feature set */__le32	s_feature_ro_compat;	/* readonly-compatible feature set */
/*68*/	__u8	s_uuid[16];		/* 128-bit uuid for volume */UID
/*78*/	char	s_volume_name[16];	/* volume name */分区名字
/*88*/	char	s_last_mounted[64];	/* directory where last mounted */
/*C8*/	__le32	s_algorithm_usage_bitmap; /* For compression *//** Performance hints.  Directory preallocation should only* happen if the EXT4_FEATURE_COMPAT_DIR_PREALLOC flag is on.*/__u8	s_prealloc_blocks;	/* Nr of blocks to try to preallocate*/__u8	s_prealloc_dir_blocks;	/* Nr to preallocate for dirs */__le16	s_reserved_gdt_blocks;	/* Per group desc for online growth *//** Journaling support valid if EXT4_FEATURE_COMPAT_HAS_JOURNAL set.*/
/*D0*/	__u8	s_journal_uuid[16];	/* uuid of journal superblock */
/*E0*/	__le32	s_journal_inum;		/* inode number of journal file */__le32	s_journal_dev;		/* device number of journal file */__le32	s_last_orphan;		/* start of list of inodes to delete */__le32	s_hash_seed[4];		/* HTREE hash seed */__u8	s_def_hash_version;	/* Default hash version to use */__u8	s_jnl_backup_type;__le16  s_desc_size;		/* size of group descriptor */
/*100*/	__le32	s_default_mount_opts;__le32	s_first_meta_bg;	/* First metablock block group */__le32	s_mkfs_time;		/* When the filesystem was created */__le32	s_jnl_blocks[17];	/* Backup of the journal inode *//* 64bit support valid if EXT4_FEATURE_COMPAT_64BIT */
/*150*/	__le32	s_blocks_count_hi;	/* Blocks count */__le32	s_r_blocks_count_hi;	/* Reserved blocks count */__le32	s_free_blocks_count_hi;	/* Free blocks count */__le16	s_min_extra_isize;	/* All inodes have at least # bytes */__le16	s_want_extra_isize; 	/* New inodes should reserve # bytes */__le32	s_flags;		/* Miscellaneous flags */__le16  s_raid_stride;		/* RAID stride */__le16  s_mmp_update_interval;  /* # seconds to wait in MMP checking */__le64  s_mmp_block;            /* Block for multi-mount protection */__le32  s_raid_stripe_width;    /* blocks on all data disks (N*stride)*/__u8	s_log_groups_per_flex;  /* FLEX_BG group size */__u8	s_checksum_type;	/* metadata checksum algorithm used */__u8	s_encryption_level;	/* versioning level for encryption */__u8	s_reserved_pad;		/* Padding to next 32bits */__le64	s_kbytes_written;	/* nr of lifetime kilobytes written */__le32	s_snapshot_inum;	/* Inode number of active snapshot */__le32	s_snapshot_id;		/* sequential ID of active snapshot */__le64	s_snapshot_r_blocks_count; /* reserved blocks for activesnapshot's future use */__le32	s_snapshot_list;	/* inode number of the head of theon-disk snapshot list */
#define EXT4_S_ERR_START offsetof(struct ext4_super_block, s_error_count)__le32	s_error_count;		/* number of fs errors */__le32	s_first_error_time;	/* first time an error happened */__le32	s_first_error_ino;	/* inode involved in first error */__le64	s_first_error_block;	/* block involved of first error */__u8	s_first_error_func[32];	/* function where the error happened */__le32	s_first_error_line;	/* line number where error happened */__le32	s_last_error_time;	/* most recent time of an error */__le32	s_last_error_ino;	/* inode involved in last error */__le32	s_last_error_line;	/* line number where error happened */__le64	s_last_error_block;	/* block involved of last error */__u8	s_last_error_func[32];	/* function where the error happened */
#define EXT4_S_ERR_END offsetof(struct ext4_super_block, s_mount_opts)__u8	s_mount_opts[64];__le32	s_usr_quota_inum;	/* inode for tracking user quota */__le32	s_grp_quota_inum;	/* inode for tracking group quota */__le32	s_overhead_clusters;	/* overhead blocks/clusters in fs */__le32	s_backup_bgs[2];	/* groups with sparse_super2 SBs */__u8	s_encrypt_algos[4];	/* Encryption algorithms in use  */__u8	s_encrypt_pw_salt[16];	/* Salt used for string2key algorithm */__le32	s_lpf_ino;		/* Location of the lost+found inode */__le32	s_reserved[100];	/* Padding to the end of the block */__le32	s_checksum;		/* crc32c(superblock) */
};

ext4_super_block与磁盘上面的超级块数据基本是对应的,可直接读出到结构体内存。

组描述符在磁盘上的格式如下:

/** Structure of a blocks group descriptor*/
struct ext4_group_desc
{__le32	bg_block_bitmap_lo;	/* Blocks bitmap block */表示bmap在这个组的那一块__le32	bg_inode_bitmap_lo;	/* Inodes bitmap block */表示imap在这个组的那一块__le32	bg_inode_table_lo;	/* Inodes table block */这个组的inode所在起始块号__le16	bg_free_blocks_count_lo;/* Free blocks count */空闲块数量__le16	bg_free_inodes_count_lo;/* Free inodes count */空闲inode数量__le16	bg_used_dirs_count_lo;	/* Directories count */__le16	bg_flags;		/* EXT4_BG_flags (INODE_UNINIT, etc) */__le32  bg_exclude_bitmap_lo;   /* Exclude bitmap for snapshots */__le16  bg_block_bitmap_csum_lo;/* crc32c(s_uuid+grp_num+bbitmap) LE */__le16  bg_inode_bitmap_csum_lo;/* crc32c(s_uuid+grp_num+ibitmap) LE */__le16  bg_itable_unused_lo;	/* Unused inodes count */__le16  bg_checksum;		/* crc16(sb_uuid+group+desc) */__le32	bg_block_bitmap_hi;	/* Blocks bitmap block MSB */__le32	bg_inode_bitmap_hi;	/* Inodes bitmap block MSB */__le32	bg_inode_table_hi;	/* Inodes table block MSB */__le16	bg_free_blocks_count_hi;/* Free blocks count MSB */__le16	bg_free_inodes_count_hi;/* Free inodes count MSB */__le16	bg_used_dirs_count_hi;	/* Directories count MSB */__le16  bg_itable_unused_hi;    /* Unused inodes count MSB */__le32  bg_exclude_bitmap_hi;   /* Exclude bitmap block MSB */__le16  bg_block_bitmap_csum_hi;/* crc32c(s_uuid+grp_num+bbitmap) BE */__le16  bg_inode_bitmap_csum_hi;/* crc32c(s_uuid+grp_num+ibitmap) BE */__u32   bg_reserved;
};

组描述符占用64字节,一个块占用4KB,所以每个组里面的组描述符块保存了所有组描述符。应该是为了防止数据损坏进行修复使用。

超级块的备份会在2n-1的组里面,防止数据损坏进行修复。

 

这篇关于EXT4文件系统学习(10)VFS之磁盘结构Group和superblock的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/932604

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识