一.

Ext3格式分析


二.

Ext3数据组织格式

...


三.

Ext3日志系统分析


一. Ext3 格式分析

Ext3 的存储格式以及一个每个 group 的格式如下图所示:

由图可知, ext3 fs 由 N 个 group 组成,每个 group 又由 1 个 sb, 1 个 group descriptor table, 1 个 data block bitmap, 1 个 inode bitmap, 1 个 inode table 以及剩余的 data block 组成。

Group descriptor 用于描述该 group 的 inode 以及 block 的使用状态及位置,结构体是 ext3_group_desc 。

Data block bitmap 表示某一块已用还是未用。

Inode bitmap 表示某一个 inode 已用还是未用。

Inode table 用来存储 inode 信息表。每个 inode 表项的结构构是 ext3_inode .

Data block 用来存储数据,不同的文件类型存储的数据格式不一样,后面有介绍。

Group 个数 = disk total blocks/ ( 8*block size);

每个 group 最多容纳 block size * 8 个 blocks, data block bitmap 都可以用一个 block 来描述。

假设 block size 为 1k ,对于 512M 的 disk ,其 group 的个数为 64.

mkfs.ext3 格式化时,会设置 inode 的个数为 2048/ group, data block 的个数为 8K/group 。这样也就可以算出整个 ext3 最多容纳的文件或者目录个数。

Ext3 的 Inode no 是从 1 开始的,因此 1~2048 存储在第 0 个 group ,其是否有效通过该 group 的 inode bitmap 位 0 到 ~ 位 2047 来表示,依此类推: inode 2049~4096 存储在第 1 个 group.

因为 Ext3 使用的数据块也是 1 开始的 (es->s_first_data_block=1) ,因此第 1 个 group 的 block bitmap 位 0 到位 8191 实际表示的 block 范围是 1~8192 。

通过 dumpe2fs /dev/wsmda 可以查看到 ext3 的详细信息。

struct ext3_super_block {

/*00*/     __le32     s_inodes_count;            /* Inodes count */

__le32     s_blocks_count;            /* Blocks count */

__le32     s_r_blocks_count;  /* Reserved blocks count */

__le32     s_free_blocks_count;     /* Free blocks count */

/*10*/     __le32     s_free_inodes_count;     /* Free inodes count */

__le32     s_first_data_block; /* First Data Block */

__le32     s_log_block_size;   /* Block size */

__le32     s_log_frag_size;     /* Fragment size */

/*20*/     __le32     s_blocks_per_group;     /* # Blocks per group */

__le32     s_frags_per_group;       /* # Fragments 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 */

__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 */

__le16   s_inode_size;         /* size of inode structure */

};

每个 group 都使用 struct ext3_group_desc 来描述。通过 group descriptor ,就可以定位到相应的 block bitmap, inode bitmap 以及 inode table 。

struct ext3_group_desc

{

__le32     bg_block_bitmap;          /* Blocks bitmap block */

__le32     bg_inode_bitmap;          /* Inodes bitmap block */

__le32     bg_inode_table;             /* Inodes table block */

__le16     bg_free_blocks_count;   /* Free blocks count */

__le16     bg_free_inodes_count;   /* Free inodes count */

__le16     bg_used_dirs_count;      /* Directories count */

__u16     bg_pad;

__le32     bg_reserved[3];

};

对于每一个目录或者文件,都使用一个 inode 来表示,其存储在 inode table 中。

每个表项的格式为:ext3_inode

struct ext3_inode {

__le16 i_mode;    /* File mode */

__le16 i_uid;     /* Low 16 bits of Owner Uid */

__le32 i_size;    /* Size in bytes */

__le32 i_atime;   /* Access time */

__le32 i_ctime;   /* Creation time */

__le32 i_mtime;   /* Modification time */

__le32 i_dtime;   /* Deletion Time */

__le16 i_gid;     /* Low 16 bits of Group Id */

__le16 i_links_count;    /* Links count */

__le32 i_blocks;  /* Blocks count */

__le32 i_flags;   /* File flags */

__le32 i_block[EXT3_N_BLOCKS];/* Pointers to blocks */

__le32 i_generation; /* File version (for NFS) */

__le16 i_extra_isize;

__le16 i_pad1;

};

二. Ext3 数据组织格式

数据组织格式

通过inode->i_block[] 数组可以定位到该inode 的数据存储的位置。

数据块的定位如下图所示;

i_block[0] 到i_block[11] 存储的是data block 号。如果文件小于12 个块时,就存储在这里。

i_block[12] 存储的是Indirect block( 一级映射) ,即其指向的块A 存储的不是数据,而是块号。如果文件大于12 个块,而小于blocksize/4+12 时,i_block[12] 指向的数据有效。其存储的数据块个数为:blocksize/4.

i_block[13] 存储的是Double indirect block( 二级映射). 其存储的数据块个数可以为:blocksize/4 * blocksize/4.

i_block[14] 存储的是Triple indirect block( 三级映射). 其存储的数据块个数为:blocksize/4 * blocksize/4 * blocksize/4.

通过这三级映射表,理论上:一个文件可以支持的最大文件大小为:

((blocksize/4)^3+ (blocksize/4)^2 + blocksize/4 + 12) * blocksize.

如下图所示:

因此,通过文件的偏移位置(逻辑块号),就可以找到其对应 disk 中的数据块号。

参考 ext3_get_block() 函数。

对于目录,其 data block 中存储的内容是: ext3_dir_entry_2

struct ext3_dir_entry_2 {

__le32     inode;                    /* Inode number */

__le16     rec_len;          /* Directory entry length */

__u8       name_len;              /* Name length */

__u8       file_type;

char name[EXT3_NAME_LEN];   /* File name */

};

对于文件,其 data block 存储的是文件的内容。

通过使用上述对象,就可以做创建 inode ,分配 data block, 以及查找数据块位置等操作了。

以下是对象对应的 disk 中结构体,以及在内存中的结构体。

Type

Disk data structure

Memory data structure

Superblock

ext3_super_block

ext3_sb_info

Group descriptor

ext3_group_desc

ext3_group_desc

Block bitmap

Bit array in block

Bit array in buffer

inode bitmap

Bit array in block

Bit array in buffer

inode

ext3_inode

ext3_inode_info

Data block

Array of bytes

VFS buffer

Free inode

ext3_inode

None

Free block

Array of bytes

None

以下是各种文件操作对应的 ext3 处理函数。

方法

处理函数

创建文件

ext3_create( )

查找文件

ext3_lookup( )

创建硬链接

ext3_link( )

删除文件

Ext3_unlink( )

创建软链接symlink

Ext3_symlink( )

创建目录

Ext3_mkdir( )

删除目录

Ext3_rmdir( )

创建设备文件

Ext3_mknod( )

文件重命名

Ext3_rename( )

设置文件权限属性

Ext3_setattr( )

三. Ext3 日志系统分析

由于 linux 系统利用 page cache 来减少 disk IO 读写,一般情况下,写入文件系统的数据并不会立即刷到磁盘中,如果突然停电,可能会造成某些操作的丢失。如果能够把文件系统的操作预先保存在磁盘中,就可以避免丢失数据。这就是日志文件系统的功能。

Ext3 通过 jbd 来实现日志文件系统的功能。

Ext3 的数据可以分为 meta data 和 data , meta data 表示的是基本的元数据,是除了普通文件存放的数据之外的所有数据, data 表示就是普通文件的数据。默认情况下, ext3 为了提高性能,只对 Meta data 的更新做日志,而不对 data 做日志。

参考 ext3_should_journal_data() 函数用来判断是否对普通数据做日志。

Ext3 的日志存储于一个 inode 号为 8 的预分配好的文件中。日志格式由 journaling block device(jbd) 来管理。

初始化时,通过 ext3_load_journal() 函数加载日志系统。具体如下:

通过 journal_init_inode() 将 inode 为 8 的日志文件中获取 jbd 的 superblock 以及生成主要数据结构 journal_t.

通过 journal_load ( journal )判断,如果 Journal 中有未完成的日志,则在函数 journal_recover () 恢复之。

日志系统的写入:

参考: ext3_create(), 首先生成一个 handle( 原子更新操作句柄 ), 然后将每一个更新的 buffer head 提交到 handle 对应的 transaction 中,最后,调用 ext3_journal_stop() ,将 handle 提交给 jbd , jbd 根据策略,立即或者定时将更新的 buffer 刷到 journaling inode 文件中。

JBD 的基本的思想就是:在把写一个 meta 块前 (dirty) ,把这个块 (buffer head) 添加到 jbd 的 handle(atomic update) 中,然后将多个 handle 到 transaction ,最后将整个 transaction flush 到 disk 中。详解参考 << Linux: The Journaling Block Device >> 网文。

... 5

Ext3文件系统介绍相关推荐

  1. Linux文件系统介绍:Ext、XFS、Btrfs

    作为 Windows 或 macOS 系统用户,人们一般不会去考虑他们的磁盘使用了什么文件系统,因为微软和苹果已经帮他们选定了 NTFS 和 APFS.而对于 Linux 用户,受益于自由开源软件,文 ...

  2. 【云存储】主流分布式文件系统介绍

    目录 1.引言 2.云存储与分布式文件系统 2.1.云存储 2.2.分布式文件系统 3.Google的三大云计算与云存储论文 3.1.The Google File System(谷歌文件系统) 3. ...

  3. 获取系统信息3——proc文件系统介绍和使用

    以下内容源于朱有鹏<物联网大讲堂>课程的学习整理,如有侵权,请告知删除. 一.proc文件系统介绍 1.操作系统级别的调试 简单程序,可以单步调试:(多线程不行,linux内核不行) 复杂 ...

  4. 【STM32H7】第2章 ThreadX FileX文件系统介绍

    论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=100749 第2章   ThreadX FileX文件系统介绍 ...

  5. 【STM32F407】第2章 ThreadX FileX文件系统介绍

    论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=100749 第2章   ThreadX FileX文件系统介绍 ...

  6. 【Unix/Linux】文件系统介绍 入门

    文件系统是一个操作系统最重要的部分之一.下文以Linux为例介绍以下Unix操作系统的文件系统. Unix文件系统介绍 Unix中的文件类型 目录详述 重要的目录 主目录和工作目录.绝对路径名和相对路 ...

  7. Flash文件系统介绍和平台采用squashfs+ubifs原因

    Flash文件系统介绍和平台采用squashfs+ubifs原因 嵌入式系统与通用PC机不同,一般没有硬盘这样的存储设备而是使用Flash闪存芯片.小型闪存卡等专为嵌入式系统设计的存储装置.因此在嵌入 ...

  8. Linux开发从入门到精通——基础篇 :1、计算机常识、Linux操作系统和文件系统介绍

    Linux开发从入门到精通--基础篇 :1.计算机常识.Linux操作系统和文件系统介绍

  9. Linux根文件系统介绍

    系统 根文件系统首先是一种文件系统,但是相对于普通的文件系统,它的特殊之处在于,它是内核启动时所mount的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后 ...

最新文章

  1. 【Python】参考ggplot2,Seaborn将迎来超大版本更新!
  2. CentOS 5.5-yum安装配置LNMP
  3. 生活 list.php,list.php
  4. 2021北京民营企业百强榜单发布 美团、水滴等公司入选
  5. oracle安装前准备,Oracle 安装前准备
  6. C/C++笔试题(基础题)
  7. I00016 打印等腰三角形字符图案(底边在左或右)
  8. 牛客网 字符串的排列
  9. 【万里征程——Windows App开发】使用华丽丽的字体
  10. yyyy-mm-dd yyyymmdd互相转换
  11. UEFI学习——事件函数WaitForEvent和CreateEvent/CreateEventEx
  12. qt 分贝毫瓦 dBm 与 功率 W 相互转换
  13. 存储珍贵的数据和资源的好选择,铁威马NAS F2-221折腾体验
  14. 使用get传参的时候,参数在后头获取不到或者出现别的错误。
  15. C++正则表达式(regex_match、regex_search与regex_replace)
  16. 不同网络情况的安防摄像头如何通过手机进行直播?
  17. Hive-JDBC操作,springcloud高级面试题
  18. 全球与中国LED检查灯市场深度研究分析报告
  19. Janino框架初识与使用教程
  20. 李航统计学习方法----感知机章节学习笔记以及python代码

热门文章

  1. MAC格式化U盘/移动硬盘
  2. js判断手机上是否安装某APP
  3. 拉普拉斯变换的物理意义是什么?
  4. 【vue打包】线上部署报错net::ERR_ABORTED 404 (Not Found)
  5. androidstudio安装的app打开闪退,AndroidManifest中也声明了类,但是却没有报错信息。(小坑)
  6. 职业生涯发展理论(精)
  7. 【简单应用】STC8+OLED(4P)显示
  8. ArcGIS中统计渔网中栅格人口密度
  9. 08-图7 公路村村通(浙大数据结构)
  10. 快速校验非法字符工具