加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

BtrFS学习总结

发布时间:2020-12-12 15:03:05 所属栏目:百科 来源:网络整理
导读:一、原理介绍 BtrFS(B-tree文件系统,又称为Butter FS或Better FS),2007由oracle开源后,得到了IBM、intel等厂商的大力支持,其目标计划是替代linux目前的ext3/4,成为下一代linux标准的文件系统。 支持写时复制(CoW)、快照、在线扩容缩容、数据checksu

一、原理介绍

BtrFS(B-tree文件系统,又称为Butter FS或Better FS),2007由oracle开源后,得到了IBM、intel等厂商的大力支持,其目标计划是替代linux目前的ext3/4,成为下一代linux标准的文件系统。

支持写时复制(CoW)、快照、在线扩容缩容、数据checksum、subvolume、磁盘阵列(raid)等,运行在linux上,并遵循GPL协议的强大文件系统。在2014年8月发布了稳定版。

其特性大致归纳为以下几点:

1.可扩展性

zYfyIby.png!web

主要表现在两个方面:

1)ext系列文件系统使用块位图来保存每个块空闲与否的信息(每个块用一个位来表示是否空闲),当容量扩展时,块位图所占的空间会线性的增加,试想一下如果快位图变得很大时,那么查找空闲块就需要大量的时间;BtrFS管理磁盘空间的最小单位是extent,一个extent由一组连续的block组成,extent由extent树进行管理,因此相比ext系列10个块需要10个bit来表示,btrfs只需要一个extent就可以,因此减少了元数据的量。对于大文件,extent表现出更加优异的管理性能。

2)ext系统inode是预分配的且大小固定,比如,100G的分区中,inode table只能存放131072个inode,意味着不可能创建131072个文件;同时, inode分配过小,容易导致磁盘空间无法充分利用,过大,容易造成磁盘空间浪费;btrfs为了解决这个问题,使用了动态分配inode,如下图,每个inode只是FS tree中的一个节点,用户可以无限制地任意插入新的inode,其物理存储位置是动态分配的,所以没有对文件个数的限制。

Ub6FB3J.png!web

FS Tree:管理文件相关的元数据,如inode、dir等

Chunk Tree:管理设备,每个磁盘设备都在Chunk Tree中有一个item

Extent Tree:管理磁盘空间的分配

checksum Tree:保存数据块的校验和

2.数据一致性的相关特性

btrfs的数据一致性是通过COW(Copy On Write)事务来保证的,所谓COW,即每次写磁盘数据时,先当前块数据复制到一个新块,然后在新块上进行更新写入,当新块写入完成时,只需将原来指向旧块的指针指向新块。

所谓的事务就是要保证一个操作的原子性(假设一个操作由多个步骤组成,只有所有步骤都成功这个操作才算成功,否则只要其中一个步骤失败,则整个操作失败,那么整个数据都要回滚到操作前的相同状态)

COW只能保证单一数据更新的原子性,但文件系统中很多操作需要更新多个不同的元数据,如何保证这些操作的原子性呢?下面以创建一个文件为例说明,创建一个文件需要设计到如下操作:

1) 修改extent数,分配一段磁盘空间

2) 创建一个新的inode,并插入到FS树

3) 增加一个目录项,插入到FS数

因此需要将上面的3个操作当成一个事务整体来处理,只要其中一个操作失败,文件便不能创建成功。过程如下:

3yAZbuE.jpg!web

A是FS树的根节点,新的inode信息将被插入节点C。首先,btrfs使用COW将inode插入一个新分配的C‘中,并修改上层节点B,使其指向新的C’,从而B也产生COW节点B‘,以此类推一直连锁反应到根节点A’,此时因为事务还没有完成,superblock依然指向A

Q7B3m2E.jpg!web

修改目录项E,引发相同的过程

MRJZnmi.jpg!web

最后commit事务,superblock指向新块

vyea6bR.jpg!web

假设上面某个过程操作失败或中途断电也不会影响superblock的原来指向,数据依然是操作前的状态,从而保证了事务的完整性和文件系统的一致性。

btrfs的另一特点是使用checksum来保证数据的可靠性,假设从磁盘读取一个块数据,可以通过比较其checksum来判断数据是否完整,其他文件系统在文件系统级别上是无法得知数据是否损坏的;同时由于checksum数据存储在checksum树的节点上,与块数据是分开管理的,这样的好处是能避免checksum和数据保存在同一个块的时候,文件系统上层获取了一个错误位置的块时无从得知(因为checksum只计算块数据是否完整而不是数据应该存在哪个块,只要块内数据并无损坏,checksum永远都是正确的)。

3.多设备管理及快照

  • btrfs可以跨越多个物理磁盘设备,动态的增加/减少设备来达到扩容/缩容的目的,技术上还支持(raid0、raid1、raid5、raid10等特性)

  • 可以利用COW技术创建卷级别和文件级别的快照

  • 支持在一个文件系统(或逻辑卷)上创建子卷,并没有层级限制,并且所有卷的空间大小都是可以动态调整的。其应用场景是可以为每个用户分配一个单独隔离的卷空间,来达到权限控制和配额管理的目的。理论部分就介绍那么多,下面咱们开始实战(操作基于centos7.2):

二、命令介绍与实战

1.命令介绍

btrfs文件系统使用btrfs命令来管理,其使用格式如下:
btrfs<command>[<args>]<command>:
balance:用于均衡单个或多个设备间的chunk;以及转换其属性
check:用于离线检查
device:用于管理设备,包括设备的增加、删除、扫描等
filesystem:管理文件系统,包含标签设置/同步等
inspect-internal:给开发者用来调试的工具
property:获取和设置btrfs对象的属性
qgroup:管理配额组
quota:管理配额,如启动配额、重新扫描配置等
receive:还原时,用于从标准输入或file中接收子卷数据
replace:替换设备
rescue:尝试修复损坏的文件系统
restore:在文件系统非挂载状态下,尝试还原损坏的btrfs文件系统
scrub:用来修复文件系统错误的,会读取文件系统所有的数据以及其校验和
send:备份时,用于发送子卷数据到文件或标准输出
subvolume:创建、删除、列出、管理子卷或快照

2.命令实战

1)环境准备,添加3块磁盘/dev/sd{b,c,d}如下:

[root@centos7-template~]#parted-l|grep-i'^disk/dev/sd.'Disk/dev/sda:129GB
Disk/dev/sdb:21.5GB
Disk/dev/sdc:21.5GB
Disk/dev/sdd:21.5GB

2)创建btrfs文件系统

[root@centos7-template~]#mkfs.btrfs-L"mydata"-draid0/dev/sd{b,c}
btrfs-progsv3.19.1Seehttp://btrfs.wiki.kernel.orgformoreinformation.TurningONincompatfeature'extref':increasedhardlinklimitperfileto65536TurningONincompatfeature'skinny-metadata':reduced-sizemetadataextentrefs
addingdevice/dev/sdcid2fscreatedlabelmydataon/dev/sdb
nodesize16384leafsize16384sectorsize4096size40.00GiB

-L: 指定卷标-d:指定data profile,可选的profile为:raid0/1/5/6/10,dup,single

3)查看已创建的btrfs文件系统

[root@centos7-template~]#btrfsfilesystemshowLabel:'mydata'uuid:7f0ca4e4-1823-4cf1-87d4-44a5190ed32aTotaldevices2FSbytesused112.00KiB
devid1size20.00GiBused2.03GiBpath/dev/sdb
devid2size20.00GiBused2.01GiBpath/dev/sdc
btrfs-progsv3.19.1[root@centos7-template~]#blkid/dev/sdb/dev/sdc/dev/sdb:LABEL="mydata"UUID="7f0ca4e4-1823-4cf1-87d4-44a5190ed32a"UUID_SUB="f616f8a1-7fc1-433b-8377-9d598328cd5b"TYPE="btrfs"/dev/sdc:LABEL="mydata"UUID="7f0ca4e4-1823-4cf1-87d4-44a5190ed32a"UUID_SUB="ba63683b-3443-4627-bfe3-7908ee910b0c"TYPE="btrfs"

4)挂载btrfs文件系统,启用压缩功能

[root@centos7-template~]#mount-tbtrfs-ocompress=lzo/dev/sdb/mnt
[root@centos7-template~]#df-Th
文件系统类型容量已用可用已用%挂载点/dev/mapper/centos_centos7--template-rootxfs50G2.0G48G4%/devtmpfsdevtmpfs480M0480M0%/devtmpfstmpfs489M0489M0%/dev/shmtmpfstmpfs489M6.7M483M2%/runtmpfstmpfs489M0489M0%/sys/fs/cgroup/dev/mapper/centos_centos7--template-homexfs68G33M68G1%/home/dev/sda1xfs497M123M375M25%/boottmpfstmpfs98M098M0%/run/user/0/dev/sdbbtrfs40G17M38G1%/mnt

5)在线调整文件系统大小

[root@centos7-template~]#btrfsfilesystemresize-10G/mnt
Resize'/mnt'of'-10G'[root@centos7-template~]#df-Th
文件系统类型容量已用可用已用%挂载点/dev/mapper/centos_centos7--template-rootxfs50G2.0G48G4%/devtmpfsdevtmpfs480M0480M0%/devtmpfstmpfs489M0489M0%/dev/shmtmpfstmpfs489M6.7M483M2%/runtmpfstmpfs489M0489M0%/sys/fs/cgroup/dev/mapper/centos_centos7--template-homexfs68G33M68G1%/home/dev/sda1xfs497M123M375M25%/boottmpfstmpfs98M098M0%/run/user/0/dev/sdbbtrfs30G17M18G1%/mnt[root@centos7-template~]#btrfsfilesystemresize+10G/mnt
Resize'/mnt'of'+10G'[root@centos7-template~]#df-Th
文件系统类型容量已用可用已用%挂载点/dev/mapper/centos_centos7--template-rootxfs50G2.0G48G4%/devtmpfsdevtmpfs480M0480M0%/devtmpfstmpfs489M0489M0%/dev/shmtmpfstmpfs489M6.7M483M2%/runtmpfstmpfs489M0489M0%/sys/fs/cgroup/dev/mapper/centos_centos7--template-homexfs68G33M68G1%/home/dev/sda1xfs497M123M375M25%/boottmpfstmpfs98M098M0%/run/user/0/dev/sdbbtrfs40G17M38G1%/mnt

6)往当前btrfs文件系统添加设备,以达到在线扩容扩容目的

[root@centos7-template~]#btrfsdeviceadd/dev/sdd/mnt#查看挂载点信息[root@centos7-template~]#btrfsdeviceusage-h/mnt/dev/sdb,ID:1
Devicesize:20.00GiB
Data,RAID0:1.00GiB
Metadata,single:8.00MiB
Metadata,RAID1:1.00GiB
System,single:4.00MiB
System,RAID1:8.00MiBUnallocated:17.98GiB
/dev/sdc,ID:2
Devicesize:20.00GiB
Data,RAID1:8.00MiBUnallocated:17.99GiB
/dev/sdd,ID:3
Devicesize:20.00GiBUnallocated:20.00GiB

7)执行chunk重新均衡

[root@centos7-template~]#btrfsbalancestart/mntDone,hadtorelocate5outof5chunks

8)修改chunk的profile属性

[root@centos7-template~]#btrfsbalancestart-f-mconvert=raid1/mntDone,hadtorelocate2outof3chunks
[root@centos7-template~]#btrfsbalancestart-f-sconvert=raid1/mntDone,hadtorelocate1outof3chunks
[root@centos7-template~]#btrfsbalancestart-f-dconvert=raid1/mntDone,hadtorelocate1outof3chunks

9)输出btrfs文件系统简要信息

[root@centos7-template~]#btrfsfilesystemdf-h/mntData,RAID1:total=1.00GiB,used=512.00KiB
System,RAID1:total=32.00MiB,used=16.00KiB
Metadata,used=112.00KiB
GlobalReserve,single:total=16.00MiB,used=0.00B

10)拆除设备

[root@centos7-template~]#btrfsdevicedelete/dev/sdd/mnt[root@centos7-template~]#btrfsfilesystemshow/mntLabel:'mydata'uuid:7f0ca4e4-1823-4cf1-87d4-44a5190ed32aTotaldevices2FSbytesused448.00KiB
devid1size20.00GiBused1.28GiBpath/dev/sdb
devid2size20.00GiBused1.28GiBpath/dev/sdc
btrfs-progsv3.19.1

11)创建子卷

[root@centos7-template~]#btrfssubvolumecreate/mnt/tmpCreatesubvolume'/mnt/tmp'[root@centos7-template~]#ls/mnttmp
[root@centos7-template~]#btrfsfilesystemshowLabel:'mydata'uuid:7f0ca4e4-1823-4cf1-87d4-44a5190ed32a
Totaldevices2FSbytesused464.00KiB
devid1size20.00GiBused1.28GiBpath/dev/sdb
devid2size20.00GiBused1.28GiBpath/dev/sdc
btrfs-progsv3.19.1#查看子卷的摘要信息,此时可看到子卷的初始容量为1G[root@centos7-template~]#btrfsfilesystemdf-h/mnt/tmpData,used=320.00KiB
System,RAID1:total=256.00MiB,used=128.00KiB
GlobalReserve,used=0.00B#查看子卷id及path[root@centos7-template~]#btrfssubvolumelist/mnt/tmpID263gen67toplevel5pathtmp#列出当前所有子卷的id及path[root@centos7-template~]#btrfssubvolumelist/mntID263gen67toplevel5pathtmp#通过路径查看卷信息[root@centos7-template~]#btrfssubvolumeshow/mnt/mntisbtrfsroot
[root@centos7-template~]#btrfssubvolumeshow/mnt/tmp/mnt/tmp
Name:tmp
uuid:0e6af78b-849f-a84e-9529-3280ec096201
Parentuuid:-
Creationtime:2016-06-0220:42:09
ObjectID:263
Generation(Gen):67
Genatcreation:67
Parent:5
TopLevel:5
Flags:-
Snapshot(s):#往子卷中创建一个2G大小的文件(超过初始分配的1G容量)[root@centos7-template/]#cd/mnt/tmp[root@centos7-templatetmp]#ddif=/dev/zeroof=./databs=1Mcount=2048记录了2048+0的读入
记录了2048+0的写出2147483648字节(2.1GB)已复制,1.16797秒,1.8GB/秒#此时发现子卷的容量自动扩展为3G[root@centos7-templatetmp]#btrfsfilesystemdf-h/mnt/tmpData,RAID1:total=3.00GiB,used=2.00GiB
System,used=2.22MiB
GlobalReserve,254);">12)单独挂载子卷 
[root@centos7-templatetmp]#mkdir/root/tmp[root@centos7-templatetmp]#mount-osubvol=tmp/dev/sdb/root/tmp[root@centos7-templatetmp]#ll/root/tmp总用量2097152-rw-r--r--.1rootroot21474836486月221:10data

13)创建快照

命令语法如下:

snapshot [-r]|[/]

加上-r参数快照卷为只读,否则为读写

[root@centos7-templatetmp]#btrfssubvolumesnapshot-r/mnt/tmp/mnt/tmp-snapshotCreateareadonlysnapshotof'/mnt/tmp'in'/mnt/tmp-snapshot'[root@centos7-templatetmp]#ls/mnt/tmp-snapshot/data#往原卷添加数据,快照卷的内容并未改变[root@centos7-templatetmp]#touch/mnt/tmp/test.txt[root@centos7-templatetmp]#ls/mnt/tmp-snapshot/data

14)删除子卷和快照

[root@centos7-templatemnt]#btrfssubvolumedelete/mnt/tmpDeletesubvolume(no-commit):'/mnt/tmp'[root@centos7-templatemnt]#lltmp-snapshot/总用量2097152-rw-r--r--.1rootroot21474836486月221:10data
[root@centos7-templatemnt]#btrfssubvolumedelete/mnt/tmp-snapshot/Deletesubvolume(no-commit):'/mnt/tmp-snapshot'[root@centos7-templatemnt]#ls[root@centos7-templatemnt]#

15)btrfs与ext4文件系统之间相互转换

[root@centos7-templatemnt]#mkfs.ext4/dev/sdd[root@centos7-templatemnt]#mount/dev/sdd/root/tmp[root@centos7-templatemnt]#vim/root/tmp/test.txtfirstline.
[root@centos7-templatemnt]#umount/dev/sdd[root@centos7-templatemnt]#btrfs-convert/dev/sddcreatingbtrfsmetadata.
copyinodes[o][0/12]
creatingext2fsimagefile.
cleaningupsystemchunk.
conversioncomplete.
[root@centos7-templatemnt]#mount/dev/sdd/root/tmp[root@centos7-templatemnt]#cat/root/tmp/test.txtfirstline.
[root@centos7-templatemnt]#umount/dev/sdd[root@centos7-templatemnt]#btrfs-convert-r/dev/sddrollbackcomplete.
[root@centos7-templatemnt]#mount/dev/sdd/root/tmp[root@centos7-templatemnt]#cat/root/tmp/test.txtfirstline.
[root@centos7-templatemnt]#umount/root/tmp

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读