btrfs文件系统初识及应用


Btrfs(通常念成Butter FS),由Oracle于2007年宣布并进行中的COW(copy-on-write式)文件系统。目标是取代Linux目前的ext3文件系统,改善ext3的限制,特别是单一文件大小的限制,总文件系统大小限制以及加入文件校验和特性。

特性:

首先是扩展性 (scalability) 相关的特性,btrfs 最重要的设计目标是应对大型机器对文件系统的扩展性要求。 Extent,B-Tree 和动态 inode 创建等特性保证了btrfs在大型机器上仍有卓越的表现,其整体性能而不会随着系统容量的增加而降低。

其次是数据一致性 (data integrity) 相关的特性。系统面临不可预料的硬件故障,Btrfs 采用 COW 事务技术来保证文件系统的一致性。 btrfs 还支持 checksum,避免了 silent corrupt 的出现。而传统文件系统则无法做到这一点。

第三是和多设备管理相关的特性。 Btrfs 支持创建快照 (snapshot),和克隆 (clone)  子卷(sub_volume)透明压缩。btrfs还能够方便的管理多个物理设备,使得传统的卷管理软件变得多余。

最后是其他难以归类的特性。这些特性都是比较先进的技术,能够显著提高文件系统的时间 / 空间性能,包括延迟分配,小文件的存储优化,目录索引等。

扩展性相关的特性

B-Tree

btrfs 文件系统中所有的 metadata 都由 B-Tree 管理。使用 B-Tree 的主要好处在于查找,插入和删除操作都很高效。可以说 B-Tree 是 btrfs 的核心。

一味地夸耀 B-Tree 很好很高效也许并不能让人信服,但假如稍微花费一点儿时间看看 ext2/3 中元数据管理的实现方式,便可以反衬出 B-Tree 的优点。(之前的博客文件系统详解有讲解ext系列的文件系统)。

基于 Extent 的文件存储

现代很多文件系统都采用了 extent 替代 block 来管理磁盘。 Extent 就是一些连续的 block,一个 extent 由起始的 block 加上长度进行定义,能有效地减少元数据开销。


centos7默认支持btrfs文件系统

通过fdisk 命令创建3个分区

[root@centos7 ~]# fdisk -l
磁盘 /dev/sda:128.8 GB, 128849018880 字节,251658240 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0x00065fe7
   设备 Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     1026047      512000   83  Linux
/dev/sda2         1026048    46194687    22584320   8e  Linux LVM
/dev/sda3        46194688   251658239   102731776    5  Extended
/dev/sda5        46196736    67168255    10485760   83  Linux
/dev/sda6        67170304    88141823    10485760   83  Linux
/dev/sda7        88143872   109115391    10485760   83  Linux

mkfs.btrfs  创建btrfs文件系统的参数

   -L   指定卷标

   -m   指明元数据是如何存放的(raid0 raid1 raid....)

   -d   如指定数据跨多设备存放的类型(raid0 raid1 raid5 raid6 raid10) 

   -O   格式化启动的特性

       -O list-all 列出支持所有的feature;

[root@centos7 ~]# mkfs.btrfs -L mydata /dev/sda5 /dev/sda6   #创建btrfs文件系统
Btrfs v3.16.2
See http://btrfs.wiki.kernel.org for more information.
[root@centos7 ~]# btrfs filesystem show  #查看btrfs文件属性,是否创建
Label: 'mydata'  uuid: 4483a0bc-7fa1-4691-b976-a1a98ebf448c
Total devices 2 FS bytes used 112.00KiB
devid    1 size 10.00GiB used 2.03GiB path /dev/sda5
devid    2 size 10.00GiB used 2.01GiB path /dev/sda6
[root@centos7 ~]# blkid /dev/sda5   #显示的子卷uuid和物理uuid是不同的
/dev/sda5: LABEL="mydata" UUID="4483a0bc-7fa1-4691-b976-a1a98ebf448c" UUID_SUB="cd986ce4-38c2-4b9d-845e-6009af489925" TYPE="btrfs" 
[root@centos7 ~]# blkid /dev/sda6
/dev/sda6: LABEL="mydata" UUID="4483a0bc-7fa1-4691-b976-a1a98ebf448c" UUID_SUB="069a84fe-b9a0-47a2-851c-43ffa83d2aee" TYPE="btrfs"
[root@centos7 ~]# mkdir /mysql
[root@centos7 ~]# mount -o compress=lzo /dev/sda5 /mysql/   
#compress=lzo 指定压缩算法
#挂载btrfs文件系统(挂载btrfs设备一个任何即可)
[root@centos7 ~]# df -h  #查看是否挂载
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   20G  838M   19G    5% /
devtmpfs                 481M     0  481M    0% /dev
tmpfs                    490M     0  490M    0% /dev/shm
tmpfs                    490M  6.6M  484M    2% /run
tmpfs                    490M     0  490M    0% /sys/fs/cgroup
/dev/sda1                497M  120M  378M   25% /boot
/dev/sda5                 20G  1.0M   18G    1% /mysql
[root@centos7 ~]# btrfs filesystem resize -8G /mysql/  #文件系统缩减8G的容量,+8G表示拓展8G(resize 调整文件系统大小)
Resize '/mysql/' of '-8G'
[root@centos7 ~]# df -h
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   20G  838M   19G    5% /
devtmpfs                 481M     0  481M    0% /dev
tmpfs                    490M     0  490M    0% /dev/shm
tmpfs                    490M  6.7M  484M    2% /run
tmpfs                    490M     0  490M    0% /sys/fs/cgroup
/dev/sda1                497M  120M  378M   25% /boot
/dev/sda5                 12G  512K   10G    1% /mysql


btrfs device add /dev/*  /mount_point 新增设备至挂载点,实现自动自动扩容
[root@centos7 ~]# btrfs device add /dev/sda7 /mysql/   #新增分区/dev/sda7至/mysql
[root@centos7 ~]# df -h
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   20G  838M   19G    5% /
devtmpfs                 481M     0  481M    0% /dev
tmpfs                    490M     0  490M    0% /dev/shm
tmpfs                    490M  6.7M  484M    2% /run
tmpfs                    490M     0  490M    0% /sys/fs/cgroup
/dev/sda1                497M  120M  378M   25% /boot
/dev/sda5                 27G  512K   25G    1% /mysql


btrfs balance 把原来的数据均衡的分配到新增的磁盘上

btrfs balance status /mydata    #显示状态(并不是真正能看到)

[root@localhost ~]# btrfs balance start /mydata    #开启balance  pause 暂停

移除一个物理卷   

btrfs device delete   #拆除一个物理卷  在支持联机状态会自动先移动数据再拆除

[root@centos7 ~]# btrfs device delete /dev/sda7 /mysql/  #把/dev/sda7拆除
[root@centos7 ~]# df -h
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root   20G  838M   19G    5% /
devtmpfs                 481M     0  481M    0% /dev
tmpfs                    490M     0  490M    0% /dev/shm
tmpfs                    490M  6.7M  484M    2% /run
tmpfs                    490M     0  490M    0% /sys/fs/cgroup
/dev/sda1                497M  120M  378M   25% /boot
/dev/sda5                 17G  640K   17G    1% /mysql
[root@centos7 ~]# btrfs balance start -dconvert=raid5 /mysql/ 
                                #修改数据的raid级别,修改支持动态
                     -mconvert=raid5 #修改元数据的raid级�e                        
Done, had to relocate 1 out of 3 chunks
[root@centos7 ~]# btrfs filesystem df /mysql/
Data, RAID5: total=2.00GiB, used=832.00KiB
System, RAID1: total=32.00MiB, used=16.00KiB
Metadata, RAID1: total=256.00MiB, used=112.00KiB
GlobalReserve, single: total=16.00MiB, used=0.00

创建子卷

[root@centos7 mysql]# btrfs subvolume list /mysql/  #查看子卷是否挂载
[root@centos7 mysql]# btrfs subvolume create /mysql/log    #创建子卷,而不是子目录
Create subvolume '/mysql/log'
[root@centos7 ~]# mount -o subvol=log /dev/sda5 /mnt/   挂载子卷到/mnt
[root@centos7 ~]# ls /mnt/
[root@centos7 ~]# cp /etc/se
securetty      security/      selinux/       services       sestatus.conf  
[root@centos7 ~]# cp /etc/services /mnt/
[root@centos7 ~]# btrfs subvolume show /mnt/  查看子卷信息
/mnt
Name: log
uuid: 3f81dd45-b049-084d-828f-59b39ca6318f
Parent uuid: -
Creation time: 2015-08-30 13:41:20
Object ID: 267
Generation (Gen): 109
Gen at creation: 106
Parent: 5
Top Level: 5
Flags: -
Snapshot(s):
[root@centos7 ~]# umount /mnt/
[root@centos7 ~]# mount /dev/sda5 /mysql/  #挂载父卷依然能看到自己的数据,相反是不行的
[root@centos7 ~]# ls /mysql/log
services
[root@centos7 ~]# btrfs subvolume delete /mysql/log2  #删除子卷
Transaction commit: none (default)
Delete subvolume '/mysql/log2'
[root@centos7 ~]# ls /mysql/
abc.txt  log

创建快照

[root@centos7 ~]# btrfs subvolume create  /mysql/log3  #先创建一个子卷
Create subvolume '/mysql/log3'
[root@centos7 ~]# btrfs subvolume snapshot /mysql/log3/ /mysql/log3_snapshot  #创建快照
Create a snapshot of '/mysql/log3/' in '/mysql/log3_snapshot'
[root@localhost ~]# btrfs subvolume delete /mydata/log3_snapshot   #删除快照卷


把ext系列的文件系统改成btrfs

[root@centos7 ~]# btrfs device delete /dev/sda7 /mysql/ #先卸载一个分区(我没有去创建一个新分区)
[root@centos7 mysql]# mke2fs -t ext4 -L mydata /dev/sda7  #格式化成ext4文件格式
[root@centos7 ~]# mount /dev/sda7 /mydata/  #挂载
[root@centos7 mysql]# cp /etc/services /mydata/  #写的数据进去
[root@centos7 ~]# umount /mydata/   #改btrfs前先卸载分区 
[root@centos7 ~]# fsck -f /dev/sda7   #强制修复
[root@localhost ~]# btrfs-convert /dev/sd7  #把ext系列的文件系统改成btrfs
[root@centos7 ~]# btrfs filesystem show   #显示已改成btrfs文件系统
Label: 'mydata'  uuid: 4483a0bc-7fa1-4691-b976-a1a98ebf448c
Total devices 2 FS bytes used 1.77MiB
devid    1 size 7.00GiB used 1.28GiB path /dev/sda5
devid    2 size 10.00GiB used 1.28GiB path /dev/sda6
Label: 'mydata'  uuid: 69d2e02d-4c41-4e58-a186-0202b73d326a
Total devices 1 FS bytes used 326.20MiB
devid    1 size 10.00GiB used 10.00GiB path /dev/sda7
[root@centos7 ~]# ls /mydata/    #数据依然还在
ext2_saved  lost+found  services











你可能感兴趣的:(btrfs,创建快照,创建btrfs,删除btrfs)