推荐-BtrFS学习总结

一、原理介绍
1.可扩展性
2.数据一致性的相关特性
3.多设备管理及快照
二、命令介绍与实战
1.命令介绍
2.命令实战
1)环境准备,添加3块磁盘/dev/sd{b,c,d}如下:
2)创建btrfs文件系统
3)查看已创建的btrfs文件系统
4)挂载btrfs文件系统,启用压缩功能
5)在线调整文件系统大小
6)往当前btrfs文件系统添加设备,以达到在线扩容扩容目的
7)执行chunk重新均衡
8)修改chunk的profile属性
9)输出btrfs文件系统简要信息
10)拆除设备
11)创建子卷
12)单独挂载子卷
13)创建快照
14)删除子卷和快照
15)btrfs与ext4文件系统之间相互转换

一、原理介绍

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

1.可扩展性

0.08496195287443697.png

主要表现在两个方面: 
  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,其物理存储位置是动态分配的,所以没有对文件个数的限制。 
btrfs btree0.06710084876976907.png

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个操作当成一个事务整体来处理,只要其中一个操作失败,文件便不能创建成功。过程如下: 
推荐-BtrFS学习总结 ed85aadd-9262-4152-9280-07edcddfd260.jpg

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

修改目录项E,引发相同的过程 
推荐-BtrFS学习总结85e27a81-a9a8-4366-bc4d-1231d20735e9.jpg

最后commit事务,superblock指向新块 

55bcdfb5-bb32-41be-af29-cbbaaf00489b.jpg推荐-BtrFS学习总结 
假设上面某个过程操作失败或中途断电也不会影响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" -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] |[/] 
加上-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

原创文章,作者:gateray,如若转载,请注明出处:http://www.178linux.com/17468

(3)
gateraygateray
上一篇 2016-06-03
下一篇 2016-06-03

相关推荐

  • keepalived实现前端负载均衡器的高可用

    概述:     在之前的内容中,我们了解了当一个网站并发量大时,可以利用前端负载均衡器将用户请求调度到后端的多个real server上,实现分散服务压力,横向扩展的方式,形成LB集群,但是试想一下,作为前端负载均衡器:     如果是LVS,万一作为前端调度器的Director…

    Linux干货 2016-11-01
  • N25-第七周作业

    1、创建一个10G分区,并格式为ext4文件系统;~]#fdisk -l #查看已有分区 设备 Boot Start End Blocks Id System/dev/sda1 * 2048 8194047 4096000 83 Linux/dev/sda2 8194048 24578047 8192000 82 Linux swap / Solaris~]…

    Linux干货 2017-02-24
  • linux学习总结-linux基础(之二)

    六、在Linux基础目录命名法则及功用 根据FHS(http://www.pathname.com/fhs/)的官方文件指出, 他们的主要目的是希望让使用者可以了解到已安装软件通常放置于那个目录下, 所以他们希望独立的软件开发商、操作系统制作者、以及想要维护系统的用户,都能够遵循FHS的标准。 也就是说,FHS的重点在于规范每个…

    Linux干货 2016-09-23
  • linux多网口绑定

    LINUX多网卡绑定同一IP(BOND): 常用的有三种 mode=0:轮转策略,有自动备援,但需要”Switch”支援及设定。 mode=1:活动-备份模式,其中一条线若断线,其他线路将会自动备援。 mode=3:广播模式,有自动备援,不必”Switch”支援及设定 mode0模式:需要说明的是如果想做成mode 0的负载均衡,仅仅设置这里options …

    2017-07-03
  • Linux之文件管理命令

      Linux文件管理类命令 Linux一切皆文件,所以熟悉文件管理命令对我们来说至关重要 文件查看命令 cat命令:文本文件查看工具 命令用法:         cat [OPTION]… [FILE]… 常用选项:  &nbsp…

    Linux干货 2016-11-04
  • Linux系统中的防火墙iptables

    iptables/netfilter——Linux系统下的防火墙 基本原理 防火墙主要功能 工作于主机或者网络边缘,对进出本主机或本网络的报文进行匹配检测,对匹配到规则的报文进行于规则相对应的处理。 防火墙主要分类 按功能分类 主机防火墙网络防火墙 按构成分类 软件防火墙硬件防火墙 Linux防火墙软件iptables/netfilter(以后简称iptab…

    Linux干货 2017-06-13

评论列表(2条)