Btrfs关键代码解析
ext3,ext4,xfs和btrfs文件系统性能对比【转】

ext3,ext4,xfs和btrfs⽂件系统性能对⽐【转】我这⾥只摘抄核⼼的图例哈。
1:单字节写⼊性能对⽐A:由于硬盘式块设备所以对于这种测试硬盘式不擅长的B:btrfs系统只有200K/SEC,xfs表现的性能⽐较平衡。
2:块写⼊性能对⽐(由于硬盘是块设备这种对⽐来的更有意义)A:性能上差不多,但是效率上(CPU占⽤率上)来说最好的是xfs接下来依次是EXT4,EXT3,BTRFS3:直接块顺序读写(关掉任何的系统和⽂件缓存)A:绕过系统和⽂件缓冲的话(例如:视频录制,⼀些虚拟机软件,ECC),EXT3/ 4是最好的选择,其次是BTRFS,最后是XFS。
B:没有⼀种⽂件系统可以适⽤于所有环境4:随机寻道A:BTRFS系能最差,不到20 seeks/secB:EXT3性能最好,如果软件⼤量的随机寻址的话这个⽂件系统性能更好5:创建和删除⼤量⽂件(⽂件量⼀定)BTRFS系统性能最差,下⾯是去掉该系统其它3种的对⽐A:EXT4是更⾼效⾼性能的系统,接下来依次是XFS,EXT36:顺序读写吞吐量【没有fsync的是100 writes/one fsync(),有的是1 writes/one fsync()】A:100 writes/one fsync()各个性能差不多B:1 writes/one fsync()时EXT3性能最好,接下来依次是XFS,EXT4,BTRFSC:write + fsync()在BTRFS下对读性能产⽣影响7:随机读写吞吐量A:100 seeks/sec每个块16 KB,我们得出最⼤的读取速度是1600 KB/sec,XFS,BTRFS⼤于了这个数值(可能数据不能随机也可能缓冲影响了结果)B:EXT3随机写⼊性能是最好的,适⽤于数据库,⾼容量的记录程序和虚拟机系统8:向PostgreSQL 中写⼊10万⾏数据A:BTRFS 性能是最好的,EXT4和XFS很低的cpu使⽤率但是性能太差9:读测试A:10万次的读测试,性能差别不⼤10:复杂的读写以及事务测试A:EXT3性能最好所以,数据库最好是EXT3系统,除⾮EXT4解决了所谓的回归问题。
Openvswitch原理与代码分析(1):总体架构

Openvswitch原理与代码分析(1):总体架构⼀、Opevswitch总体架构Openvswitch的架构⽹上有如下的图表⽰:每个模块都有不同的功能ovs-vswitchd 为主要模块,实现交换机的守护进程daemon在Openvswitch 所在的服务器进⾏ps aux 可以看到以下的进程root 1008 0.1 0.8 242948 31712 ? S<Ll Aug06 32:17 ovs-vswitchd unix:/var/run/openvswitch/db.sock -vconsole:emer -vsyslog:err -vfile:info --mlockall --no-chdir --log-file=/var/log/openvswitch/ovs-vswitchd.log --pidfile=/var/run/openvswitch/ovs-vswitchd.pid --detach --monitor注意这⾥ovs-vswitchd监听了⼀个本机的db.sock⽂件openvswitch.ko为Linux内核模块,⽀持数据流在内核的交换我们使⽤lsmod列举加载到内核的模块:~# lsmod | grep openvswitchopenvswitch 66901 0gre 13808 1 openvswitchvxlan 37619 1 openvswitchlibcrc32c 12644 2 btrfs,openvswitch既有Openvswitch.ko,也有ovsdb-server 轻量级数据库服务器,保存配置信息,ovs-vswitchd通过这个数据库获取配置信息通过ps aux可以看到如下进程root 985 0.0 0.0 21172 2120 ? S< Aug06 1:20 ovsdb-server /etc/openvswitch/conf.db -vconsole:emer -vsyslog:err -vfile:info --remote=punix:/var/run/openvswitch/db.sock --private-key=db:Open_vSwitch,SSL,private_key --certificate=db:Open_vSwitch,SSL,certificate --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert --no-chdir --log-file=/var/log/openvswitch/ovsdb-server.log --pidfile=/var/run/openvswitch/ovsdb-server.pid --detach –monitor可以看出,ovsdb-server将配置信息保存在conf.db中,并通过db.sock提供服务,ovs-vswitchd通过这个db.sock从这个进程读取配置信息。
btrfs的介绍与使用

btrfs的介绍与使⽤简单看了⼀下这篇⽂章,对其中⼀些机制的实现还不是很明⽩,还需要研究,在此做个记号。
Btrfs 简介⽂件系统似乎是内核中⽐较稳定的部分,多年来,⼈们⼀直使⽤ ext2/3,ext ⽂件系统以其卓越的稳定性成为了事实上的 Linux 标准⽂件系统。
近年来 ext2/3 暴露出了⼀些扩展性问题,于是便催⽣了 ext4 。
在 2008 年发布的 Linux2.6.19 内核中集成了 ext4 的 dev 版本。
2.6.28内核发布时,ext4 结束了开发版,开始接受⽤户的使⽤。
似乎 ext 就将成为 Linux ⽂件系统的代名词。
然⽽当您阅读很多有关 ext4 的⽂章时,会发现都不约⽽同地提到了 btrfs,并认为 ext4 将是⼀个过渡的⽂件系统。
ext4 的作者 Theodore Tso 也盛赞 btrfs 并认为 btrfs 将成为下⼀代 Linux 标准⽂件系统。
Oracle,IBM, Intel 等⼚商也对 btrfs 表现出了极⼤的关注,投⼊了资⾦和⼈⼒。
为什么 btrfs 如此受⼈瞩⽬呢。
这便是本⽂⾸先想探讨的问题。
Kevin Bowling[1] 有⼀篇介绍各种⽂件系统的⽂章,在他看来,ext2/3 等⽂件系统属于“古典时期”。
⽂件系统的新时代是 2005 年由 Sun 公司的 ZFS 开创的。
ZFS 代表” last word in file system ”,意思是此后再也不需要开发其他的⽂件系统了。
ZFS 的确带来了很多崭新的观念,对⽂件系统来讲是⼀个划时代的作品。
如果您⽐较 btrfs 的特性,将会发现 btrfs 和 ZFS ⾮常类似。
也许我们可以认为 btrfs 就是 Linux 社区对 ZFS 所作出的回应。
从此往后在Linux 中也终于有了⼀个可以和 ZFS 相媲美的⽂件系统。
btrfs 的特性您可以在 btrfs 的主页上 [2] 看到 btrfs 的特性列表。
Linux学习笔记之Btrfs文件系统简介及使用

Linux学习笔记之Btrfs⽂件系统简介及使⽤Btrfs 也有⼀个重要的缺点,当 BTree 中某个节点出现错误时,⽂件系统将失去该节点之下的所有的⽂件信息。
⽽ ext2/3 却避免了这种被称为”错误扩散”的问题。
Btrfs相关介绍:Btrfs 是⼀个 Linux 中的新的写时复制(copy-on-write (COW))的⽂件系统,⽬的是实现⾼级功能的同时着重与容错功能,修复功能以及易于管理。
⽬前由Oracle, Red Hat, 富⼠通, Intel, SUSE以及其他组织共同开发,在 GPL 许可证下发⾏,同时向任何⼈公开代码。
Btrfs核⼼特性:多物理卷⽀持:btrfs可由多个底层物理卷组成;⽀持RAID,以联机“添加”、“移除”、“修改”;写时复制更新机制(CoW):复制、更新及替换指针,⽽⾮“就地”更新;在⽂件进⾏修改的时候,⾸先将⽂件复制⼀份出来,在复制出来的⽂件上进⾏修改,修改完成之后,将指向原有⽂件的指针修改指向到修改完成的⽂件上,若修改完成的⽂件出现了错误,则我们可以通过原⽂件进⾏修复数据及元数据校验码:checksum ,当存储某个⽂件时,checksum会将数据的源数据和数据的校验码,分别通过⽂件的属性扩展进⾏保存,当我们再次读取数据时可以⽅便的检测数据是否受损,如果⽂件受损系统可以完成⾃动修复;⼦卷:sub_volume,在⼀个卷上创建多个⼦卷,在每⼀个⼦卷上创建⽂件系统,并挂载使⽤;快照:⽀持快照的快照;因此可以实现类似增量快照的机制透明压缩:如果我们在存储⽂件时,进⾏压缩存储,那么在⽂件发往btrfs时,会⾃动的占⽤时钟周期,完成数据的压缩存放,⽽⽤户并不知道,在⽤户读取⽂件时,会⾃动的进⾏⽂件的解压缩,可以实现节约磁盘空间。
但是压缩和解压缩会占⽤时钟周期;Btrfs⽂件系统如何创建:mkfs.btrfs-L ‘LABEL‘:指定⽂件系统的卷标;-d <type>: raid0, raid1, raid5, raid6, raid10, single 指明数据的存放⽅式,⽀持RAID机制;-m <profile>: raid0, raid1, raid5, raid6, raid10, single, dup 指明元数据的存放⽅式,是否可跨越多个物理卷,⽀持RAID机制;-O <feature>:在格式化⽂件系统的时候,是否直接开启⽂件系统的某些特性;-O list-all: 列出⽀持的所有特性;[root@centos7 ~]# fdisk -l #有三块硬盘sdb,sdc,sdd ⽤于创建btrfs ⽂件系统,⼤⼩均为20GDisk /dev/sdd: 21.5 GB, 21474836480 bytes, 41943040 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisk /dev/sdc: 21.5 GB, 21474836480 bytes, 41943040 sectorsUnits = sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytes[root@centos7 ~]# mkfs.btrfs -L mydata /dev/sdb /dev/sdc #将sdb,sdc创建为btrfs⽂件系统Btrfs v3.16.2See for more information.Turning ON incompat feature ‘extref‘: increased hardlink limit per file to 65536adding device /dev/sdc id 2fs created label mydata on /dev/sdbnodesize 16384 leafsize 16384 sectorsize 4096 size 40.00GiB[root@centos7 ~]# btrfs filesystem show #查看系统上的所有btrfs⽂件系统Label: ‘mydata‘ uuid: 70cf9f41-8977-4265-bf27-ca38b6459940Total devices 2 FS bytes used 112.00KiBdevid 1 size 20.00GiB used 2.03GiB path /dev/sdbdevid 2 size 20.00GiB used 2.01GiB path /dev/sdc[root@centos7 ~]# blkid /dev/sdb #查看设备sdb的属性/dev/sdb: LABEL="mydata" UUID="70cf9f41-8977-4265-bf27-ca38b6459940" UUID_SUB="b8c340e2-6165-4b31-90df-278b5ac77a2f" TYPE="btrfs" [root@centos7 ~]# blkid /dev/sdc #查看设备sdc的属性/dev/sdc: LABEL="mydata" UUID="70cf9f41-8977-4265-bf27-ca38b6459940" UUID_SUB="a80e87bb-9564-488a-9c8f-a403d0e4090a" TYPE="btrfs"可见/sdb,/sdc UUID⼀直,⼦卷UUID不同[root@centos7 ~]# mkdir /mydata #创建挂载点/mydata[root@centos7 ~]# mount /dev/sdb /mydata #挂载刚刚创建的⽂件系统,此时挂载/dev/sdc是⼀样的效果[root@centos7 ~]# mount | grep /mydata #挂载成功/dev/sdb on /mydata type btrfs (rw,relatime,seclabel,space_cache)#man btrfs filesystem 可⽤来查看命令帮助⽂档调整btrfs⽂件系统⼤⼩(逻辑边界):命令格式:btrfs filesystem resize [<devid>:]<size>[gkm]|[<devid>:]max <path>联机缩减⽂件系统⼤⼩:[root@centos7 ~]# btrfs filesystem resize -10G /mydata #将⽂件系统⼤⼩缩减去10GResize ‘/mydata‘ of ‘-10G‘[root@centos7 ~]# df -lh /mydata #此时⽂件系统⼤⼩变为了30GFilesystem Size Used Avail Use% Mounted on/dev/sdb 30G 1.0M 18G 1% /mydata联机扩张⽂件系统⼤⼩:[root@centos7 ~]# btrfs filesystem resize +5G /mydata #将⽂件系统⼤⼩扩展5GResize ‘/mydata‘ of ‘+5G‘[root@centos7 ~]# df -lh /mydata #建系统此时增加到了35GFilesystem Size Used Avail Use% Mounted on/dev/sdb 35G 1.0M 28G 1% /mydata[root@centos7 ~]# btrfs filesystem resize max /mydata #max,将⽂件系统⼤⼩调整⾄其物理边界40GResize ‘/mydata‘ of ‘max‘[root@centos7 ~]# df -lh /mydata/Filesystem Size Used Avail Use% Mounted on/dev/sdb 40G 1.0M 38G 1% /mydata调整btrfs物理边界⼤⼩:命令格式:btrfs device add/delete/scan <dev> MOUNT_POINT[root@centos7 ~]# btrfs device add /dev/sdd /mydata #为btrfs⽂件系统,增加⼀块硬盘sdd[root@centos7 ~]# df -lh /mydata #完成后,总⼤⼩为60GFilesystem Size Used Avail Use% Mounted on/dev/sdb 60G 1.0M 56G 1% /myda透明压缩:只需在挂载时候,使⽤-o 并指定压缩⽅式即可,对⽤户是透明的,可以选择lzo或zlib两种压缩⽅式命令格式:mount -o compress={lzo|zlib} DEVICE MOUNT_POINTbtrfs⽂件均衡:命令格式: btrfs balance start [OPTIONS] <FILTERS> MOUNT_POINT常⽤选项有:-d: 指定数据的组织机制-s:指定元数据的组织机制-m:指定⽂件系统的组织机制[root@centos7 ~]# btrfs device add /dev/sdd /mydata #添加 sdd设备到btrfs⽂件系统[root@centos7 ~]# btrfs filesystem show #查看btrf⽂件系统信息Label: ‘mydata‘ uuid: 70cf9f41-8977-4265-bf27-ca38b6459940Total devices 3 FS bytes used 640.00KiBdevid 2 size 20.00GiB used 2.03GiB path /dev/sdcdevid 3 size 20.00GiB used 0.00 path /dev/sdbdevid 4 size 20.00GiB used 1.03GiB path /dev/sdd[root@centos7 ~]# btrfs balance start -mconvert=raid5 /mydata #均衡⽂件,并使⽤raid5组织⽂件系统Done, had to relocate 2 out of 3 chunk注:raid5,⾄少需要3块磁盘。
Linux btrfs文件系统及管理

linux 文件系统,具有写时复制 COW(copy-on-write),改善ext3 文件系统单文件大小限制,并参加其他特性,如可写快照,快照的快照,内建 RAID,子卷(subvloume),专注于容错,修复和易于管理,下面一起来看看什么是 linux btrfs 文件系统及管理关系吧!Btrfs(B-tree 文件系统,通常念成Butter FS,Better FS 或者 B-tree FS),linux 文件系统,具有写时复制 COW(copy-on-write), 改善 ext3 文件系统单文件大小限制,并参加其他特性,如可写快照,快照的快照,内建 RAID,子卷(subvloume),专注于容错,修复和易于管理。
单文件可达 16EB,最大文件数量 2^64,最大卷容量 16EB,等。
1,COW:写时复制,每次写入数据时,先将数据写入到新的block,写入成功后,更改旧数据块指针到新数据块,而非更改本身。
2,多物理卷支持, btrfs 内建 raid,可在线增删磁盘设备,可在线扩展和缩减磁盘空间。
3,数据和元数据校验码, checksum4,子卷,可单独挂载子卷5,可写快照,快照的快照,单个文件快照。
6,透明压缩7,ext3/4 和 btrfs 无痛互转bash/shell Code 复制内容到剪贴板[root@localhost ~]# btrfs --help #查看匡助可以看到btrfs 有不少子命令,用法也不少,这里只举例常用选项。
usage: btrfs [--help] [--version] [...] []btrfs subvolume create [-i ] [/] #创立子卷Create a subvolumebtrfs subvolume delete [options] [...] #删除子卷Delete subvolume(s)btrfs subvolume list [options] [-G [+|-]value] [-C [+|- ]value] [--sort=gen,ogen,rootid,path] #显示子卷列表List subvolumes (and snapshots)btrfs subvolume snapshot [-r] [-i ] |[/] #创立子卷快照Create a snapshot of the subvolumebtrfs subvolume get-default #获取子卷默认的文件系统Get the default subvolume of a filesystembtrfs subvolume set-default #设置默认系统给子卷Set the default subvolume of a filesystembtrfs subvolume find-new #列出 btrfs 文件系统中最近修改的文件,结合 find 命令List the recently modified files in a filesystembtrfs subvolume show #显示更多的子卷信息Show more information of the subvolumebtrfs subvolume sync [...] #子卷同步,类似 mount 同步模式,内存数据同步到磁盘,有待查证。
btrfs subvolume 概念

Btrfs 子卷概念解析引言Btrfs(B-tree file system)是一种先进的复制文件系统,它提供了许多高级功能和特性。
其中一个关键概念是子卷(subvolume),它在Btrfs文件系统中扮演着重要的角色。
本文将详细解释子卷的定义、重要性和应用,并探讨其对于Btrfs文件系统的益处。
定义子卷是Btrfs文件系统中的一个逻辑分区,可以看作是独立的文件系统或者一个目录树的快照。
每个子卷都有自己独立的inode表、数据块组和元数据。
子卷可以被创建、删除、挂载和卸载,就像普通的目录一样。
重要性子卷在Btrfs文件系统中具有重要作用,主要体现在以下几个方面:1. 数据管理子卷可以帮助我们更好地管理数据。
通过将数据分布到不同的子卷中,我们可以实现更好的数据隔离和组织。
例如,我们可以将不同用户或应用程序的数据存储在不同的子卷中,以便更容易进行管理和维护。
2. 快照子卷能够创建快照,即当前状态下目录树结构的一份副本。
这对于数据备份和恢复非常有用。
通过创建子卷快照,我们可以在不影响原始数据的情况下进行实时备份,并在需要时快速还原到任意时间点的状态。
3. 克隆子卷可以被克隆,即创建一个与原始子卷相同内容的新子卷。
克隆子卷可以帮助我们快速创建相似的环境或测试场景,而无需从头开始复制数据。
这对于开发、测试和部署流程非常有帮助。
4. 空间管理每个子卷都有独立的空间配额和限制。
这使得我们能够更好地管理文件系统中的空间使用情况。
通过设置每个子卷的配额,我们可以避免某个应用程序或用户耗尽整个文件系统的空间。
5. 快速回滚由于子卷是目录树结构的快照,因此可以轻松地将文件系统恢复到之前的状态。
这对于系统管理员来说是一个重要的功能,因为它使得在出现问题时能够快速回滚到可靠且稳定的状态。
应用Btrfs子卷具有广泛应用场景,以下是几个例子:1. 数据分区通过将不同类型的数据存储在不同的子卷中,我们可以实现更好的数据隔离和管理。
如何选择文件系统:EXT4、Btrfs 和 XFS

如何选择文件系统:EXT4、Btrfs 和XFS老实说,人们最不曾思考的问题之一是他们的个人电脑中使用了什么文件系统。
Windows 和Mac OS X 用户更没有理由去考虑,因为对于他们的操作系统,只有一种选择,那就是NTFS 和HFS+。
相反,对于Linux 系统而言,有很多种文件系统可以选择,现在默认的是广泛采用的ext4。
然而,现在也有改用一种称为btrfs 文件系统的趋势。
那是什么使得btrfs 更优秀,其它的文件系统又是什么,什么时候我们又能看到Linux 发行版作出改变呢?首先让我们对文件系统以及它们真正干什么有个总体的认识,然后我们再对一些有名的文件系统做详细的比较文件系统是干什么的?如果你不清楚文件系统是干什么的,一句话总结起来也非常简单。
文件系统主要用于控制所有程序在不使用数据时如何存储数据、如何访问数据以及有什么其它信息(元数据)和数据本身相关,等等。
听起来要编程实现并不是轻而易举的事情,实际上也确实如此。
文件系统一直在改进,包括了更多的功能、更高效地完成它需要做的事情。
总而言之,它是所有计算机的基本需求、但并不像听起来那么简单。
为什么要分区?由于每个操作系统都能创建或者删除分区,很多人对分区都有模糊的认识。
Linux 操作系统即便使用标准安装过程,在同一块磁盘上仍使用多个分区,这看起来很奇怪,因此需要一些解释。
拥有不同分区的一个主要目的就是为了在灾难发生时能获得更好的数据安全性。
通过将硬盘划分为分区,数据会被分隔以及重组。
当事故发生的时候,只有存储在被损坏分区上的数据会被破坏,很大可能上其它分区的数据能得以保留。
这个原因可以追溯到Linux 操作系统还没有日志文件系统、任何电力故障都有可能导致灾难发生的时候。
使用分区也考虑到了安全和健壮性原因,因此操作系统部分损坏并不意味着整个计算机就有风险或者会受到破坏。
这也是当前采用分区的一个最重要因素。
举个例子,用户创建了。
文件系统

ReiserFS的第一次公开亮相是在1997年7月23日,Hans Reiser把他的基于平衡树结构 的ReiserFS文件系统在网上公布。ReiserFS 3.6.x(作为 Linux 2.4 一部分的版本) 是由 Hans Reiser 和他的在Namesys 的开发组共同开发设计的。Hans 和他的组员们相 信最好的文件系统是那些能够有助于创建独立的共享环境或者命名空间的文件系统,应 用程序可以在其中更直接、有效和有力地相互作用。为了实现 这一目标,文件系统就 应该满足其使用者对性能和功能方面的需要。那样,使用者就能够继续直接地使用文件 系统,而不必建造运行在文件系统之上(如数据库之 类)的特殊目的层。ReiserFS 使 用了特殊的优化 b* 平衡树(每个文件系统一个)来组织所有的文件系统数据。这为其 自身提供了非常不错的性能改进,也能够减轻文件系统设计上的人为约束。例如,现在 一个目录下 可以容纳 ext00,000 个子目录。另一个使用 b* 树的好处就是 ReiserFS 能够像大多其它的下一代文件系统一样,根据需要动态地分配索引节,而不必在文件系 统创建时建立固定的索引节。这有助于文件系统更灵活地适应其面临的各种存 储需 要,同时提供附加的空间有效率。 Reiserfs被看作是一个更加激进和现代的文件系统。传统的UNIX文件系统是按盘块 来进行空间分配的,对于目录和文件等的查找使用了简单的线性查 找。这些设计在当 时是合适的,但随着磁盘容量的增大和应用需求的增加,传统文件系统在存储效率,速 度和功能上已显落后。在reiserfs的下一版 reiser4中还提供了对事务的支持。在 [url]/v4/v4.html[/url] 中有reiser4的介绍和一个简单的 reiser4的性能测试。 ReiserFS的缺点:ReiserFS一个最受人批评的缺点是每升级一个版本,都将要将磁盘 重新格式化一次。你可以在[url]/[/url] 网站了解关于 ReiserFS 的更多信息。 xfs是一种非常优秀的日志文件系统,它是SGI公司设计的。xfs被称为业界最先进的、 最具可升级性的文件系统技术。它是一个全64位,快速、稳固的日 志文件系统,多年用 于SGI的IRIX操作系统。sgi决定支持Linux社区,将关键的基本架构技术授权于Linux。 它以开放资源形式发布了他们自己 拥有的xfs的源代码,并开始进行移植。此工作进展 得很快,目前已进入beta版阶段。作为一个64位文件系统,xfs可以支持超大数量的文 件(9g× 1gb,甚至更大的18g×1gb),可在大型 2d 和 3d 数据方面提供显着的性能 。xfs有能力预测其它文件系统薄弱环节,同时xfs提供了在不妨碍性能的情况下增强可 靠性和快速的事故恢复。SGI的xfs可为 linux和开放资源社区带来的新特性有:可升级 性:xfs被设计成可升级,以面对大多数的存储容量和i/o存储需求,可处理大型文件和 包含巨大数量文件 的大型目录,满足二十一世纪快速增长的磁盘需求。xfs有能力动态 地为文件分配索引空间,使系统形成高效支持大数量文件的能力。在它的支持下,用户 可使用 1exabyte (1g×1gb) 大的文件,远远大于现在最大的文件系统。优秀的i/o 性能:典型的现代服务器使用大型的条带式磁盘阵列,以提供达数gb/秒的总带宽。xfs 可以很好地满足I/O请求的大小和并发I/O请求的数量。 xfs 可作为root文件系统,并 被lilo支持.在NFS服务器上使用也没问题.支持软件磁盘阵列(RAID)和虚拟集群 (LVM)。SGI最新发布xfs为 1.0.1版.(在: [url]http:///projects/xfs/[/url] 可以下载它)。 Msdos:msdos 是在Dos、Windows和某些OS/2 操作系统上使用的一种文件系统,其名称 采用“8+3”的形式,即8个字符的文件名加上3个字符的扩展名。 umsdos:Linux下的扩展msdos文件系统驱动,支持长文件名、所有者、允许权限、连接 和设备文件。允许一个普通的msdo s文件系统用于Linux,而且无须为它建立单独的分 iso9660:标准CDROM文件系统,通用的Rock Ridge增强系统,允许长文件名。 Nfs:Sun公司推出的网络文件系统,允许多台计算机之间共享同一文件系统,易于从所 有这些计算机上存取文件。 Hpfs: High Performance File System(HPFS) 高性能文件系统(HPFS) HPFS是 Microsoft的LAN Manager中的文件系统,同时也是IBM的LAN Server和OS/2的文件系统 。HPFS能访问较大的硬盘驱动器,提供更多的组织特性并改善了文件系统的安全特性。 Smb:smb是一种支持 Windows for workgroups、Windows NT 和Lan Manager的基于SMB 协议的网络操作系统。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第四章Btrfs关键代码解析
4.1 Tree of root tree介绍
为了管理所有的树,btrfs 采用Tree of tree root来保存所有树的根节点,(super_block->s_fs_info = tree_root(struct btrfs_root), tree_root-> fs_info = fs_info(struct btrfs_fs_info)),也就是btrfs_fs_info结构,其定义为:fs/btrfs/ctree.h
802 struct btrfs_fs_info {
803 u8 fsid[BTRFS_FSID_SIZE];
804 u8 chunk_tree_uuid[BTRFS_UUID_SIZE];
805 struct btrfs_root *extent_root;
806 struct btrfs_root *tree_root;
807 struct btrfs_root *chunk_root;
808 struct btrfs_root *dev_root;
809 struct btrfs_root *fs_root;
810 struct btrfs_root *csum_root;
图Tree of root tree
超级块记录着一个分区的整体信息,Btrfs磁盘super_block结构用btrfs_super_block来描述。
//磁盘中的super block
u8 csum[BTRFS_CSUM_SIZE];
/* the first 4 fields must match struct btrfs_header */
u8 fsid[BTRFS_FSID_SIZE]; /* FS specific uuid */
__le64 bytenr; /* this block number */
__le64 flags;
/* allowed to be different from the btrfs_header from here own down */
__le64 magic;
__le64 generation;
__le64 root; #root树的根节点位置
__le64 chunk_root; #chunk树的根节点位置
__le64 log_root; #log数的根节点位置
FS Tree 管理文件相关的元数据,如inode,dir等;Chunk tree管理设备,每一个磁盘设备都在Chunk Tree中有一个item;Extent Tree管理磁盘空间分配,btrfs每分配一段磁盘空间,便将该磁盘空间的信息插入到Extent tree。
查询Extent Tree将得到空闲的磁盘空间信息;checksum Tree 保存数据块的校验和;Tree of tree root保存很多BTree 的根节点。
比如用户每建立一个快照,btrfs 便会创建一个FS Tree。
4.2 Btrfs基本结构
btrfs使用b+树数据结构,树的内部节点和页节点使用3种数据类型:btrfs_header, btrfs_disk_key, btrfs_item. 每个节点都是一个extent, 内部节点和页节点大小可以不一样. 每个节点都以btrfs_header开头,内部节点就是{key,value}数组,key是btrfs_disk_key, value就是指针,逻辑磁盘位置. 页节点同样包括相通的key,value,不过位置是key一块,value一块..而且key是btrfs_item。
图btrfs基本结构
其中btrfs_header结构体为:
u8 csum[32]; # extent的校验码
u8 fsid[16]; #文件系统的uuid
__le64 blocknr; #此节点的逻辑磁盘位置
__le64 flags; #
u8 chunk_tree_uid[16]; #chunk tree的uuid,可能是dev的uuid
__le64 generation; #transaction id
__le64 owner; # 节点有多个父节点
__le32 nritems; #
u8 level; # 在树中的层数,0表示leaf
btrfs_disk_key结构体为:
#对于不同的树结构,这3个成员有不同的意义,反正他们代表一个节点的key __le64 objectid;
u8 type;
__le64 offset;
btrfs_item结构体为:
#叶子节点使用的(key, item) item可能是具体的数据结构,可能是无结构数据.. struct btrfs_disk_key key;
__le32 offset;
__le32 size;
4.3 btrfs_fill_super介绍
在文件系统加载时,其中重中之重的函数是btrfs_fill_super,顾名思义主要用于填充superblock数据结构。
这个函数脉络非常清晰,主要做了如下工作:
1. 填充superblock的数据成员,比如:sb->s_magic = BTRFS_SUPER_MAGIC;
2. 填充superblock的操作函数,比如:sb->s_op = &btrf s_super_ops;
3. 用函数open_ctree创建树形结构,然后把树根填入超级块的文件系统私有信息中,如下:
tree_root = open_ctree(sb, f s_devices, (char *)data);
sb->s_f s_inf o = tree_root;
4. 用btrf s_iget拿到inode,d_alloc_root拿到dentry作为
5. 构造出根目录数据结构,并填入超级块。
inode = btrf s_iget(sb, &key, tree_root->f s_inf o->f s_root, NULL);
root_dentry = d_alloc_root(inode);
sb->s_root = root_dentry;
open_ctree是其中最复杂的函数,利用磁盘上超级块中存储的信息和我们前面介绍的数据结构,建立了一整套btrfs使用的树形数据结构填充在超级块中,如图:
图btrfs文件创建过程
到此为止,我们构建了一个btrfs的超级块,其中包含:
1. btrf s所要使用的一整套树形结构。
2. btrf s超级块中的操作函数。
3. 创建了一个根目录。
这样操作系统内核想要使用和控制btrfs,通过btrfs的超级块就可以了。
通过这个函数的运行流程,可以看出Btrfs文件系统创建文件的一个流程。