文档章节

btrfs学习总结

gateray1
 gateray1
发布于 2016/06/02 23:07
字数 3330
阅读 115
收藏 1

###一、原理介绍 BtrFS(B-tree文件系统,又称为Butter FS或Better FS),2007由oracle开源后,得到了IBM、intel等厂商的大力支持,其目标计划是替代linux目前的ext3/4,成为下一代linux标准的文件系统。 支持写时复制(CoW)、快照、在线扩容缩容、数据checksum、subvolume、磁盘阵列(raid)等,运行在linux上,并遵循GPL协议的强大文件系统。 在2014年8月发布了稳定版。

其特性大致归纳为以下几点: ####1.可扩展性 主要表现在两个方面:

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,其物理存储位置是动态分配的,所以没有对文件个数的限制。

输入图片说明 输入图片说明

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个操作当成一个事务整体来处理,只要其中一个操作失败,文件便不能创建成功。过程如下:

输入图片说明

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

输入图片说明

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

输入图片说明

最后commit事务,superblock指向新块。

输入图片说明

假设上面某个过程操作失败或中途断电也不会影响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.'
错误: /dev/sdb: unrecognised disk label
错误: /dev/sdc: unrecognised disk label
错误: /dev/sdd: unrecognised disk label
警告: 无法以读写方式打开 /dev/sr0 (只读文件系统)。/dev/sr0 已按照只读方式打开。
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" -d raid0 /dev/sd{b,c}
btrfs-progs v3.19.1
See http://btrfs.wiki.kernel.org for more information.

Turning ON incompat feature 'extref': increased hardlink limit per file to 65536
Turning ON incompat feature 'skinny-metadata': reduced-size metadata extent refs
adding device /dev/sdc id 2
fs created label mydata on /dev/sdb
        nodesize 16384 leafsize 16384 sectorsize 4096 size 40.00GiB

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

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

[root@centos7-template ~]# btrfs filesystem show
Label: 'mydata'  uuid: 7f0ca4e4-1823-4cf1-87d4-44a5190ed32a
        Total devices 2 FS bytes used 112.00KiB
        devid    1 size 20.00GiB used 2.03GiB path /dev/sdb
        devid    2 size 20.00GiB used 2.01GiB path /dev/sdc

btrfs-progs v3.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 -t btrfs -o compress=lzo /dev/sdb /mnt
[root@centos7-template ~]# df -Th
文件系统                                  类型      容量  已用  可用 已用% 挂载点
/dev/mapper/centos_centos7--template-root xfs        50G  2.0G   48G    4% /
devtmpfs                                  devtmpfs  480M     0  480M    0% /dev
tmpfs                                     tmpfs     489M     0  489M    0% /dev/shm
tmpfs                                     tmpfs     489M  6.7M  483M    2% /run
tmpfs                                     tmpfs     489M     0  489M    0% /sys/fs/cgroup
/dev/mapper/centos_centos7--template-home xfs        68G   33M   68G    1% /home
/dev/sda1                                 xfs       497M  123M  375M   25% /boot
tmpfs                                     tmpfs      98M     0   98M    0% /run/user/0
/dev/sdb                                  btrfs      40G   17M   38G    1% /mnt

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

[root@centos7-template ~]# btrfs filesystem resize -10G /mnt
Resize '/mnt' of '-10G'
[root@centos7-template ~]# df -Th
文件系统                                  类型      容量  已用  可用 已用% 挂载点
/dev/mapper/centos_centos7--template-root xfs        50G  2.0G   48G    4% /
devtmpfs                                  devtmpfs  480M     0  480M    0% /dev
tmpfs                                     tmpfs     489M     0  489M    0% /dev/shm
tmpfs                                     tmpfs     489M  6.7M  483M    2% /run
tmpfs                                     tmpfs     489M     0  489M    0% /sys/fs/cgroup
/dev/mapper/centos_centos7--template-home xfs        68G   33M   68G    1% /home
/dev/sda1                                 xfs       497M  123M  375M   25% /boot
tmpfs                                     tmpfs      98M     0   98M    0% /run/user/0
/dev/sdb                                  btrfs      30G   17M   18G    1% /mnt
[root@centos7-template ~]# btrfs filesystem resize +10G /mnt
Resize '/mnt' of '+10G'
[root@centos7-template ~]# df -Th
文件系统                                  类型      容量  已用  可用 已用% 挂载点
/dev/mapper/centos_centos7--template-root xfs        50G  2.0G   48G    4% /
devtmpfs                                  devtmpfs  480M     0  480M    0% /dev
tmpfs                                     tmpfs     489M     0  489M    0% /dev/shm
tmpfs                                     tmpfs     489M  6.7M  483M    2% /run
tmpfs                                     tmpfs     489M     0  489M    0% /sys/fs/cgroup
/dev/mapper/centos_centos7--template-home xfs        68G   33M   68G    1% /home
/dev/sda1                                 xfs       497M  123M  375M   25% /boot
tmpfs                                     tmpfs      98M     0   98M    0% /run/user/0
/dev/sdb                                  btrfs      40G   17M   38G    1% /mnt

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

[root@centos7-template ~]# btrfs device add /dev/sdd /mnt
#查看挂载点信息
[root@centos7-template ~]# btrfs device usage -h /mnt
/dev/sdb, ID: 1
   Device size:            20.00GiB
   Data,RAID0:              1.00GiB
   Metadata,single:         8.00MiB
   Metadata,RAID1:          1.00GiB
   System,single:           4.00MiB
   System,RAID1:            8.00MiB
   Unallocated:            17.98GiB

/dev/sdc, ID: 2
   Device size:            20.00GiB
   Data,RAID0:              1.00GiB
   Metadata,RAID1:          1.00GiB
   System,RAID1:            8.00MiB
   Unallocated:            17.99GiB

/dev/sdd, ID: 3
   Device size:            20.00GiB
   Unallocated:            20.00GiB

#####7)执行chunk重新均衡

[root@centos7-template ~]# btrfs balance start /mnt
Done, had to relocate 5 out of 5 chunks

#####8)修改chunk的profile属性

[root@centos7-template ~]# btrfs balance start -f -mconvert=raid1 /mnt
Done, had to relocate 2 out of 3 chunks
[root@centos7-template ~]# btrfs balance start -f -sconvert=raid1 /mnt 
Done, had to relocate 1 out of 3 chunks
[root@centos7-template ~]# btrfs balance start -f -dconvert=raid1 /mnt 
Done, had to relocate 1 out of 3 chunks

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

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

#####10)拆除设备

[root@centos7-template ~]# btrfs device delete /dev/sdd /mnt
[root@centos7-template ~]# btrfs filesystem show /mnt
Label: 'mydata'  uuid: 7f0ca4e4-1823-4cf1-87d4-44a5190ed32a
        Total devices 2 FS bytes used 448.00KiB
        devid    1 size 20.00GiB used 1.28GiB path /dev/sdb
        devid    2 size 20.00GiB used 1.28GiB path /dev/sdc

btrfs-progs v3.19.1

#####11)创建子卷

[root@centos7-template ~]# btrfs subvolume create /mnt/tmp
Create subvolume '/mnt/tmp'
[root@centos7-template ~]# ls /mnt
tmp
[root@centos7-template ~]# btrfs filesystem show
Label: 'mydata'  uuid: 7f0ca4e4-1823-4cf1-87d4-44a5190ed32a
        Total devices 2 FS bytes used 464.00KiB
        devid    1 size 20.00GiB used 1.28GiB path /dev/sdb
        devid    2 size 20.00GiB used 1.28GiB path /dev/sdc

btrfs-progs v3.19.1
#查看子卷的摘要信息,此时可看到子卷的初始容量为1G
[root@centos7-template ~]# btrfs filesystem df -h /mnt/tmp
Data, RAID1: total=1.00GiB, used=320.00KiB
System, RAID1: total=32.00MiB, used=16.00KiB
Metadata, RAID1: total=256.00MiB, used=128.00KiB
GlobalReserve, single: total=16.00MiB, used=0.00B
#查看子卷id及path
[root@centos7-template ~]# btrfs subvolume list /mnt/tmp
ID 263 gen 67 top level 5 path tmp
#列出当前所有子卷的id及path
[root@centos7-template ~]# btrfs subvolume list /mnt
ID 263 gen 67 top level 5 path tmp
#通过路径查看卷信息
[root@centos7-template ~]# btrfs subvolume show /mnt
/mnt is btrfs root
[root@centos7-template ~]# btrfs subvolume show /mnt/tmp
/mnt/tmp
        Name:                   tmp
        uuid:                   0e6af78b-849f-a84e-9529-3280ec096201
        Parent uuid:            -
        Creation time:          2016-06-02 20:42:09
        Object ID:              263
        Generation (Gen):       67
        Gen at creation:        67
        Parent:                 5
        Top Level:              5
        Flags:                  -
        Snapshot(s):
#往子卷中创建一个2G大小的文件(超过初始分配的1G容量)
[root@centos7-template /]# cd /mnt/tmp
[root@centos7-template tmp]# dd if=/dev/zero of=./data bs=1M count=2048
记录了2048+0 的读入
记录了2048+0 的写出
2147483648字节(2.1 GB)已复制,1.16797 秒,1.8 GB/秒
#此时发现子卷的容量自动扩展为3G
[root@centos7-template tmp]# btrfs filesystem df -h /mnt/tmp
Data, RAID1: total=3.00GiB, used=2.00GiB
System, RAID1: total=32.00MiB, used=16.00KiB
Metadata, RAID1: total=256.00MiB, used=2.22MiB
GlobalReserve, single: total=16.00MiB, used=0.00B

#####12)单独挂载子卷

[root@centos7-template tmp]# mkdir /root/tmp
[root@centos7-template tmp]# mount -o subvol=tmp /dev/sdb /root/tmp
[root@centos7-template tmp]# ll /root/tmp
总用量 2097152
-rw-r--r--. 1 root root 2147483648 6月   2 21:10 data

#####13)创建快照

命令语法如下: snapshot [-r] <source> <dest>|[<dest>/]<name> 加上-r参数快照卷为只读,否则为读写

[root@centos7-template tmp]# btrfs subvolume snapshot -r /mnt/tmp /mnt/tmp-snapshot 
Create a readonly snapshot of '/mnt/tmp' in '/mnt/tmp-snapshot'
[root@centos7-template tmp]# ls /mnt/tmp-snapshot/
data
#往原卷添加数据,快照卷的内容并未改变
[root@centos7-template tmp]# touch /mnt/tmp/test.txt
[root@centos7-template tmp]# ls /mnt/tmp-snapshot/  
data

#####14)删除子卷和快照

[root@centos7-template mnt]# btrfs subvolume delete /mnt/tmp
Delete subvolume (no-commit): '/mnt/tmp'
[root@centos7-template mnt]# ll tmp-snapshot/
总用量 2097152
-rw-r--r--. 1 root root 2147483648 6月   2 21:10 data
[root@centos7-template mnt]# btrfs subvolume delete /mnt/tmp-snapshot/
Delete subvolume (no-commit): '/mnt/tmp-snapshot'
[root@centos7-template mnt]# ls
[root@centos7-template mnt]# 

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

[root@centos7-template mnt]# mkfs.ext4 /dev/sdd
[root@centos7-template mnt]# mount /dev/sdd /root/tmp
[root@centos7-template mnt]# vim /root/tmp/test.txt
first line.
[root@centos7-template mnt]# umount /dev/sdd
[root@centos7-template mnt]# btrfs-convert /dev/sdd
creating btrfs metadata.
copy inodes [o] [         0/        12]
creating ext2fs image file.
cleaning up system chunk.
conversion complete.
[root@centos7-template mnt]# mount /dev/sdd /root/tmp
[root@centos7-template mnt]# cat /root/tmp/test.txt 
first line.
[root@centos7-template mnt]# umount /dev/sdd
[root@centos7-template mnt]# btrfs-convert -r /dev/sdd
rollback complete.
[root@centos7-template mnt]# mount /dev/sdd /root/tmp
[root@centos7-template mnt]# cat /root/tmp/test.txt 
first line.
[root@centos7-template mnt]# umount /root/tmp

© 著作权归作者所有

共有 人打赏支持
gateray1
粉丝 1
博文 1
码字总数 3330
作品 0
广州
私信 提问
#12 btrfs文件系统

btrfs Technical Preview, 技术预览版 BtrFS(B-tree文件系统,又称为Butter FS或Better FS),2007由oracle开源后,得到了IBM、intel等厂商的大力支持,其目标计划是替代linux目前的ext3/4,...

谁等了谁
2017/05/19
0
0
btrfs,磁盘配额

btrfs Balance-tree FS Better FS butter FS 2007年由Oracle开源,到目前位置,仍然是技术预览版(Technical Preview), btrfs其开发目的就是取代ext系列文件系统,成为下一代Linux的标准文件...

杨铄
2017/05/27
0
0
Facebook 开始试验性部署 Btrfs

在雇用了Btrfs文件系统主要开发者Chris Mason等人,以及Linux内核块设备层维护者之后,Facebook开始试验性的部署Btrfs。 Btrfs文件系统还没有发布正式版本,相比EXT4或其它更成熟的文件系统,...

oschina
2014/03/29
4.2K
10
Linux上的新一代文件系统-Btrfs简介

Linux上的新一代文件系统-Btrfs简介 文件系统似乎是内核中比较稳定的部分,多年来,人们一直使用 ext2/3,ext 文件系统以其卓越的稳定性成为了事实上的 Linux 标准文件系统。 近年来 ext2/3...

openthings
02/12
0
0
Btrfs文件系统管理及应用

btrfs(通常念成Butter FS),由Oracle于2007年开发的遵循GPL协定的开源文件系统。Btrfs 支持创建快照 (snapshot)以及支持递归的快照(即支持快照的快照),内建磁盘阵列(RAID)支援,支持子...

yy20031205
2015/10/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

总结:线程间频繁切换为什么耗费资源?

因为线程切换的时候,CPU需要将此线程的所有执行状态保存起来,如线程编号,执行到的位置等,然后再去执行其它线程。

浮躁的码农
28分钟前
0
0
PHP版本高于5.5时,curl文件上传必须使用CurlFile对象

坑了我一天,之前@的方法各种上传不成功文件。都怀疑服务端有bug了。

叫我哀木涕
29分钟前
1
0
js算法总结

数列求和 等差数列求和 function sum(a0,d,n){//a0->首项,d->公差,n->项数//(首项+末项)*项数/2return (a1+(a1+d*n))*n/2;} 等比数列求和 function sum(a0,q,n){//a0->首项,q->公......

祖达
54分钟前
2
0
小白?转型?毕业生?外行学习快速入行大数据开发指南

这篇文章中,本文将针对三种不同的、想要进入数据科学领域的人群,给出自己的经验,帮助他们迅速有效入行。 虽然没有适合每个人的万能解决方案,但这三类建议值得想转行的你一看。 第1类:新...

董黎明
今天
2
0
好文 | MySQL 索引B+树原理,以及建索引的几大原则

MySQL事实上使用不同的存储引擎也是有很大区别的,下面猿友们可以了解一下。 一、存储引擎的比较 注:上面提到的B树索引并没有指出是B-Tree和B+Tree索引,但是B-树和B+树的定义是有区别的。 ...

Java爬坑之路
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部