btrfs研究文档格式.docx
- 文档编号:6344212
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:28
- 大小:170.65KB
btrfs研究文档格式.docx
《btrfs研究文档格式.docx》由会员分享,可在线阅读,更多相关《btrfs研究文档格式.docx(28页珍藏版)》请在冰点文库上搜索。
如果您比较btrfs的特性,将会发现btrfs和ZFS非常类似。
也许我们可以认为btrfs就是Linux社区对ZFS所作出的回应。
从此往后在Linux中也终于有了一个可以和ZFS相媲美的文件系统。
回页首
btrfs的特性
您可以在btrfs的主页上[2]看到btrfs的特性列表。
我自作主张,将那张列表分成了四大部分。
首先是扩展性(scalability)相关的特性,btrfs最重要的设计目标是应对大型机器对文件系统的扩展性要求。
Extent,B-Tree和动态inode创建等特性保证了btrfs在大型机器上仍有卓越的表现,其整体性能而不会随着系统容量的增加而降低。
其次是数据一致性(dataintegrity)相关的特性。
系统面临不可预料的硬件故障,Btrfs采用COW事务技术来保证文件系统的一致性。
btrfs还支持checksum,避免了silentcorrupt的出现。
而传统文件系统则无法做到这一点。
第三是和多设备管理相关的特性。
Btrfs支持创建快照(snapshot),和克隆(clone)。
btrfs还能够方便的管理多个物理设备,使得传统的卷管理软件变得多余。
最后是其他难以归类的特性。
这些特性都是比较先进的技术,能够显著提高文件系统的时间/空间性能,包括延迟分配,小文件的存储优化,目录索引等。
扩展性相关的特性
B-Tree
btrfs文件系统中所有的metadata都由BTree管理。
使用BTree的主要好处在于查找,插入和删除操作都很高效。
可以说BTree是btrfs的核心。
一味地夸耀BTree很好很高效也许并不能让人信服,但假如稍微花费一点儿时间看看ext2/3中元数据管理的实现方式,便可以反衬出BTree的优点。
妨碍ext2/3扩展性的一个问题来自其目录的组织方式。
目录是一种特殊的文件,在ext2/3中其内容是一张线性表格。
如图1-1所示[6]:
图1.ext2directory[6]
图1展示了一个ext2目录文件的内容,该目录中包含四个文件。
分别是"
home1"
,"
usr"
oldfile"
和"
sbin"
。
如果需要在该目录中查找目录sbin,ext2将遍历前三项,直至找到sbin这个字符串为止。
这种结构在文件个数有限的情况下是比较直观的设计,但随着目录下文件数的增加,查找文件的时间将线性增长。
2003年,ext3设计者开发了目录索引技术,解决了这个问题。
目录索引使用的数据结构就是BTree。
如果同一目录下的文件数超过2K,inode中的i_data域指向一个特殊的block。
在该block中存储着目录索引BTree。
BTree的查找效率高于线性表,
但为同一个元数据设计两种数据结构总是不太优雅。
在文件系统中还有很多其他的元数据,用统一的BTree管理是非常简单而优美的设计。
Btrfs内部所有的元数据都采用BTree管理,拥有良好的可扩展性。
btrfs内部不同的元数据由不同的Tree管理。
在superblock中,有指针指向这些BTree的根。
如图2所示:
图2.btrfsbtree
FSTree管理文件相关的元数据,如inode,dir等;
Chunktree管理设备,每一个磁盘设备都在ChunkTree中有一个item;
ExtentTree管理磁盘空间分配,btrfs每分配一段磁盘空间,便将该磁盘空间的信息插入到Extenttree。
查询ExtentTree将得到空闲的磁盘空间信息;
Treeoftreeroot保存很多BTree的根节点。
比如用户每建立一个快照,btrfs便会创建一个FSTree。
为了管理所有的树,btrfs采用Treeoftreeroot来保存所有树的根节点;
checksumTree保存数据块的校验和。
基于Extent的文件存储
现代很多文件系统都采用了extent替代block来管理磁盘。
Extent就是一些连续的block,一个extent由起始的block加上长度进行定义。
Extent能有效地减少元数据开销。
为了进一步理解这个问题,我们还是看看ext2中的反面例子。
ext2/3以block为基本单位,将磁盘划分为多个block。
为了管理磁盘空间,文件系统需要知道哪些block是空闲的。
Ext使用bitmap来达到这个目的。
Bitmap中的每一个bit对应磁盘上的一个block,当相应block被分配后,bitmap中的相应bit被设置为1。
这是很经典也很清晰的一个设计,但不幸的是当磁盘容量变大时,bitmap自身所占用的空间也将变大。
这就导致了扩展性问题,随着存储设备容量的增加,bitmap这个元数据所占用的空间也随之增加。
而人们希望无论磁盘容量如何增加,元数据不应该随之线形增加,这样的设计才具有可扩展性。
下图比较了block和extent的区别:
图3.采用extent的btrfs和采用bitmap的ext2/3
在ext2/3中,10个block需要10个bit来表示;
在btrfs中则只需要一个元数据。
对于大文件,extent表现出了更加优异的管理性能。
Extent是btrfs管理磁盘空间的最小单位,由extenttree管理。
Btrfs分配data或metadata都需要查询extenttree以便获得空闲空间的信息。
动态inode分配
为了理解动态inode分配,还是需要借助ext2/3。
下表列举了ext2文件系统的限制:
表1.ext2限制
限制
最大文件数量
文件系统空间大小V/8192
比如100G大小的文件系统中,能创建的文件个数最大为131072
图4显示了ext2的磁盘布局:
图4.ext2layout
在ext2中inode区是被预先固定分配的,且大小固定,比如一个100G的分区中,inodetable区中只能存放131072个inode,这就意味着不可能创建超过131072个文件,因为每一个文件都必须有一个唯一的inode。
为了解决这个问题,必须动态分配inode。
每一个inode只是BTree中的一个节点,用户可以无限制地任意插入新的inode,其物理存储位置是动态分配的。
所以btrfs没有对文件个数的限制。
针对SSD的优化支持
SSD是固态存储SolidStateDisk的简称。
在过去的几十年中,CPU/RAM等器件的发展始终遵循着摩尔定律,但硬盘HDD的读写速率却始终没有飞跃式的发展。
磁盘IO始终是系统性能的瓶颈。
SSD采用flashmemory技术,内部没有磁盘磁头等机械装置,读写速率大幅度提升。
flashmemory有一些不同于HDD的特性。
flash在写数据之前必须先执行擦除操作;
其次,flash对擦除操作的次数有一定的限制,在目前的技术水平下,对同一个数据单元最多能进行约100万次擦除操作,因此,为了延长flash的寿命,应该将写操作平均到整个flash上。
SSD在硬件内部的微代码中实现了wearleveling等分布写操作的技术,因此系统无须再使用特殊的MTD驱动和FTL层。
虽然SSD在硬件层面做了很多努力,但毕竟还是有限。
文件系统针对SSD的特性做优化不仅能提高SSD的使用寿命,而且能提高读写性能。
Btrfs是少数专门对SSD进行优化的文件系统。
btrfs用户可以使用mount参数打开对SSD的特殊优化处理。
Btrfs的COW技术从根本上避免了对同一个物理单元的反复写操作。
如果用户打开了SSD优化选项,btrfs将在底层的块空间分配策略上进行优化:
将多次磁盘空间分配请求聚合成一个大小为2M的连续的块。
大块连续地址的IO能够让固化在SSD内部的微代码更好的进行读写优化,从而提高IO性能。
数据一致性相关的特性
COW事务
理解COW事务,必须首先理解COW和事务这两个术语。
什么是COW?
所谓COW,即每次写磁盘数据时,先将更新数据写入一个新的block,当新数据写入成功之后,再更新相关的数据结构指向新block。
什么是事务?
COW只能保证单一数据更新的原子性。
但文件系统中很多操作需要更新多个不同的元数据,比如创建文件需要修改以下这些元数据:
1.修改extenttree,分配一段磁盘空间
2.创建一个新的inode,并插入FSTree中
3.增加一个目录项,插入到FSTree中
任何一个步骤出错,文件便不能创建成功,因此可以定义为一个事务。
下面将演示一个COW事务。
A是FSTree的根节点,新的inode的信息将被插入节点C。
首先,btrfs将inode插入一个新分配的blockC’中,并修改上层节点B,使其指向新的blockC’;
修改B也将引发COW,以此类推,引发一个连锁反应,直到最顶层的RootA。
当整个过程结束后,新节点A’变成了FSTree的根。
但此时事务并未结束,superblock依然指向A。
图5.COWtransaction1
接下来,修改目录项(E节点),同样引发这一过程,从而生成新的根节点A’’。
图6.COWtransaction2
此时,inode和目录项都已经写入磁盘,可以认为事务已经结束。
btrfs修改superblock,使其指向A’’,如下图所示:
图7.COWtransaction3
COW事务能够保证文件系统的一致性,并且系统Reboot之后不需要执行fsck。
因为superblock要么指向新的A’’,要么指向A,无论哪个都是一致的数据。
Checksum
Checksum技术保证了数据的可靠性,避免silentcorruption现象。
由于硬件原因,从磁盘上读出的数据会出错。
比如blockA中存放的数据为0x55,但读取出来的数据变是0x54,因为读取操作并未报错,所以这种错误不能被上层软件所察觉。
解决这个问题的方法是保存数据的校验和,在读取数据后检查校验和。
如果不符合,便知道数据出现了错误。
ext2/3没有校验和,对磁盘完全信任。
而不幸的是,磁盘的错误始终存在,不仅发生在廉价的IDE硬盘上,昂贵的RAID也存在silentcorruption问题。
而且随着存储网络的发展,即使数据从磁盘读出正确,也很难确保能够安全地穿越网络设备。
btrfs在读取数据的同时会读取其相应的checksum。
如果最终从磁盘读取出来的数据和checksum不相同,btrfs会首先尝试读取数据的镜像备份,如果数据没有镜像备份,btrfs将返回错误。
写入磁盘数据之前,btrfs计算数据的checksum。
然后将checksum和数据同时写入磁盘。
Btrfs采用单独的checksumTree来管理数据块的校验和,把checksum和checksum所保护的数据块分离开,从而提供了更严格的保护。
假如在每个数据block的header中加入一个域保存checksum,那么这个数据block就成为一个自己保护自己的结构。
这种结构下有一种错误无法检测出来,比如本来文件系统打算从磁盘上读blockA,但返回了blockB,由于checksum在block内部,因此checksum依旧是正确的。
btrfs采用checksumtree来保存数据块的checksum,避免了上述问题。
Btrfs采用crc32算法计算checksum,在将来的开发中会支持其他类型的校验算法。
为了提高效率,btrfs将写数据和checksum的工作分别用不同的内核线程并行执行。
多设备管理相关的特性
每个Unix管理员都曾面临为用户和各种应用分配磁盘空间的任务。
多数情况下,人们无法事先准确地估计一个用户或者应用在未来究竟需要多少磁盘空间。
磁盘空间被用尽的情况经常发生,此时人们不得不试图增加文件系统空间。
传统的ext2/3无法应付这种需求。
很多卷管理软件被设计出来满足用户对多设备管理的需求,比如LVM。
Btrfs集成了卷管理软件的功能,一方面简化了用户命令;
另一方面提高了效率。
多设备管理
Btrfs支持动态添加设备。
用户在系统中增加新的磁盘之后,可以使用btrfs的命令将该设备添加到文件系统中。
为了灵活利用设备空间,Btrfs将磁盘空间划分为多个chunk。
每个chunk可以使用不同的磁盘空间分配策略。
比如某些chunk只存放metadata,某些chunk只存放数据。
一些chunk可以配置为mirror,而另一些chunk则可以配置为stripe。
这为用户提供了非常灵活的配置可能性。
Subvolume
Subvolume是很优雅的一个概念。
即把文件系统的一部分配置为一个完整的子文件系统,称之为subvolume。
采用subvolume,一个大的文件系统可以被划分为多个子文件系统,这些子文件系统共享底层的设备空间,在需要磁盘空间时便从底层设备中分配,类似应用程序调用malloc()分配内存一样。
可以称之为存储池。
这种模型有很多优点,比如可以充分利用disk的带宽,可以简化磁盘空间的管理等。
所谓充分利用disk的带宽,指文件系统可以并行读写底层的多个disk,这是因为每个文件系统都可以访问所有的disk。
传统的文件系统不能共享底层的disk设备,无论是物理的还是逻辑的,因此无法做到并行读写。
所谓简化管理,是相对于LVM等卷管理软件而言。
采用存储池模型,每个文件系统的大小都可以自动调节。
而使用LVM,如果一个文件系统的空间不够了,该文件系统并不能自动使用其他磁盘设备上的空闲空间,而必须使用LVM的管理命令手动调节。
Subvolume可以作为根目录挂载到任意mount点。
subvolume是非常有趣的一个特性,有很多应用。
假如管理员只希望某些用户访问文件系统的一部分,比如希望用户只能访问/var/test/下面的所有内容,而不能访问/var/下面其他的内容。
那么便可以将/var/test做成一个subvolume。
/var/test这个subvolume便是一个完整的文件系统,可以用mount命令挂载。
比如挂载到/test目录下,给用户访问/test的权限,那么用户便只能访问/var/test下面的内容了。
快照和克隆
快照是对文件系统某一时刻的完全备份。
建立快照之后,对文件系统的修改不会影响快照中的内容。
这是非常有用的一种技术。
比如数据库备份。
假如在时间点T1,管理员决定对数据库进行备份,那么他必须先停止数据库。
备份文件是非常耗时的操作,假如在备份过程中某个应用程序修改了数据库的内容,那么将无法得到一个一致性的备份。
因此在备份过程中数据库服务必须停止,对于某些关键应用这是不能允许的。
利用快照,管理员可以在时间点T1将数据库停止,对系统建立一个快照。
这个过程一般只需要几秒钟,然后就可以立即重新恢复数据库服务。
此后在任何时候,管理员都可以对快照的内容进行备份操作,而此时用户对数据库的修改不会影响快照中的内容。
当备份完成,管理员便可以删除快照,释放磁盘空间。
快照一般是只读的,当系统支持可写快照,那么这种可写快照便被称为克隆。
克隆技术也有很多应用。
比如在一个系统中安装好基本的软件,然后为不同的用户做不同的克隆,每个用户使用自己的克隆而不会影响其他用户的磁盘空间。
非常类似于虚拟机。
Btrfs支持snapshot和clone。
这个特性极大地增加了btrfs的使用范围,用户不需要购买和安装昂贵并且使用复杂的卷管理软件。
下面简要介绍一下btrfs实现快照的基本原理。
如前所述Btrfs采用COW事务技术,从图1-10可以看到,COW事务结束后,如果不删除原来的节点A,C,E,那么A,C,E,D,F依然完整的表示着事务开始之前的文件系统。
这就是snapshot实现的基本原理。
Btrfs采用引用计数决定是否在事务commit之后删除原有节点。
对每一个节点,btrfs维护一个引用计数。
当该节点被别的节点引用时,该计数加一,当该节点不再被别的节点引用时,该计数减一。
当引用计数归零时,该节点被删除。
对于普通的TreeRoot,引用计数在创建时被加一,因为Superblock会引用这个Rootblock。
很明显,初始情况下这棵树中的所有其他节点的引用计数都为一。
当COW事务commit时,superblock被修改指向新的RootA’’,原来RootblockA的引用计数被减一,变为零,因此A节点被删除。
A节点的删除会引发其子孙节点的引用计数也减一,图1-10中的B,C节点的引用计数因此也变成了0,从而被删除。
D,E节点在COW时,因为被A’’所引用,计数器加一,因此计数器这时并未归零,从而没有被删除。
创建Snapshot时,btrfs将的RootA节点复制到sA,并将sA的引用计数设置为2。
在事务commit的时候,sA节点的引用计数不会归零,从而不会被删除,因此用户可以继续通过RootsA访问snapshot中的文件。
图8.Snapshot
软件RAID
RAID技术有很多非常吸引人的特性,比如用户可以将多个廉价的IDE磁盘组合为RAID0阵列,从而变成了一个大容量的磁盘;
RAID1和更高级的RAID配置还提供了数据冗余保护,从而使得存储在磁盘中的数据更加安全。
Btrfs很好的支持了软件RAID,RAID种类包括RAID0,RAID1和RAID10.
Btrfs缺省情况下对metadata进行RAID1保护。
前面已经提及btrfs将设备空间划分为chunk,一些chunk被配置为metadata,即只存储metadata。
对于这类chunk,btrfs将chunk分成两个条带,写metadata的时候,会同时写入两个条带内,从而实现对metadata的保护。
其他特性
Btrfs主页上罗列的其他特性不容易分类,这些特性都是现代文件系统中比较先进的技术,能够提高文件系统的时间或空间效率。
Delayallocation
延迟分配技术能够减少磁盘碎片。
在Linux内核中,为了提高效率,很多操作都会延迟。
在文件系统中,小块空间频繁的分配和释放会造成碎片。
延迟分配是这样一种技术,当用户需要磁盘空间时,先将数据保存在内存中。
并将磁盘分配需求发送给磁盘空间分配器,磁盘空间分配器并不立即分配真正的磁盘空间。
只是记录下这个请求便返回。
磁盘空间分配请求可能很频繁,所以在延迟分配的一段时间内,磁盘分配器可以收到很多的分配请求,一些请求也许可以合并,一些请求在这段延迟期间甚至可能被取消。
通过这样的“等待”,往往能够减少不必要的分配,也有可能将多个小的分配请求合并为一个大的请求,从而提高IO效率。
Inlinefile
系统中往往存在大量的小文件,比如几百个字节或者更小。
如果为其分配单独的数据block,便会引起内部碎片,浪费磁盘空间。
btrfs将小文件的内容保存在元数据中,不再额外分配存放文件数据的磁盘块。
改善了内部碎片问题,也增加了文件的访问效率。
图9.inlinefile
上图显示了一个BTree的叶子节点。
叶子中有两个extentdataitem元数据,分别用来表示文件file1和file2所使用的磁盘空间。
假设file1的大小仅为15个字节;
file2的大小为1M。
如图所示,file2采用普通的extent表示方法:
extent2元数据指向一段extent,大小为1M,其内容便是file2文件的内容。
而对于file1,btrfs会把其文件内容内嵌到元数据extent1中。
如果不采用inlinefile技术。
如虚线所示,extent1指向一个最小的extent,即一个block,但file1有15
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- btrfs 研究