Linux之btrfs详解2015082901

        文件系统似乎是内核中比较稳定的部分,多年来,人们一直使用 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 表现出了极大的关注,投入了资金和人力。


        相比ext系列文件系统,btrfs新增了特性如下:

            1、支持容量的动态扩展和缩减

            2、支持快照功能

            3、支持对快照做快照,以实现增量更新机制

            4、支持COW(Copy On Write 写时复制)

                    所谓COW是磁盘写数据时,将新数据写入新的bolck中,数据更新完成,再将数据指针指向新的block上

            5、支持对单个文件的快照功能

            6、多物理卷支持 : 一个文件系统可由多个底层物理卷组成;支持RAID,以联机“增加”“移除”“修改”

             7、支持子卷:sub_volume

             8、透明压缩----无需用户参与

                等等特性,在此便不一一列出。


在此需要说明,默认CentOS7以下版本的Linux发行版默认不支持btrfs文件系统格式。以下讲解及实验针对CentOS7


1、创建btrfs文件系统:

        使用命令:mkfs.btrfs

                    命令格式:mkfs.btrfs [options] [device ] [device ....]

                    常用选项:

         -L 'LABEL'        为文件系统指明卷标

             -d type : raid0  raid5  raid6  raid10   single  数据存储方式

             -m type : raid0  raid5  raid6  raid10   single 元数据存储方式

         -O 特性   指明开启特性

         -O list-all 列出支持的所有feature(特性)

*****-d及-m选项所指明的raid级别,只针对文件系统之上的数据储存方式,并代表底层物理卷的组织形式,此特性会从之后的实验中体现******

 

[root@localhost ~]# ls /dev/sd*  ##我在虚拟机上添加了3块20G的新硬盘,分别为sdb sdc sdd
/dev/sda  /dev/sda1  /dev/sda2  /dev/sdb  /dev/sdc  /dev/sdd
[root@localhost ~]# mkfs.btrfs -f -L 'test' -m raid5 -d raid5 /dev/sdb /dev/sdc /dev/sdd
Btrfs v3.16.2
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 'raid56': raid56 extended format
adding device /dev/sdc id 2
adding device /dev/sdd id 3
fs created label test on /dev/sdb
        nodesize 16384 leafsize 16384 sectorsize 4096 size 60.00GiB


ok,文件系统创建成功。

2、btrfs文件系统的管理命令:btrfs

            用法:btrfs <command> [<args>]

            command子命令有:

                filesystem    文件系统相关

                device        底层物理设备相关

                balance    数据相关

                subvolume    子卷相关

上面文件系统已创建成功,我们可以执行

[root@localhost ~]# btrfs filesystem show        ##查看btrfs文件系统属性
Label: 'test'  uuid: d7270b3e-7583-4279-8c7c-75e431e821fc
        Total devices 3 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
        devid    3 size 20.00GiB used 2.01GiB path /dev/sdd

挂载创建好的文件系统当当前系统上,可以用物理卷中的任意一个,例如:

[root@localhost ~]# mkdir /test/  ##因为当前文件系统共添加了3块设备,所以三块硬盘的任意一块挂载到系统上,都可以挂载btrfs

[root@localhost ~]# mkdir /test/ 

[root@localhost ~]# mount /dev/sdb  /test/

我们可以使用df命令查看当前系统各分区的容量信息

wKioL1Xh15yjOA84AAGuKbpNs_w868.jpg

由此可见,新建的btrfs已挂在成功并可以使用由于起初创建文件系统的时候所指定的数据存储机制为raid5,而此处3块硬盘(20G)组合成一个btrfs总容量却是60G,因此可证实前面说的,创建文件系统时所指定的raid级别只针对数据的存储机制,而非设备的组合机制。


我们对文件系统进行缩减

[root@localhost ~]# btrfs filesystem resize -10G /test/   ##调整文件系统大小减小10G
Resize '/test/' of '-10G'
[root@localhost ~]# df -h   ## 由此可见,文件系统缩减有生效
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   10G  126M  9.9G   2% /
devtmpfs                 904M     0  904M   0% /dev
tmpfs                    914M     0  914M   0% /dev/shm
tmpfs                    914M  8.6M  905M   1% /run
tmpfs                    914M     0  914M   0% /sys/fs/cgroup
/dev/mapper/centos-usr    20G  1.1G   19G   6% /usr
/dev/sr0                 7.1G  7.1G     0 100% /media/cdrom
/dev/mapper/centos-home   10G   33M   10G   1% /home
/dev/sda1                197M  105M   93M  54% /boot
/dev/sdb                  50G  1.2M   46G   1% /test

此时注意:文件系统缩减的大小不能超过单个硬盘容量,否则无法完成操作。我们可再次使用show命令查看文件系统的属性信息:

[root@localhost ~]# btrfs filesystem show  ##此处看出,文件系统缩减针对的是某个物理设备,因此证实缩减的容量不可超过任意单块硬盘的容量
Label: 'test'  uuid: d7270b3e-7583-4279-8c7c-75e431e821fc
        Total devices 3 FS bytes used 1.12MiB
        devid    1 size 10.00GiB used 2.03GiB path /dev/sdb
        devid    2 size 20.00GiB used 2.01GiB path /dev/sdc
        devid    3 size 20.00GiB used 2.01GiB path /dev/sdd
Btrfs v3.16.2

==================================================

[root@localhost ~]# ls /dev/sd*      ##新增一块新硬盘sde  20G
/dev/sda  /dev/sda1  /dev/sda2  /dev/sdb  /dev/sdc  /dev/sdd  /dev/sde
[root@localhost ~]# btrfs device add /dev/sde /test/   ##添加新硬盘到现有文件系统
查看当前文件系统的属性
[root@localhost ~]# btrfs filesystem show  ##由此可知,新硬盘添加成功
Label: 'test'  uuid: d7270b3e-7583-4279-8c7c-75e431e821fc
        Total devices 4 FS bytes used 1.12MiB
        devid    1 size 10.00GiB used 2.03GiB path /dev/sdb
        devid    2 size 20.00GiB used 2.01GiB path /dev/sdc
        devid    3 size 20.00GiB used 2.01GiB path /dev/sdd
        devid    4 size 20.00GiB used 0.00 path /dev/sde

执行df命令发现新增的20G硬盘空间,已自动划入当前文件系统:

wKioL1Xh3DCDlshdAAI7VBEKtLI239.jpg


##若移除硬盘,文件系统也会自动缩减相应的硬盘容量空间。

##我们知道,lvm在做pv移除之前,必须要先执行pvmove将磁盘上的已有数据移动到同一卷组的其他pv上,在这里,对btrfs进行磁盘移除,btrfs会自动移动磁盘上的数据到其他磁盘上。


##我们新增加一块硬盘到当前文件系统,若文件系统要原有很多数据,那么其他磁盘上的数据必然会很多,而新增磁盘却很空闲,这时我们需要使用balance子命令来均衡磁盘中的数据

[root@localhost ~]# btrfs balance start /test/
Done, had to relocate 6 out of 6 chunks

这里需要注意的是,如若文件系统中数据量很大,那么执行此操作势必会造成cpu资源很大的占用量,建议空闲时再进行此操作;此操作也可以将start换成pause暂停,换成cancel取消。

我们还可以在做数据均衡时对原有的raid级别进行更改,操作如下:

[root@localhost ~]# btrfs balance start -f -mconvert=raid0 -dconvert=raid1  /test/  ##具体选项意义见文档尾部命令总结
Done, had to relocate 3 out of 3 chunks


btrfs还有一个特性,就是subvolume了,我们可以在当前文件系统中创建子卷;

使用子命令    subvolume

[root@localhost ~]# btrfs subvolume create  /test/testsub 
Create subvolume '/test/testsub'

这时候,我们便可以对子卷进行单独挂载使用了,命令如下:

[root@localhost ~]# mount -o subvol=testsub /dev/sdb /testsub/

即使卸载了主卷的挂载,子卷依然可以独立使用



我们拷贝一些文件到子卷挂载的目录,尝试对子卷做快照:

[root@localhost ~]# cp -r /etc/httpd/ /testsub/
[root@localhost ~]# btrfs subvolume snapshot /test/testsub/ /test/testsnap
Create a snapshot of '/test/testsub/' in '/test/testsnap'
[root@localhost ~]# ls /test/testsnap   ##子卷快照创建成功
httpd

####子卷的快照需要和子卷放置在同一个卷中~

   


另外,ext文件系统还可以和btrfs文件系统相互转换;

[root@localhost ~]# btrfs device delete /dev/sde /test  ##首先从btrfs中移除sde
[root@localhost ~]# mkfs.ext4 /dev/sde   ##为sde创建ext文件系统
******省略过程******
Writing superblocks and filesystem accounting information: done  
[root@localhost ~]# btrfs-convert /dev/sde   ##执行转换 
creating btrfs metadata.
creating ext2fs image file.
cleaning up system chunk.
conversion complete.
[root@localhost ~]# blkid /dev/sde      ##文件系统类型变成了btrfs,转换成功
/dev/sde: UUID="8dfb210a-f5c0-4d18-bbb7-c41ed4994720" UUID_SUB="0b362342-3514-4714-8fa5-c2aa7300db8d" TYPE="btrfs" 
[root@localhost ~]# btrfs-convert -r /dev/sde    ##将文件系统转换回ext系列
rollback complete. 
[root@localhost ~]# blkid /dev/sde    ##转回成功,文件系统类型又变成了ext系列了。
/dev/sde: UUID="9c5bee0a-43b0-4b2c-8a64-d28f348ab8d2" TYPE="ext4"




btrfs文件系统管理命令总结:

         子命令以及常用选项:

filesystem 

show查看btrfs文件系统属性

resize [+|-]大小 缩减文件系统   ----必须挂载后才能扩展或缩减

resize max  扩展为最大

df fs  查看文件系统的容量信息


device

add

delete /DEVICE /FILESYSTEM    自动移动要拆除设备上的数据

scan

ready转为可用状态

stat 显示I/O状态

balance

start 启用balance , 占用很大cpu资源

-dconvert=raid5 修改数据的raid级别

-mconvert=raid1修改元数据的raid级别

status查看balance状态

pause暂停

resume继续

subvolume

creat /VOLUME/SUBVOL

例如: btrfs sunvolume create /mydata/sub1

   mount -o subvol=sub1 /dev/sdb /mnt   将子卷sub1挂载到mnt

 -o subvolid=     可使用id挂载子卷

list /FS 查看已创建的字子卷

show查看子卷信息

snapshot /mydata/sub1 /mydata/sun1_snapshot   给子卷创建快照,必须在一个父卷中




你可能感兴趣的:(CentOS7,btrfs)