Btrfs (Btree FS)文件系统:
    是由Oracle(甲骨文)公司在2007年开发的一个写时复制(copy to write)文件系统,以解决文件系统中缺少池,快照,校验及跨多设备访问的一些问题而实现大规模化储存。

Btrfs特点:
    1.btrfs可由多个底层物理卷组成;支持RAID,以联机“添加、“移除”,“修改”
    2.写时复制更新机制(CoW):复制、更新及替换指针,而非“就地”更新;
    3.扩展性:扩展后的整体性能不会随系统容量增加而降低
    4.数据一致性:btrfs采用了COW机制,支持checksum,保证了数据的完整性而坚决了突发的硬件故障导致损失    
    5.子卷:sub_volume#
    6,快照和克隆:支持快照的快照;基于子卷的一个副本,相当于VMware里的快照
    7.透明压缩:自动把数据压缩存放,非用户交互,查看时自动解压缩


btrfs文件系统的创建:
    
    mkfs.btrfs常用参数:
            -L 'LABEL' #设定文件系统卷标
            -d <type>: raid0, raid1, raid5, raid6, raid10, single#指明数据存储时的类型
            -m <profile>: raid0, raid1, raid5, raid6, raid10, single, dup #语言数据存储机制
            -O <feature>#格式化时启动的特性
                -O list-all: 列出支持的所有feature;


首先我们新添加几块硬盘用来做btree文件系统:

[root@localhost ~]# fdisk -l
磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x000f09eb
   设备 Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     1026047      512000   83  Linux
/dev/sda2         1026048    41943039    20458496   8e  Linux LVM
磁盘 /dev/sdb:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘 /dev/sdc:21.5 GB, 21474836480 字节,41943040 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节

  这里我们使用sdb和sdc两块磁盘直接格式化为btrfs文件系统:

[root@localhost ~]# mkfs.btrfs -L mybtrfs /dev/sdb /dev/sdc
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
adding device /dev/sdc id 2
fs created label mybtrfs on /dev/sdb#卷标创建在sdb上为“mybtrfs"
    nodesize 16384 leafsize 16384 sectorsize 4096 size 40.00GiB#空间总大小为40G

这样btrfs文件系统创建完成,是不是很简单?


既然创建已经完成,接下来我们查看一下btrfs具体信息:

btrfs filesystem show  #btrfs文件系统的查看命令

[root@localhost ~]# btrfs filesystem show
Label: 'mybtrfs'  uuid: 1c74225e-a36b-46b2-8bde-bef50d0f89fb
    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 v3.16.2

同样我们还可以使用blkid [/dev/device]来查看:

[root@localhost ~]# blkid /dev/sdb /dev/sdc#查看一下两块磁盘信息
/dev/sdb: LABEL="mybtrfs" UUID="1c74225e-a36b-46b2-8bde-bef50d0f89fb" UUID_SUB="87045ae0-ae5f-4e56-811c-1b246532047c" TYPE="btrfs" 
/dev/sdc: LABEL="mybtrfs" UUID="1c74225e-a36b-46b2-8bde-bef50d0f89fb" UUID_SUB="6c491f79-b13e-44c3-94e0-ad7e895b7613" TYPE="btrfs"

#包括卷标名LABLE,UUID,TYPE类型等信息,还有我们注意到没,两块磁盘的UUID是相同的,因为两块磁盘属于同一个btrfs系统,而子卷是不同的,btrfs可支持多块子卷

接下来我们就可以挂载btrfs文件系统了

[root@localhost ~]# mkdir /mydata#创建一个挂载点
[root@localhost ~]# mount -t btrfs /dev/sdb /mydata/#挂载btrfs文件系统
[root@localhost ~]# mount | tail -n 5  #mount查看最后一个挂载成功
mqueue on /dev/mqueue type mqueue (rw,relatime,seclabel)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
/dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
/dev/sr0 on /media/cdrom type iso9660 (ro,relatime)
/dev/sdb on /mydata type btrfs (rw,relatime,seclabel,space_cache)

注: mount挂载时因为是两块磁盘做为btrfs,所以只挂载两块磁盘的任意一块即可

btrfs filesystem:
    show查看信息
    show --all-devices:查看所有设备
     [DeVICE]  查看指定设备的btrfs
     df: 已挂载的btrfs文件系统的使用率
     resize: 修改btrfs文件系统大小


[root@localhost ~]# btrfs filesystem show --all-devices
Label: 'mybtrfs'  uuid: 1c74225e-a36b-46b2-8bde-bef50d0f89fb
    Total devices 2 FS bytes used 896.00KiB
    devid    1 size 20.00GiB used 2.03GiB path /dev/sdb
    devid    2 size 20.00GiB used 2.01GiB path /dev/sdc
Btrfs v3.16.2
[root@localhost ~]# btrfs filesystem show /dev/sdc 
failed to open /dev/fd0: No such device or address
Label: 'mybtrfs'  uuid: 1c74225e-a36b-46b2-8bde-bef50d0f89fb
    Total devices 2 FS bytes used 896.00KiB
    devid    1 size 20.00GiB used 2.03GiB path /dev/sdb
    devid    2 size 20.00GiB used 2.01GiB path /dev/sdc

Btrfs v3.16.2  #因为属于同一个文件系统,所以查看一个就显示出全部


btrfs文件系统创建完成后我们进入目录创建文件测试是否成功:

[root@localhost ~]# cd /mydata/ 
[root@localhost mydata]# ls
[root@localhost mydata]# touch a.txt
[root@localhost mydata]# cp /etc/grub2.cfg ./
[root@localhost mydata]# ls #可以添加文件,btrfs正常使用
a.txt  grub2.cfg


卸载我们可以使用umount [/dev/sd#]  即可卸载

我们在挂载文件系统时还可以用btrfs内置的透明压缩机制,用户无需参与即可完成:
    
    mount -o compress={lzo|zlib} [DEVICE] [MOUNT_POINT]
    支持lzo和zlib两种压缩算法

设置这个参数以后我们往btrfs文件系统存放数据时会自动通过lzo或者zlib压缩机制压缩后存放,即透明压缩

[root@localhost ~]# umount /dev/sdb
[root@localhost ~]# mount -o compress=lzo /dev/sdb /mydata/
[root@localhost ~]# cp /etc/rc.d/init.d/functions /mydata/
[root@localhost ~]# cd /mydata/
[root@localhost mydata]# ll -h functions /etc/rc.d/init.d/functions 
-rw-r--r--. 1 root root 14K 1月  15 2015 /etc/rc.d/init.d/functions
-rw-r--r--. 1 root root 14K 9月   3 15:21 functions

这里由于functions文件太小,所以我们看到大小并没有改变,大文件则可以看出压缩后的大小

btrfs还可以在线增加减少文件系统大小,则通过:
    
    btrfs filesystem resize +大小 [MOUNT_POINT]

[root@localhost mydata]# btrfs filesystem resize -10G /mydata/
Resize '/mydata/' of '-10G'#这样原来的btrfs文件系统大小减少10G大小
[root@localhost mydata]# btrfs filesystem df /mydata#查看btrfs使用率
Data, RAID0: total=2.00GiB, used=776.00KiB
Data, single: total=8.00MiB, used=0.00
System, RAID1: total=8.00MiB, used=16.00KiB
System, single: total=4.00MiB, used=0.00
Metadata, RAID1: total=1.00GiB, used=112.00KiB
Metadata, single: total=8.00MiB, used=0.00
GlobalReserve, single: total=16.00MiB, used=0.00
[root@localhost mydata]# df -lh
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   18G  4.2G   14G   24% /
devtmpfs                 481M     0  481M    0% /dev
tmpfs                    490M   72K  490M    1% /dev/shm
tmpfs                    490M   14M  477M    3% /run
tmpfs                    490M     0  490M    0% /sys/fs/cgroup
/dev/sda1                497M  125M  373M   25% /boot
/dev/sr0                 7.1G  7.1G     0  100% /media/cdrom
/dev/sdb                  30G  1.1M   18G    1% /mydata#现在为30G

这样btrfs在线由原来的40G减少为30G大小,而我们前边cp和创建的文件是不会受到影响的,前提是有空余的空间存放数据

[root@localhost mydata]# ls
a.txt  functions  grub2.cfg
[root@localhost mydata]# cat grub2.cfg #文件照样可以查看
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub2-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#
### BEGIN /etc/grub.d/00_header ###
set pager=1
if [ -s $prefix/grubenv ]; then
  load_env
fi
if [ "${next_entry}" ] ; then
   set default="${next_entry}"
   set next_entry=
   save_env next_entry
   set boot_once=true
else


既然可以减少空间大小,那我们试着增加一下它的大小呢

[root@localhost mydata]# btrfs filesystem resize +10G /mydata/
Resize '/mydata/' of '+10G'#这里我们增加10G大小
[root@localhost mydata]# 
[root@localhost mydata]# btrfs filesystem show
Label: 'mybtrfs'  uuid: 1c74225e-a36b-46b2-8bde-bef50d0f89fb
    Total devices 2 FS bytes used 904.00KiB
    devid    1 size 20.00GiB used 2.03GiB path /dev/sdb
    devid    2 size 20.00GiB used 2.01GiB path /dev/sdc
Btrfs v3.16.2
[root@localhost mydata]# ll -lh
总用量 20K
-rw-r--r--. 1 root root    0 9月   3 15:00 a.txt
-rw-r--r--. 1 root root  14K 9月   3 15:21 functions
-rw-r--r--. 1 root root 4.0K 9月   3 15:00 grub2.cfg
[root@localhost mydata]# df -lh /mydata/
文件系统        容量  已用  可用 已用% 挂载点
/dev/sdb         40G  1.1M   38G    1% /mydata#这样又为原来的40G
[root@localhost mydata]# btrfs filesystem resize max /mydata/
Resize '/mydata/' of 'max'#指定扩展为最大容量

btrfs支持在线增加减少已有容量大小,但是如果已加载磁盘容量不够时怎么办??

btrfs文件系统还支持直接添加磁盘设备到文件系统:

    btrfs device add [DIVICE] [MOUNT_POINT]

这里我们还有一块预留磁盘sdd,我们看一下效果:

[root@localhost mydata]# btrfs device add /dev/sdd /mydata/#直接加载
[root@localhost mydata]# df -lh
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   18G  4.2G   14G   24% /
devtmpfs                 481M     0  481M    0% /dev
tmpfs                    490M   72K  490M    1% /dev/shm
tmpfs                    490M   14M  477M    3% /run
tmpfs                    490M     0  490M    0% /sys/fs/cgroup
/dev/sda1                497M  125M  373M   25% /boot
/dev/sr0                 7.1G  7.1G     0  100% /media/cdrom
/dev/sdb                  60G  1.1M   56G    1% /mydata
#我们看到加载后由原来的40G大小增加为60G大小

btrfs文件系统还支持数据文件均衡操作:(一般很少操作)
    btrfs balance start [MOUNT_POINT]
        pause:暂停
        cancel:取消
        resume:继续
        status:状态

[root@localhost mydata]# btrfs balance start /mydata/
Done, had to relocate 6 out of 6 chunks#迁移出6个chunks
[root@localhost mydata]# btrfs balance status /mydata/
No balance found on '/mydata/'

#状态信息由于文件很小,执行已经结束,查看只能在迁移过程中才能看到,大文件则可以。

创建子卷:
    btrfs subvolume create [MOUNT_POINT]/[FILES]

[root@localhost mydata]# btrfs subvolume create 使用/mydata/logs#创建子卷
Create subvolume '/mydata/logs'
[root@localhost mydata]# btrfs subvolume list /mydata/#列出子卷信息
ID 260 gen 52 top level 5 path logs

挂载子卷:

[root@localhost ~]# umount /mydata/#需要先卸载挂载点
[root@localhost ~]# mount -o subvol=logs /dev/sdb /mnt/#挂载子卷
[root@localhost ~]# ls /mnt/ #logs没有文件        
[root@localhost ~]# cp /var/log/messages /mnt/#cp文件到子卷可以
[root@localhost ~]# ls /mnt/
messages
[root@localhost ~]# btrfs subvolume show /mnt/#查看子卷详细信息
/mnt
    Name:             logs
    uuid:             cb76840f-56df-db4e-8077-2faf03a8351a
    Parent uuid:         -
    Creation time:         2015-09-03 16:37:54
    Object ID:         260
    Generation (Gen):     55
    Gen at creation:     52
    Parent:         5
    Top Level:         5
    Flags:             -
    Snapshot(s):

删除子卷使用:btrfs subvolume delete /mydata/logs


下边还有创建子卷快照,不写具体操作了。。

[root@localhost ~]# btrfs subvolume snapshot /mydata/logs /mydata/logs_snapshot


我们的btrfs文件系统就介绍到这里,如哪里有问题还望各位大神指出,谢谢!