zz``文件系统磁盘布局与I/O映射

sysnote.org/2015/08/06/fs-io-map/

这个大牛博客不错,可以收藏并扩散学习下

本文主要对文件系统的磁盘布局进行概要的梳理,并在此基础上分析文件系统I/O到块I/O的映射机制。

1.文件系统磁盘布局

首先文件系统层面来阐述文件与块设备的关系。

1.1文件描述符与inode

应用程序在访问文件时都会先打开文件,在内核中,对应每个进程,都会有一个文件描述符表表示这个进程打开的文件,但是用户程序不能直接访问内核中的文件描述符表,而只能使用文件描述符表的索引(一个整数),这些索引就被称为文件描述符。当调用open 打开一个文件或创建一个新文件时,内核分配一个文件描述符并返回给用户程序,该文件描述符表项中的指针指向新打开的文件。

文件描述表中每一项都是一个指针,指向一个用于描述打开的文件的数据块–file对象,file对象中描述了文件的打开模式,读写位置等重要信息,当进程打开一个文件时,内核就会创建一个新的file对象。需要注意的是,file对象不是专属于某个进程的,不同进程的文件描述符表中的指针可以指向相同的file对象,从而共享这个打开的文件。file对象有引用计数,记录了引用这个对象的文件描述符个数,只有当引用计数为0时,内核才销毁file对象,因此某个进程关闭文件,不影响与之共享同一个file对象的进程。

file对象中包含一个指针,指向dentry对象。dentry对象代表一个独立的文件路径,如果一个文件路径被打开多次,那么会建立多个file对象,但它们都指向同一个dentry对象。inode对象代表一个独立文件,inode 对象包含了最终对文件进行操作所需的所有信息,如文件系统类型、文件的操作方法、文件的权限、访问日期等。

1.2文件系统磁盘布局

在了解了文件与inode的对应关系后,为了阐述文件与具体的物理块的映射关系,必须先理解文件系统的磁盘布局。下图是ext2/ext3文件系统的磁盘布局。

ext3文件系统将其所管理的磁盘或者分区(引导块除外)中的块划分到不同的块组中。每个块组大小相同,当然最后一个块组所管理的块可能会少一些,其大小在文件系统创建时决定,主要取决于文件系统的块大小。每个块组包含一个块位图块,一个inode位图块,一个或多个块用于描述 inode 表和用于存储文件数据的数据块,除此之外,还有可能包含超级块和所有块组描述符表。
块位图用于描述该块组所管理的块的分配状态,如果某个块对应的位未置位,那么代表该块未分配,可以进行分配使用。inode位图用于描述该块组所管理的inode的分配状态,每个inode对应文件系统中唯一的一个号,如果inode位图中相应位置位,那么代表该inode已经分配出去;否则可以使用。

1.3文件系统逻辑块映射

下面就来阐述文件与物理块的映射关系。
ext2/ext3采用的是直接+间接方式来存储这些地址映射:其中0~11是存储用户数据的物理块号(直接寻址),12是存储一级地址映射表数据的物理块地址(一级间接寻址),地址映射表中的每一项都是另外一个物理块号。13存储二级地址映射表地址,14存储三级地址映射表地址。这种方式对于小文件比较合适,对于大文件来说要经过很多次间接寻址,效率很低。

而ext4则采用的是extents的映射方式:[logicalStartBlock,physicalStartBlock, blockCount]。ext4中一个inode的大小是256Bytes,因此一个inode能容纳的extent有限,当文件增大到一定程度的时候,extent无法以数组形式存放,就会以B+tree的形式存放。相比于ext3的间接映射方式,extents的方式增加了大文件的效率并减少了分裂文件。

通过上面的阐述,我们知道了一个文件和具体物理块的对应关系,那么问题来了:用户以4KB大小对文件写一个I/O,对于磁盘来说是一个I/O吗?如果采用direct方式呢?如果是16KB大小的一个用户I/O呢?下面就从文件I/O到块I/O的映射机制来进行阐述。

2.文件I/O到块I/O的映射

文件系统创建时会指定块大小(一般512,1024,2048,4096字节),一个文件会根据文件系统块大小和文件的大小切分成各个逻辑块,文件系统就会为这些逻辑块分配空闲的物理块(ext4文件系统是延迟分配的),用户程序对一个文件进行读写时,文件系统就会根据对应的逻辑块找到具体的物理块,然后下发io请求到块设备层进行处理。

用户调用read()或write()系统调用进行io读写时,对应的缓冲区buf是用户进程空间的虚拟地址,在内核处理时将虚拟内存映射到到物理内存页。如果是缓存I/O,会经过用户缓冲到内核缓存(page cache)的拷贝,而Direct I/O则可以直接让内核态映射用户态虚拟内存对应的物理页,少了一次拷贝的过程。在从文件I/O到块I/O的映射处理过程中,缓存I/O的刷脏页和Direct I/O的方式类似,这里以Direct I/O进行简要分析,详细的可以去看内核代码里的submit_page_action,__bio_add_page等函数的实现。

用户程序在使用Direct I/O时,使用的buffer和读写的长度需要512字节的整数倍对齐,之所以这样要求,是因为非对齐的请求在底层构造bio时有可能会因为PageSize边界带来额外的I/O,从而需要多次下发请求,降低了效率。

一个文件I/O下发到底层会变成多少个块I/O,取决于文件系统块大小和用户缓冲区的对齐长度,以及该文件的逻辑块对应的物理块是否连续。下面以具体的例子来进行说明。
1)文件系统块大小是1KB ,用户发起一个4KB的请求,申请的buffer在一个页中(或者direc io下的按照4KB对齐)。图中绿色和红色方块里的数字表示对应的真实的物理块的块号,要读写的这个文件的4KB的数据,按照文件系统块大小切分,分成4个逻辑块(0~3),其中逻辑块0对应物理块60,逻辑块1对应物理块61,逻辑块2对应物理块200,逻辑块3对应物理块201(这些对应关系是由文件系统分配块时确定的)。逻辑块0和1对应的物理块是连续的,并且因为块大小是1KB,所以可以放在一个bio里,而逻辑块2和3对应的物理块与逻辑块0和1的物理块不连续,所以不能放在一个bio里,需要新生成一个bio。这样就调用了两次submit_bio下发到通用块层去处理,经过调度层(有可能和其他请求连续,从而进行合并),最后通过块设备驱动层下发到底层磁盘上。

2)文件系统块大小是1KB, 用户发起一个4KB的请求,申请的buffer不在一个页中(或者direc io下的按照1KB对齐)。请求落到两个页中,并且因为逻辑块2和逻辑块3对应的物理块不连续,所以构造bio时变成了3个bio(如果两个页中的逻辑块对应的物理块是连续的,则会放到一个bio里,每个bio可以包含多个页)。因此就会有3次submit_bio的调用。

3)文件系统块大小是4KB ,用户发起一个4KB的请求,申请的buffer在一个页中(或者direc io下的按照4KB对齐)。这里刚好一个页里只有1个逻辑块,所以只有一次submti_bio。

上面的几个示例就解释了第3节末尾提出的问题,一个文件I/O下发到底层会变成多少个块I/O,取决于文件系统块大小和用户缓冲区的对齐长度,以及该文件的逻辑块对应的物理块是否连续。

3.参考资料

1.《深入理解linux内核》
2.《Linux设备驱动程序》
3.《unix高级环境编程》
4.Linux内核源码3.10.45



zz``文件系统磁盘布局与I/O映射

原文地址:https://www.cnblogs.com/xiaodoujiaohome/p/11649833.html

时间: 2025-01-15 19:55:21

zz``文件系统磁盘布局与I/O映射的相关文章

1. 文件系统——磁盘分区、各目录功能、硬盘

一.磁盘分区及文件访问入口 在前文中介绍过,Linux的整个文件系统像一棵倒置的数,最顶层的是根文件系统,其下有很多一级子目录,一级子目录下面是二级子目录,依此类推: /:根目录 /bin,/sbin:二进制程序,操作系统自身启动运行就需要用到的程序. /bin下为普通用户使用的程序:/sbin下为管理员用户使用的程序 /usr/bin,/usr/sbin:二进制程序,基本的系统管理工具. /usr/bin下的程序普通用户都能用: /usr/sbin为管理命令. /usr/local/bin, 

12.文件系统——磁盘管理之RAID概述

一.什么是RAID 从上个世纪80年代起,主流的硬盘接口主要有两类: A.IDE:用于桌面系统 B.SCSI:用于工业系统(因为转速高,平均巡道时间短,性能较IDE好) SCSI的性能虽然优于IDE,但其成本约是IDE的五倍以上,故无法广泛应用.人们为了节省成本的同时保持性能,于是设计出了一种方案,即将很多廉价的IDE设备联合起来,当做一块硬盘使用.这种将多块廉价IDE设备并行联合使用的模式就是RAID--廉价冗余磁盘阵列(Redundent Array ofInexpensive Disk).

Win10无法安装提示磁盘布局不受UEFI固件支持怎样解决

微软在推出Win10系统以后,就向Win7和Win8.1系统用户提供了免费升级Win10系统的推送,但是用户在安装Win10系统的时候,却有一部分用户反映,遇到提示“无法安装Windows,因为这台电脑的磁盘布局不受UEFI固件支持”,出现这样的问题是怎么回事呢?这里就让小编来跟大家介绍下,出现这样的问题时我们应该怎样进行解决. 原因分析 Win10系统新增UEFI检测机制,在BIOS开启了UEFI时,如果硬盘分区表格式不是GPT,则会提示无法安装win10,也就是说UEFI+GPT或Legac

linux系统-文件系统-磁盘配额

linux系统-文件系统-磁盘配额 一 简单定义 限定用户的磁盘使用的空间 二 开启过程 1 编辑/etc/fstab文件,在挂载属性上加标志usrquota or grpquota 即 /dev/sdb1 /home ext3 defaults usrquota 1 2  也可以临时设置:mount -o remount,usrquota /home 2 建立配额数据库: quotacheck -cvuga 会生成aquta.user or aquota.group两个文件 3 启动配额:qu

ZooKeeper学习之文件系统的布局和格式

本文来谈谈快照文件,事务日志文件在文件系统中是如何存放的. 写事务日志是事务处理的关键步骤,所以高度建议在一个独立的磁盘上存储.快照不需要在独立的磁盘存储,因为它们是由一个后台线程以懒汉式的(lazily)方式产生的. 存储快照的路径是由DataDir参数指定的,事务日志的路径则是由DataLogDir参数指定的.首先来看看事务日志的目录.如果你查看目录的内容,你会看到一个名为version-2的文件夹.对于日志和快照现在只有一种格式,如果有别的版本的格式,像这样按照格式的版本把数据隔离开来,对

df - 报告文件系统磁盘空间的使用情况

总览 df [OPTION]... [FILE]... POSIX 选项: [-kP] GNU 选项 (最短方式): [-ahHiklmPv] [-t fstype] [-x fstype] [--block-size=size] [--print-type] [--no-sync] [--sync] [--help] [--version] [--] 描述 此手册页文档是df的GNU版本. df命令列出指定的每一个文件名所在的文件系统上可用磁盘空间的数量.如果没有指定文件名,则显示当前所有使用

Ext4文件系统架构分析(一)

本文描述Ext4文件系统磁盘布局和元数据的一些分析,同样适用于Ext3和Ext2文件系统,除了它们不支持的Ext4的特性外.整个分析分两篇博文,分别概述布局和详细介绍各个布局的数据结构及组织寻址方式等.感兴趣的看官敬请留意和指导! 1. Ext4文件系统布局综述 一个Ext4文件系统被分成一系列块组.为减少磁盘碎片产生的性能瓶颈,块分配器尽量保持每个文件的数据块都在同一个块组中,从而减少寻道时间.以4KB的数据块为例,一个块组可以包含32768个数据块,也就是128MB. 1.1 磁盘布局 Ex

文件IO详解(一)---ext2文件系统详解

http://www.cnblogs.com/biyeymyhjob/archive/2012/07/26/2609649.html 讲解ext2整体的文件布局 http://www.cnblogs.com/peon/archive/2011/06/22/2086470.html 用实际磁盘中的数据来印证ext2文件系统的布局 磁盘存储数据的最小单元是扇区(Sector):ext2文件系统存储结构的最小单位是块(Block). ext2文件系统中文件的物理存储结构有三个基本组成部分:superb

Linux磁盘IO监控[zz]

磁盘 I/O 监控是 Unix/Linux 系统管理中一个非常重要的组成部分.它可以监控吞吐量.每秒 I/O 数.磁盘利用率.服务时间等信息,并且在发现异常时,发送告警信息给系统管理员,便于系统管理员进行调整数据布局等管理活动以达到优化系统总体性能的目的. 不同的操作系统监控磁盘 I/O 的命令可能略有不同.本文将介绍 Unix/Linux 操作系统磁盘 I/O 管理命令及相关信息,并讲述 Unix/Linux 操作系统上磁盘 I/O 管理监控的自动化脚本实现. Unix/Linux 磁盘 I/