设为首页 收藏本站
查看: 385|回复: 0

[经验分享] btrfs文件系统初识及应用

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-8-31 08:42:51 | 显示全部楼层 |阅读模式
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个分区
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[iyunv@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;
1
2
3
4
5
6
7
8
[iyunv@centos7 ~]# mkfs.btrfs -L mydata /dev/sda5 /dev/sda6   #创建btrfs文件系统
Btrfs v3.16.2
See http://btrfs.wiki.kernel.org for more information.
[iyunv@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



1
2
3
4
[iyunv@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"
[iyunv@centos7 ~]# blkid /dev/sda6
/dev/sda6: LABEL="mydata" UUID="4483a0bc-7fa1-4691-b976-a1a98ebf448c" UUID_SUB="069a84fe-b9a0-47a2-851c-43ffa83d2aee" TYPE="btrfs"



1
2
3
4
[iyunv@centos7 ~]# mkdir /mysql
[iyunv@centos7 ~]# mount -o compress=lzo /dev/sda5 /mysql/   
#compress=lzo 指定压缩算法
#挂载btrfs文件系统(挂载btrfs设备一个任何即可)



1
2
3
4
5
6
7
8
9
[iyunv@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



1
2
3
4
5
6
7
8
9
10
11
[iyunv@centos7 ~]# btrfs filesystem resize -8G /mysql/  #文件系统缩减8G的容量,+8G表示拓展8G(resize 调整文件系统大小)
Resize '/mysql/' of '-8G'
[iyunv@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




1
2
3
4
5
6
7
8
9
10
11
btrfs device add /dev/*  /mount_point 新增设备至挂载点,实现自动自动扩容
[iyunv@centos7 ~]# btrfs device add /dev/sda7 /mysql/   #新增分区/dev/sda7至/mysql
[iyunv@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    #显示状态(并不是真正能看到)
1
[iyunv@localhost ~]# btrfs balance start /mydata    #开启balance  pause 暂停



移除一个物理卷   
btrfs device delete   #拆除一个物理卷  在支持联机状态会自动先移动数据再拆除
1
2
3
4
5
6
7
8
9
10
[iyunv@centos7 ~]# btrfs device delete /dev/sda7 /mysql/  #把/dev/sda7拆除
[iyunv@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



1
2
3
4
5
6
7
8
9
[iyunv@centos7 ~]# btrfs balance start -dconvert=raid5 /mysql/
                                #修改数据的raid级别,修改支持动态
                     -mconvert=raid5 #修改元数据的raid级別                        
Done, had to relocate 1 out of 3 chunks
[iyunv@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



创建子卷
1
2
3
[iyunv@centos7 mysql]# btrfs subvolume list /mysql/  #查看子卷是否挂载
[iyunv@centos7 mysql]# btrfs subvolume create /mysql/log    #创建子卷,而不是子目录
Create subvolume '/mysql/log'



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[iyunv@centos7 ~]# mount -o subvol=log /dev/sda5 /mnt/   挂载子卷到/mnt
[iyunv@centos7 ~]# ls /mnt/
[iyunv@centos7 ~]# cp /etc/se
securetty      security/      selinux/       services       sestatus.conf  
[iyunv@centos7 ~]# cp /etc/services /mnt/
[iyunv@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):



1
2
3
4
5
6
7
8
9
[iyunv@centos7 ~]# umount /mnt/
[iyunv@centos7 ~]# mount /dev/sda5 /mysql/  #挂载父卷依然能看到自己的数据,相反是不行的
[iyunv@centos7 ~]# ls /mysql/log
services
[iyunv@centos7 ~]# btrfs subvolume delete /mysql/log2  #删除子卷
Transaction commit: none (default)
Delete subvolume '/mysql/log2'
[iyunv@centos7 ~]# ls /mysql/
abc.txt  log



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




把ext系列的文件系统改成btrfs
1
2
3
4
[iyunv@centos7 ~]# btrfs device delete /dev/sda7 /mysql/ #先卸载一个分区(我没有去创建一个新分区)
[iyunv@centos7 mysql]# mke2fs -t ext4 -L mydata /dev/sda7  #格式化成ext4文件格式
[iyunv@centos7 ~]# mount /dev/sda7 /mydata/  #挂载
[iyunv@centos7 mysql]# cp /etc/services /mydata/  #写的数据进去



1
2
3
4
5
6
7
8
9
10
11
12
13
[iyunv@centos7 ~]# umount /mydata/   #改btrfs前先卸载分区
[iyunv@centos7 ~]# fsck -f /dev/sda7   #强制修复
[iyunv@localhost ~]# btrfs-convert /dev/sd7  #把ext系列的文件系统改成btrfs
[iyunv@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
[iyunv@centos7 ~]# ls /mydata/    #数据依然还在
ext2_saved  lost+found  services












运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-106562-1-1.html 上篇帖子: Linux周期性任务计划详解 下篇帖子: linux screen 配置文件 超好用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表