Ext3文件系统介绍
一. 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文件系统介绍相关推荐
- Linux文件系统介绍:Ext、XFS、Btrfs
作为 Windows 或 macOS 系统用户,人们一般不会去考虑他们的磁盘使用了什么文件系统,因为微软和苹果已经帮他们选定了 NTFS 和 APFS.而对于 Linux 用户,受益于自由开源软件,文 ...
- 【云存储】主流分布式文件系统介绍
目录 1.引言 2.云存储与分布式文件系统 2.1.云存储 2.2.分布式文件系统 3.Google的三大云计算与云存储论文 3.1.The Google File System(谷歌文件系统) 3. ...
- 获取系统信息3——proc文件系统介绍和使用
以下内容源于朱有鹏<物联网大讲堂>课程的学习整理,如有侵权,请告知删除. 一.proc文件系统介绍 1.操作系统级别的调试 简单程序,可以单步调试:(多线程不行,linux内核不行) 复杂 ...
- 【STM32H7】第2章 ThreadX FileX文件系统介绍
论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=100749 第2章 ThreadX FileX文件系统介绍 ...
- 【STM32F407】第2章 ThreadX FileX文件系统介绍
论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=100749 第2章 ThreadX FileX文件系统介绍 ...
- 【Unix/Linux】文件系统介绍 入门
文件系统是一个操作系统最重要的部分之一.下文以Linux为例介绍以下Unix操作系统的文件系统. Unix文件系统介绍 Unix中的文件类型 目录详述 重要的目录 主目录和工作目录.绝对路径名和相对路 ...
- Flash文件系统介绍和平台采用squashfs+ubifs原因
Flash文件系统介绍和平台采用squashfs+ubifs原因 嵌入式系统与通用PC机不同,一般没有硬盘这样的存储设备而是使用Flash闪存芯片.小型闪存卡等专为嵌入式系统设计的存储装置.因此在嵌入 ...
- Linux开发从入门到精通——基础篇 :1、计算机常识、Linux操作系统和文件系统介绍
Linux开发从入门到精通--基础篇 :1.计算机常识.Linux操作系统和文件系统介绍
- Linux根文件系统介绍
系统 根文件系统首先是一种文件系统,但是相对于普通的文件系统,它的特殊之处在于,它是内核启动时所mount的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后 ...
最新文章
- 【Python】参考ggplot2,Seaborn将迎来超大版本更新!
- CentOS 5.5-yum安装配置LNMP
- 生活 list.php,list.php
- 2021北京民营企业百强榜单发布 美团、水滴等公司入选
- oracle安装前准备,Oracle 安装前准备
- C/C++笔试题(基础题)
- I00016 打印等腰三角形字符图案(底边在左或右)
- 牛客网 字符串的排列
- 【万里征程——Windows App开发】使用华丽丽的字体
- yyyy-mm-dd yyyymmdd互相转换
- UEFI学习——事件函数WaitForEvent和CreateEvent/CreateEventEx
- qt 分贝毫瓦 dBm 与 功率 W 相互转换
- 存储珍贵的数据和资源的好选择,铁威马NAS F2-221折腾体验
- 使用get传参的时候,参数在后头获取不到或者出现别的错误。
- C++正则表达式(regex_match、regex_search与regex_replace)
- 不同网络情况的安防摄像头如何通过手机进行直播?
- Hive-JDBC操作,springcloud高级面试题
- 全球与中国LED检查灯市场深度研究分析报告
- Janino框架初识与使用教程
- 李航统计学习方法----感知机章节学习笔记以及python代码