ext4文件系统与日志相关的概念

Linux内核学习:EXT4文件JBD日志系统(Journaling Block Device) 目录 0 Ext4的日志模式 1 日志系统的作用 2 日志系统工作场景 3 JDB日志块设备 3.1JBD2的数据结构 3.1.1buffer_head 3.1.2handle 3.1.3 transaction 3.1.4 checkpoint 3.1.5kjournald 3.1.6 Journal 3.1.7journal_superblock 3.2 ... 阅读详情

1、page

结构体struct page定义在/include/linux/mm_types.h。page描述的是一片实际物理内存信息,一般是4K大小,简称页。在page中保存有状态信息,和文件系统,内存交换等方面的信息,唯独没有保存物理内存的偏移,即其代表4K是物理内存什么位置的4K。

这个信息实际是被隐式保存起来了,因为所有的struct page结构体都共同保存在同一个mem_map数组里面,数组下标实际就是物理内存位置。因此page就代表了内存。

2、Buffer Head

Buffer Head的结构体定义在/include/linux/buffer_head.h。一般不容易理解其作用,代码上也经常和page混在一起。它其实表针的不是内存,虽然名称里面有buffer字眼。它实际代表的是物理内存映射的块设备偏移位置。

struct buffer_head {
       unsigned long b_state;             /* buffer state bitmap (see above) */

       struct buffer_head *b_this_page;/* circular list of page's buffers */

       struct page *b_page;         /* the page this bh is mapped to */

       sector_t b_blocknr;           /* start block number */

       size_t b_size;                     /* size of mapping */

       char *b_data;                    /* pointer to data within the page */

       struct block_device *b_bdev;

       bh_end_io_t *b_end_io;          /* I/O completion */

      void *b_private;         /* reserved for b_end_io */

       struct list_head b_assoc_buffers; /* associated with another mapping */

       struct address_space *b_assoc_map;     /* mapping this buffer is

                                             associated with */

       atomic_t b_count;             /* users using this buffer_head */
};

举个简单例子,从块设备/dev/block/sda的第512 sector上的读取一个4K大小的数据,需要用一个page结构来缓存这个数据,而这个512 sector偏移这个信息则由buffer_head来保存。

所以page是存数据,buffer_head是存偏移。两个结构体内部互有指针保存相互的地址。一般一个buffer_head也表征4K大小,这样一个buffer_head正好对应一个page。某些文件系统可能采用更小的block size,例如1K,或者512字节。这样一个page最多可以用4或者8个buffer_head结构体来描述其内存对应的物理磁盘位置。

buffer_head是内核page与磁盘上物理数据块之间的桥梁。

3、原子操作handle

修改文件系统的任一系统调用通常都被划分为操作磁盘数据结构的一系列低级操作。

ext4需保证系统调用以原子地方式进行处理。原子操作处理(atomic operation handle)是对磁盘数据结构的一组低级操作,这组低级操作对应一个单独的高级操作。当从系统故障中恢复时,文件系统确保要么整个高级操作起作用,要么没有一个低级操作起作用。

任何原子操作处理都用类型为handle_t的描述符来表示。该描述符定义在include\linux\jdb2.h中:

typedef struct jbd2_journal_handle handle_t;    /* Atomic operation type */

它实际为jdb2_journal_handle类型,查看该类型定义:

struct jbd2_journal_handle
{
      union {
             /* Which compound transaction is this update a part of? */
             transaction_t *h_transaction;
             /* Which journal handle belongs to - used iff h_reserved set */
             journal_t       *h_journal;
      };

      /* Handle reserved for finishing the logical operation */
      handle_t       *h_rsv_handle;
      /* Number of remaining buffers we are allowed to dirty: */
      int                 h_buffer_credits;
      /* Reference count on this handle */
      int                 h_ref;
      /* Field for caller's use to track errors through large fs */
      /* operations */
      int                 h_err;
      /* Flags [no locking] */
      unsigned int h_sync:         1;    /* sync-on-close */
      unsigned int h_jdata: 1;    /* force data journaling */

      unsigned int h_reserved:   1;    /* handle with reserved credits */

      unsigned int h_aborted:    1;    /* fatal error on handle */

      unsigned int h_type:         8;    /* for handle statistics */

      unsigned int h_line_no:    16;  /* for handle statistics */

      unsigned long             h_start_jiffies;

      unsigned int        h_requested_credits;

#ifdef CONFIG_DEBUG_LOCK_ALLOC
      struct lockdep_map    h_lockdep_map;
#endif

};

在linux\jdb2\transaction.c中,函数jdb2_journal_start函数,其注释如下图所示

获取当前的handle:

handle_t *handle = journal_current_handle();

4、事务transaction

处于效率的原因,JDB2对日志的处理采用分组的方式,把属于几个原子操作处理的日志记录分组放在一个单独的事务(transaction)中。此外,与一个处理相关的所有日志记录都必须包含在同一个事务中。

一个事务的所有日志记录存放在日志的连续块中。JDB把每个事务作为整体来处理。只有当包含在一个事务的日志记录中的所有数据都提交给文件系统时才回收该事务所有块。

事务一旦被创建,它就能接收新处理的日志记录。当下列情况之一发生时,事务就停止接受新处理:

(1)固定的时间已经过去,例如5s

(2)日志中没有空闲块留给新处理。

事务由transaction_t描述符来表示,transaction_t定义在文件include\linux\journal-head.h中:

typedef struct transaction_s     transaction_t;      /* Compound transaction type */

可以看到transaction_t实际上是transaction_s,查看transaction_s的内容。

struct transaction_s
{
	/* Pointer to the journal for this transaction. [no locking] */
	journal_t		*t_journal;
	/* Sequence number for this transaction [no locking] */
	tid_t			t_tid;
	/*
	 * Transaction's current state
	 * [no locking - only kjournald2 alters this]
	 * [j_list_lock] guards transition of a transaction into T_FINISHED
	 * state and subsequent call of __jbd2_journal_drop_transaction()
	 * FIXME: needs barriers
	 * KLUDGE: [use j_state_lock]
	 */
	enum {
		T_RUNNING,
		T_LOCKED,
		T_FLUSH,
		T_COMMIT,
		T_COMMIT_DFLUSH,
		T_COMMIT_JFLUSH,
		T_COMMIT_CALLBACK,
		T_FINISHED
	}			t_state;
	/*
	 * Where in the log does this transaction's commit start? [no locking]
	 */
	unsigned long		t_log_start;
	/* Number of buffers on the t_buffers list [j_list_lock] */
	int			t_nr_buffers;
	/*
	 * Doubly-linked circular list of all buffers reserved but not yet
	 * modified by this transaction [j_list_lock]
	 */
	struct journal_head	*t_reserved_list;
	/*
	 * Doubly-linked circular list of all metadata buffers owned by this
	 * transaction [j_list_lock]
	 */
	struct journal_head	*t_buffers;
	/*
	 * Doubly-linked circular list of all forget buffers (superseded
	 * buffers which we can un-checkpoint once this transaction commits)
	 * [j_list_lock]
	 */
	struct journal_head	*t_forget;
	/*
	 * Doubly-linked circular list of all buffers still to be flushed before
	 * this transaction can be checkpointed. [j_list_lock]
	 */
	struct journal_head	*t_checkpoint_list;
	/*
	 * Doubly-linked circular list of all buffers submitted for IO while
	 * checkpointing. [j_list_lock]
	 */
	struct journal_head	*t_checkpoint_io_list;
	/*
	 * Doubly-linked circular list of metadata buffers being shadowed by log
	 * IO.  The IO buffers on the iobuf list and the shadow buffers on this
	 * list match each other one for one at all times. [j_list_lock]
	 */
	struct journal_head	*t_shadow_list;
	/*
	 * List of inodes whose data we've modified in data=ordered mode.
	 * [j_list_lock]
	 */
	struct list_head	t_inode_list;
	/*
	 * Protects info related to handles
	 */
	spinlock_t		t_handle_lock;
	/*
	 * Longest time some handle had to wait for running transaction
	 */
	unsigned long		t_max_wait;
	/*
	 * When transaction started
	 */
	unsigned long		t_start;
	/*
	 * When commit was requested
	 */
	unsigned long		t_requested;
	/*
	 * Checkpointing stats [j_checkpoint_sem]
	 */
	struct transaction_chp_stats_s t_chp_stats;
	/*
	 * Number of outstanding updates running on this transaction
	 * [t_handle_lock]
	 */
	atomic_t		t_updates;
	/*
	 * Number of buffers reserved for use by all handles in this transaction
	 * handle but not yet modified. [t_handle_lock]
	 */
	atomic_t		t_outstanding_credits;
	/*
	 * Forward and backward links for the circular list of all transactions
	 * awaiting checkpoint. [j_list_lock]
	 */
	transaction_t		*t_cpnext, *t_cpprev;
	/*
	 * When will the transaction expire (become due for commit), in jiffies?
	 * [no locking]
	 */
	unsigned long		t_expires;
	/*
	 * When this transaction started, in nanoseconds [no locking]
	 */
	ktime_t			t_start_time;
	/*
	 * How many handles used this transaction? [t_handle_lock]
	 */
	atomic_t		t_handle_count;
	/*
	 * This transaction is being forced and some process is
	 * waiting for it to finish.
	 */
	unsigned int t_synchronous_commit:1;
	/* Disk flush needs to be sent to fs partition [no locking] */
	int			t_need_data_flush;
	/*
	 * For use by the filesystem to store fs-specific data
	 * structures associated with the transaction
	 */
	struct list_head	t_private_list;
};

其中比较重要的字段为t_state,t_state描述了事务当前的状态。

 

ext4日志系统分析(一) 一、背景ext4文件系统用的是jbd2日志系统。本篇博客从内核源码着手,大致分析jbd2日志系统。二、源码分析我这里用的是source insight工具来分析linux内核的源码。 内核版本为3.10.0。 首先我们搜索一下jbd2关键字。可以看到如下图所示: 可以看到,在fs/jbd2中存在6个文件。这个fs/jbd2中存的就是jbd2日志系统的代码。 一步一步来,先看看插入jbd2 阅读详情

相关推荐

Linux磁盘及文件系统管理

Linux磁盘及文件系统管理 使用fdisk进行磁盘管理 fdisk(基于MBR):IBM的老牌分区工具,支持绝大多数操作系统,几乎所有的linux发型版本都装由fdisk,包括rescue模式下的linux。 fdisk:     fdisk的命令只有具有超级用户权限才能运行;     fdisk –l:列出所有安装的磁盘及其分区信息;     fdisk 磁盘位置:可对磁盘进行分区操作...

weixin_42718198的博客 720

Ext4日志优化-iJournaling

根据上文的分析,我们归纳出Ext4的日志机制有如下的不足,并导致I/O延迟增加JBD2串行事务依赖,为了避免并发提交重叠事务带来的一致性风险,每个时刻只能有一个事务处于commiting状态。JBD2组合事务提交,JBD2事务中可能包含多个不相干的inode,当发起事务提交时,会将所有文件的数据块都提交。JBD2组合事务可能使延迟分配失效,因为组合事务提交的原因,不相干的文件也被提交,导致延迟分配策略失效。

梦幻之巅 2317

49、Linux文件系统:inode、日志、数据分配与碎片化管理

本文深入解析了Linux EXT文件系统的核心机制,包括inode的管理、日志功能的实现、数据分配策略以及碎片化控制。通过理论分析与实验验证,探讨了文件系统的性能优化方法,并提供了实用工具与调整建议,以帮助用户构建高效稳定的存储环境。

tgb345678的博客 176

Ext3日志原理(续)

1. 与日志相关字段的初始化 <super.c> static int parse_options (char *options, struct super_block *sb, unsigned long *inum, unsigned long *journal_devnum, ext3_fsblk_t *n_blocks_...

weixin_30938149的博客 115

44、Linux文件系统:inode、日志、数据分配与修复

本文深入解析了Linux文件系统的核心概念和管理方法,涵盖inode结构、日志功能的原理与选项、EXT文件系统的数据分配策略、碎片化问题及修复技术。通过实验和流程图展示了文件系统修复的一般流程,并提供优化文件系统性能的最佳实践,帮助用户更好地管理和维护Linux系统。

jupyter5notebook的博客 159

26、存储与文件系统管理:工具与格式详解

本文详细介绍了存储与文件系统管理中常用的工具如 fdisk、gdisk 和 parted 的使用方法,以及常见的文件系统格式如 XFS、ext4 和 ext3 的特点。文章还涵盖了分区创建、删除、格式化和挂载等操作,并提供了文件系统选择建议和管理命令,帮助用户高效管理 Linux 系统中的存储设备。

116

Ext文件系统中的日志处理

下面从ext2_new_inode和ext3_new_inode看看日志和没有日志的区别,在没有涉及到写操作的时候是和原来一样的,下面是在要写inode位图的代码: // 取得写入权限 err = ext3_journal_get_write_access(handle, bitmap_bh); // 设置位图中的位 if (!ext3_set_bit_atomic(sb_bgl_lock(

钢琴师 2708

COMSOL仿真教程—激光烧蚀

本例使用二维模型,将来自激光的入射热通量模拟为金属表面上空间分布的热源,从而得到金属的烧蚀过程和瞬态温度分布。

qq_40977332的博客 2万+

linux内核从源码详解ext4文件系统

rec_len属性标记一个条目的长度,这个长度可能超过结构体+name实际长度,甚至是远超,可能是文件夹内删除条目时调整,也可能是占位,因为文件夹类型的文件总是和文件系统的块大小整数倍的,如果文件夹内只有一个条目(即使不包含。都是硬盘中实际存储的内容,并不方便在内存中直接使用,有的要做大小端转化,有的要高位地位合并,所以下面的信息就是把常用的信息处理好,方便直接使用。获取设备的逻辑块大小,ext4的最小块大小为1024B,如果设备的块小于ext4的最小块则默认为ext4的最块。

kiraskyler的博客 1610

具身智能ACT模型在lerobot机械臂上的实践与优化

本文详细介绍了如何在低成本lerobot机械臂上实践与优化具身智能ACT模型。从环境搭建、数据采集到模型原理与代码实战,提供了完整的入门指南。重点分享了通过数据增强、混合开源数据集及模型微调等策略,有效提升模型在抓取放置任务中的泛化能力与鲁棒性,为机器人学习爱好者提供了宝贵的实战经验。

weixin_29081703的博客 170

FPGA波束形成:从算法到硬件的艺术之旅

本文深入探讨了FPGA在波束形成技术中的应用,从算法原理到Verilog硬件实现的全过程。文章详细分析了FPGA并行处理、低延迟和可重构特性如何优化波束形成系统性能,并提供了Verilog关键模块代码示例和资源优化策略,为工程师实现高效FPGA波束形成解决方案提供实用指导。

tea88的博客 1046

运维技术之文件系统(File System for 0peration and Maintenance Technology)

‌‌文件系统是一种用于存储和组织计算机数据的系统,它使得数据的访问和查找变得容易。‌ 文件系统使用文件和‌树形目录的抽象逻辑概念,代替了‌硬盘和光盘等物理设备使用数据块的概念。用户使用文件系统保存数据时,不需要关心数据实际保存在硬盘的哪个数据块上,只需要记住文件的所属目录和文件名。文件系统自动管理存储空间,包括分配和释放空间,用户只需要记住数据被写入到了哪个文件中。

Linux运维老纪的博客 944

【ARFoundation自学04】AR Tracked Image 图像追踪识别与对应类的调用

1.添加组件 2.创建图像识别库 3.创建识别后追踪的物体(UI、模型等)

leoysq的博客 2560

服务器数据恢复——Ext4文件系统使用fsck后mount不上的数据恢复案例

块组描述符和超级块在块中的位置:当块大小为2个扇区时,0号块是引导程序或者保留块,超级块起始于1号块。3、重建(恢复)超级块;.journal日志文件里,块组描述符表存储在超级块的后面,所以找块组描述表之前可以先找到超级块。打开var文件夹里的所有文件的目录信息,找到kyproc目录的信息,12 32 EE 00是其i-节点号,10 00表示其目录项长度,06表示其文件名称长度,02表示其文件类型为目录。块组描述符表:每个块组都对应一个块组描述符,这些块组描述符统一放在文件系统的前部,称为块组描述符表。

beiya123的博客 1091

DDD系列 - 第12讲 如何在DDD中实现Query服务(轻量化CQRS)

轻量化CQRS、整合Repository和DAO的优势。

罗小爬的技术宝书 267

无迹卡尔曼滤波 (UKF, Unscented Kalman Filter) 算法详解及案例分析

无迹卡尔曼滤波是一种用于估计非线性系统状态的递归算法。其目标是通过结合系统模型和观测数据,估计系统的最优状态。

闲人编程的博客 2631

在linux中挂载磁盘ext3和ext4之间的区别

转载:https://blog.youkuaiyun.com/zhaoyoulin2016/article/details/80221101 Linux kernel 自 2.6.28 开始正式支持新的文件系统 Ext4。 Ext4 是 Ext3 的改进版,修改了 Ext3 中部分重要的数据结构,而不仅仅像 Ext3 对 Ext2 那样,只是增加了一个日志功能而已。Ext4 可以提供更佳的性能和可靠性,还有更...

xuanyuanqinger的博客 1864

【人工智能】Gemini怎么使用智能体的能力? Gemini Gems: 定制你的AI智能体

Gems 是 Gemini 的定制版本。你可以通过设定特定的指令(Instructions),让它变成你需要的专家。一旦创建,它会记住这些设定,你不需要在每次对话时重复输入背景信息。目前创建和使用自定义 Gems 通常需要订阅(Google One AI Premium 计划)。对于大多数用户来说,Gemini Advanced 中的 Gems是使用智能体能力的最直接方式。它能让你把重复性的提示词封装成一个好用的工具。

奶爸的编程之路,也就一周冷个三天 782

架构设计:系统存储(4)——块存储方案(4)

上一节我们讨论了Ext3文件系统相对于Ext2文件系统最大的改进点——日志模式。但是Ext2文件系统中另外一个问题还没有做太多调整:因为存储大文件时Ext2/Ext3文件系统会启用二级、三级甚至四级间接指针建立Inode和data block的联系,这样的做法会降低文件系统上对大文件的读写能力。Ext4文件系统的细节文章就不再过多介绍了,因为系统存储这个专题到到现在已经从最底层硬件设备开始到阵列结构再到操作系统上的文件系统进行了说明,相信读者已经理解了为什么这种传统的存储方案被称为块存储方案了。

smart_an的专栏 1065

容器化部署指南——Docker/K8s环境下的OpenClaw实践(附Dockerfile)

通过本文的详细指导,你已经掌握了OpenClaw在Docker和Kubernetes环境中的容器化部署方法。从基础镜像构建到高级部署策略,从开发环境到生产环境,你现在已经具备了完整的容器化部署能力。 容器化技术为OpenClaw提供了灵活、可扩展、可移植的部署方案,能够满足不同规模和需求的应用场景。通过合理使用Docker和Kubernetes,你可以实现高效的部署管理和运维自动化。 在实际应用中,建议根据具体的业务需求选择合适的部署策略,并结合监控、日志、安全等最佳实践,确保系统的稳定性和可靠性。同时

博客 498

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

oracle只读文件系统,ext4文件系统变为只读

commit d123a55f85f5116d686dac80c768ee5c34ec8e06Author: Vegard Nossum Date: Thu Jul 14 23:21:35 2016 -0400ext4: short-cut orphan cleanup on errorcommit c65d5c6c81a1f27dec5f627f67840726fcd146de upstre...

weixin_30590161的博客 1201

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

EXT3与EXT4的主要区别

Ext4,Ext3的特点和区别             今天,有个后辈问我Ext4的优点,一下子不知道该怎么说,以前只知道Ext4启动快点,对文件恢复和碎片整理好一点。但具体怎样,怎没研究过。就顺手谷哥下。查到以下资料,谨供大家参考。             Linux kernel 自 2.6.28 开始正式支持新的文件系统 Ext4。 Ext4 是 Ext3 的改进版,修改了 Ext3 中

tanyit的专栏 1566

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

linux ext3和ext4的区别

文章来源:Ext4,Ext3的特点和区别     作者:zxboom 今天,有个后辈问我Ext4的优点,一下子不知道该怎么说,以前只知道Ext4启动快点,对文件恢复和碎片整理好一点。但具体怎样,怎没研究过。就顺手谷哥下。查到以下资料,谨供大家参考。             Linux kernel 自 2.6.28 开始正式支持新的文件系统 Ext4。 Ext4 是 Ext3

AJAX20032007的专栏 760

文件系统与磁盘分区

superblock超级区块 记录文件系统的整体信息  inode 记录文件的属性 一个文件占用一个inode,同时记录此文件的数据所在的block号码   block  记录文件的内容  若文件太大会占用多个block 日志式文件系统用来处理文件存储过程中系统突然中断的情况  ext3/4 异步处理用来处理磁盘,内存读取速度差别太大的问题 挂载点一定是目录,该目录为进入该文件系统的入口

shihuangdeng898的博客 377

linux进入系统报错ext4,已解决: 启动登录总是报错-petalinux2016.1编译的系统 - Community Forums...

大家好 我使用的是petalinux2016.1我配置为 BOOT.BIN 存放在QSPI-Flash image.ub和system.dtb 放在SD卡 SD卡的ext4分区作为文件系统。编译完后 将工程目录下的build/linux/rootfs/targetroot/的文件 文件压缩 然后解压到 SD卡的ext4分区。然后启动板子 登录一直不成功 账号和密码都是root 文件系...

weixin_35912365的博客 4234
上一篇: ext4_dirty_inode与ext4_do_update_inode函数详解
下一篇: Ubuntu设置默认内核启动版本
SweeNeil
博客等级 码龄9年 251粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值