深入理解ext4
文章平均质量分 80
Ext4文件系统是linux内核的主要文件系统,现在越来越多的厂商开始使用ext4实现自己的业务,Ext4社区是当前讨论最热烈的社区。
YoungerChina
目前从事存储与计算相关的架构设计和研发管理工作
展开
-
EMMC与RAND的区别
EMMC与RAND的区别说到两者的区别,必须从flash的发展历程说起,因为两者都属于flash的范畴。原创 2013-10-28 22:21:20 · 7308 阅读 · 0 评论 -
Ext4中内存使用技巧的一点思考
今天在分析Ext4文件系统的时候,看到两个函数ext4_kvzalloc()/ext4_kvfree(),想到以前在使用kzalloc()/kmalloc()带来的内存分配失败问题,不得不感叹社区牛人的思路是多么的......(海量褒义词)原创 2013-11-19 19:48:45 · 3086 阅读 · 1 评论 -
[ext4]13 空间管理 - Prealloc分配机制
在ext4系统中,对于小文件和大文件的空间申请请求,都有不同的分配策略。对用小文件的空间请求,ext4尝试从一种叫per-CPU local group中分配空闲空间。Per-CPU Local group就是所有该CPU所执行的分配行为共享的空间,目的是保证这些小文件的聚集在一起,便于访问。Per-CPU Local group就是per-CPU prealloc空间。对于大文件的空间请求,ext4尝试从一种叫per-inode preallo空间中分配空闲空间。这点就像Ext3系统的保留空间一样,Ext原创 2014-04-02 22:39:43 · 4832 阅读 · 0 评论 -
Ext4专题文章索引
Ext4专题目录本索引主要记录Ext4学习过程中的原理分析、代码理解。原创 2017-08-10 13:26:23 · 2241 阅读 · 0 评论 -
基于Extent 的文件存储(fiemap)
现代很多文件系统都采用了 extent 替代 block 来管理磁盘。 Extent 就是一些连续的 block,一个 extent 由起始的 block 加上长度进行定义。原创 2011-12-15 23:03:55 · 7607 阅读 · 0 评论 -
[IO系统]18 IO调度器 - CFQ
CFQ试图为竞争块设备使用权的所有进程分配一个请求队列和一个时间片,在调度器分配给进程的时间片内,进程可以将其读写请求发送给底层块设备,当进程的时间片消耗完,进程的请求队列将被挂起,等待调度。原创 2017-05-17 08:50:31 · 4158 阅读 · 0 评论 -
[IO系统]17 IO调度器-DEADLINE
Deadline 这种调度器对读写 request 进行了分类管理,并且在调度处理的过程中读请求具有较高优先级。这主要是因为读请求往往是同步操作,对延迟时间比较敏感,而写操作往往是异步操作,可以尽可能的将相邻访问地址的请求进行合并,但是,合并的效率越高,延迟时间会越长。因此,为了区别对待读写请求类型, deadline 采用两条链表对读写请求进行分类管理。但是,引入分类管理之后,在读优先的情况下,写请求如果长时间得到不到调度,会出现饿死的情况,因此, deadline 算法考虑了写饿死的情况,从而保证在读优原创 2017-05-17 08:40:15 · 2355 阅读 · 0 评论 -
[IO系统]16 IO调度器-NOOP
Noop调度算法也叫作电梯调度算法,它将IO请求放入到一个FIFO队列中,然后逐个执行这些IO请求,当然对于一些在磁盘上连续的IO请求,Noop算法会适当做一些合并。这个调度算法特别适合那些不希望调度器重新组织IO请求顺序的应用。原创 2017-03-16 20:17:17 · 3149 阅读 · 0 评论 -
[IO系统]15 文件访问的五种模式
文件访问时一种比较复杂的活动,访问文件的模式有多种,在本文中主要介绍其中的五种:标准模式、同步模式、内存映射模式、直接IO模式、异步IO模式,前四种都是同步,之后最后一种才是异步IO。原创 2017-02-22 11:53:16 · 1882 阅读 · 1 评论 -
[IO系统]14 IO调度层
IO调度器(IO Scheduler)是操作系统用来决定块设备上IO操作提交顺序的方法。存在的目的有两个,一是提高IO吞吐量,二是降低IO响应时间。然而IO吞吐量和IO响应时间往往是矛盾的,为了尽量平衡这两者,IO调度器提供了多种调度算法来适应不同的IO请求场景。原创 2017-02-22 11:53:00 · 1574 阅读 · 0 评论 -
[IO系统]13 通用块层-向通用块层提交IO
前面介绍了块设备的相关概念、 buffer_head和bio结构体。接下来主要分析如何向通用块层提交IO。原创 2017-02-22 11:52:40 · 3289 阅读 · 0 评论 -
[IO系统]12 通用块层-结构体
通用块设备层( Generic Block Layer)是内核的一个组成部分,它处理系统所有对块设备的请求。有原创 2017-02-20 19:48:43 · 1827 阅读 · 0 评论 -
[IO系统]11 回写机制(writeback)
在Linux-3.2新内核中,page cache和buffer cache的刷新机制发生了改变。放弃了原有的pdflush机制,改成了bdi_writeback机制。这种变化主要解决原有pdflush机制存在的一个问题:在多磁盘的系统中,pdflush管理了所有磁盘的page/buffer cache,从而导致一定程度的IO性能瓶颈。bdi_writeback机制为每个磁盘都创建一个线程,专门负责这个磁盘的pagecache或者buffer cache的数据刷新工作,从而实现了每个磁盘的数据刷新程序在线程原创 2017-02-15 08:10:19 · 8553 阅读 · 0 评论 -
[IO系统]10 缓存写回机制
Linux IO系统的脏页写入的到磁盘,主要由以下情况来触发:1. 内存不足或内存空间紧张,需要通过回写脏页来回收内存;2. 脏页已经更新了较长时间,时间上已经到了临界值,需要及时回写保持内存和磁盘上数据一致性;3. 第三方英语或命令主动触发脏页回刷到磁盘;4. write操作时balance回写要求。原创 2017-02-15 08:06:33 · 2899 阅读 · 0 评论 -
[IO系统]09 直接IO与缓存IO
文件系统IO分为DirectIO和BufferIO,其中BufferIO也叫Normal IO。原创 2017-02-07 17:25:31 · 1538 阅读 · 1 评论 -
[IO系统]08 IO读流程分析
本文从整体来分析缓存IO的控制流和数据流,并基于IO系统图来解析读IO原创 2017-02-07 09:32:15 · 2521 阅读 · 0 评论 -
[IO系统]07 IO写流程分析
本文从整体来分析缓存IO的控制流和数据流,并基于IO系统图来解析IO写流程原创 2017-02-07 08:07:33 · 3256 阅读 · 2 评论 -
[IO系统]06 因OPEN建立的结构体关系
前述章节已经说明了open是如何打开文件的,本章节将说明open打开文件的过程中初始化了哪些结构体及这些结构体之间建立的联系原创 2017-01-24 15:30:37 · 1358 阅读 · 0 评论 -
[IO系统]05 open流程分析
说到IO读写流程,首先要了解操作系统是如何通过文件路径在存储设备上定位导致相应文件的。原创 2017-01-24 15:17:51 · 2643 阅读 · 0 评论 -
[IO系统]04 节点路径搜索
当进程必须识别一个文件时,就把它的文件路径名传递给某个VFS系统调用,如open()、mkdir()、rename()或stat()等。那么怎么根据给定的文件路径名在内存中找到和建立代表着目标文件或目录的dentry结构和inode结构哪?原创 2017-01-24 14:41:29 · 1885 阅读 · 0 评论 -
[IO系统]03 虚拟文件系统(VFS)
VFS:Virtual File System虚拟文件系统,或Virtual File Switch虚拟文件转换。原创 2017-01-24 14:37:17 · 1753 阅读 · 0 评论 -
[IO系统]02 用户态的文件IO操作
在工作中,经常会进行文件创建、更新、删除等操作,但是作为存储领域技术人员,我们又对其过程了解多少哪。本系列文章将会对文件操作进行系统的分析和梳理,与大家共同进步。原创 2017-01-06 18:41:03 · 1725 阅读 · 0 评论 -
[IO系统]01 IO子系统
从整个IO调用链层面俯视整个链路,其穿越“千山万水”,最终会到胜利的彼岸——“设备层”原创 2017-01-06 18:39:32 · 3432 阅读 · 0 评论 -
[ext4]空间管理 - 与分配相关的关键数据结构
在块分配机制中,涉及到几个主要的数据结构。通过ext4_allocation_request描述块请求,然后基于块查找结果即上层需求来决定是否执行块分配操作。在分配过程中,为了更好执行分配,记录一些信息,需要对分配行为进行描述,就有结构体ext4_allocation_contex。在搜寻可用空间过程中,是有可能使用预分配空间的,因此还需要有能够描述预分配空间大原创 2014-04-01 22:39:15 · 5126 阅读 · 0 评论 -
[ext4]空间管理 - 查找块
在文件系统中,当需要执行写操作时,肯定是需要查找需要写入的块。那么如何查找块哪? 在Ext4系统中,有两个函数是可能执行查找操作的:ext4_getblk()、ext4_get_block()。其中ext4_getblk(),原型如下:structbuffer_head *ext4_getblk(handle_t *handle, struc原创 2014-04-01 22:35:53 · 4819 阅读 · 2 评论 -
[ext4]空间管理 - 分配机制
在Ext4系统中,存在很多分配策略,比如预分配、多块分配、延迟分配等原创 2014-04-01 22:34:48 · 4737 阅读 · 0 评论 -
[ext4] 磁盘布局 - extent tree
传统的类Unix文件系统,比如Ext3,都是使用一个间接数据块映射表来记录每一个数据块的分配情况的。但是这种机制对于超大文件的存储是有缺陷的,特别是当对超大文件进行删除和截断操作时。映射表会对每一个数据块进行记录,而一个超大文件将占有很多的数据块,因此造成映射表将变得无比臃肿,难于维护。Ext4引入了一个新的概念,叫做“Extents”。一个Extents是一个地址连续的数据块(block)的原创 2014-03-27 14:31:44 · 7384 阅读 · 0 评论 -
[ext4]磁盘布局 - inode bitmap & table
在[磁盘布局 group部分]已经介绍过ext4的整体布局,其中存在两个与inode有关的名称:inode bitmap和inode table。Inode bitmap,用于表示inode table中对应的inode entry是否已经使用。Bitmap中每个位对应于一个table中inode entry。一个group中Inodebitmap只占用一个block,并且block所有的空间翻译 2014-03-27 14:28:30 · 6664 阅读 · 3 评论 -
[ext4]010 磁盘布局 - 如何查找inode的磁盘位置
在linux系统中,任何一个文件,都有一个inode与其对应,也就是说,在一个文件系统中,一个文件都有唯一的ino来标示他,那么在ext4系统中,ino是如何确定的哪?当我们新创建的文件或目录时,会调用ext4_create函数,其调用路径是:ext4_create -> ext4_new_inode。就是在函数ext4_new_inode定义了inode->ino。分析函数ext4_ne原创 2014-03-21 08:53:15 · 8295 阅读 · 1 评论 -
[ext4]09 磁盘布局 - superblock备份机制
如果sparse_super特性flag被设置(即开启了sparse_super特性),那么super_block和组描述符的副本只会保存在group索引为0或3、5、7的整数幂。如果没有设置sparse_super特性flag,super_block和组描述符的副本将保存在每一个group中。原创 2014-03-13 19:40:02 · 5876 阅读 · 0 评论 -
[ext4]08 磁盘布局 - CheckSums
从2012年开始,Ext4和jbd2的元数据中都开始加入checksums。特性标识是metadata_csum。Checksum算法是在super_block中指定:struct ext4_super_block {… __u8 s_log_groups_per_flex; /* FLEX_BG group size */ __u8 s_checksu翻译 2014-03-27 14:19:50 · 4009 阅读 · 0 评论 -
[ext4]07 磁盘布局 - 块/inode分配策略
Ext4系统从设计上就认为数据局部性是文件系统的文件系统的一个理想品质。在机械硬盘上,相关联的数据存放在相近的blocks上,可以使得在访问数据时减少磁头驱动器的移动距离,从而加快IO访问。在SSD上,没有像磁头一样的移动组件。但是数据局部性可以增大请求大小从而降低请求数量。同时可以尽可能的集中擦写块,从而提高重写速度。对减少碎片也很有帮助。Ext4解决碎片问题的第一个方法是,mult翻译 2014-03-24 20:09:32 · 5612 阅读 · 0 评论 -
[ext4]06 磁盘布局 - 特殊inode
Ext4预留了一些inode做特殊特性使用,见下表:inodePurpose 0不存在,Ext4中不存在inode 0. 1存放损坏的数据块链表2根目录3User quota. 用户quota索引4Group原创 2014-03-24 20:08:28 · 3789 阅读 · 0 评论 -
[ext4]05 磁盘布局 - 延迟块组初始化
延迟块组初始化,Ext4的新特性。如果对应的特性标识uninit_bg置位,那么inode bitmap和inode tables就不会初始化。延迟块组初始化特性特性可以减少格式化耗时。延迟块组初始化特性,默认是开启的。root@ubuntu:~# time mkfs.ext4 -F /dev/sdc…real 0m0.838suser 0m0.072s原创 2014-03-24 20:07:02 · 3663 阅读 · 0 评论 -
[ext4]04 磁盘布局 - Meta Block Groups
Meta Block Groups,可以翻译为元块组集。如果不采用Meta Block Groups特性,在每个冗余备份的超级块的后面是一个完整的(包含所有块组描述符的)块组描述符表的备份。如前所述(group分析中已经说明,group最大为128M,即2^27 bytes),那么一个group全部存储groups元数据,才会有2^27 / 64=2^21个,更何况,也无法全部用来存储grou原创 2014-03-24 20:06:24 · 7214 阅读 · 5 评论 -
[ext4]03 磁盘布局 – Flexible group分析
Flexible Block Groups (flex_bg),我称之为“弹性块组”,是EXT4文件系统引入的一个feature。所谓Flexible Block Groups,就是将连续的多个物理block groups绑在一起组成一个逻辑块组,这个逻辑块组就称之为Flex_group(也就是flex_bg)。在一个Flex_group中,第一个物理block group是存放当前Flex_group的bitmap、inode表。比如Flex_group大小是4,那么group0将(按顺序)存放共原创 2013-07-30 22:05:26 · 5961 阅读 · 5 评论 -
[ext4]磁盘布局 - group分析
ext4文件系统的磁盘布局是先把磁盘分成一个个相同大小的block块(每个block块的大小默认是4K),然后把这些block块合成一个个group。group大小最大为256M(默认为256M),其计算公式:Group_size = (blk_size*8)*blk_size=4096*8*4096= 32768*4096=128M更详细一点如下,针对第一个group(即group0原创 2014-03-13 19:37:04 · 9363 阅读 · 4 评论 -
[ext4]01 磁盘布局 - block分析
ext4文件系统最基本的分配单元是“block”(块)。block是由一组连续的sectors来组成,其大小介于1k~4K之间,当然不可能是任意值,只能是2的整数次幂个sectors。然后连续的blocks再组成group。Block的大小是在mkfs时指定的,默认是4K。默认情况下,系统可以含有2^32个blocks,到那时如果开启“64bit”特性,可以支持2^64个blocks。原创 2014-03-13 19:34:49 · 10483 阅读 · 1 评论 -
Linux 文件系统概述
linux中有很多种文件系统,如,ext2,ext3,ext3,sysfs,procfs等。每种文件系统都有自己的特性。 linux文件系统体系结构通过使用一组通用的API函数,实现了对不同具体文件系统的抽象化。一、文件系统的体系结构 图1中显示了用户空间和内核中与文件系统相关的主要组件之间的关系 图1文件系统的体系结构原创 2011-12-14 00:01:27 · 5719 阅读 · 0 评论