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个分区
[[email protected] ~]# 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;
[[email protected] ~]# mkfs.btrfs -L mydata /dev/sda5 /dev/sda6 #创建btrfs文件系统 Btrfs v3.16.2 See http://btrfs.wiki.kernel.org for more information. [[email protected] ~]# 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
[[email protected] ~]# blkid /dev/sda5 #显示的子卷uuid和物理uuid是不同的 /dev/sda5: LABEL="mydata" UUID="4483a0bc-7fa1-4691-b976-a1a98ebf448c" UUID_SUB="cd986ce4-38c2-4b9d-845e-6009af489925" TYPE="btrfs" [[email protected] ~]# blkid /dev/sda6 /dev/sda6: LABEL="mydata" UUID="4483a0bc-7fa1-4691-b976-a1a98ebf448c" UUID_SUB="069a84fe-b9a0-47a2-851c-43ffa83d2aee" TYPE="btrfs"
[[email protected] ~]# mkdir /mysql [[email protected] ~]# mount -o compress=lzo /dev/sda5 /mysql/ #compress=lzo 指定压缩算法 #挂载btrfs文件系统(挂载btrfs设备一个任何即可)
[[email protected] ~]# 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
[[email protected] ~]# btrfs filesystem resize -8G /mysql/ #文件系统缩减8G的容量,+8G表示拓展8G(resize 调整文件系统大小) Resize ‘/mysql/‘ of ‘-8G‘ [[email protected] ~]# 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 新增设备至挂载点,实现自动自动扩容 [[email protected] ~]# btrfs device add /dev/sda7 /mysql/ #新增分区/dev/sda7至/mysql [[email protected] ~]# 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 #显示状态(并不是真正能看到)
[[email protected] ~]# btrfs balance start /mydata #开启balance pause 暂停
移除一个物理卷
btrfs device delete #拆除一个物理卷 在支持联机状态会自动先移动数据再拆除
[[email protected] ~]# btrfs device delete /dev/sda7 /mysql/ #把/dev/sda7拆除 [[email protected] ~]# 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
[[email protected] ~]# btrfs balance start -dconvert=raid5 /mysql/ #修改数据的raid级别,修改支持动态 -mconvert=raid5 #修改元数据的raid级別 Done, had to relocate 1 out of 3 chunks [[email protected] ~]# 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
创建子卷
[[email protected] mysql]# btrfs subvolume list /mysql/ #查看子卷是否挂载 [[email protected] mysql]# btrfs subvolume create /mysql/log #创建子卷,而不是子目录 Create subvolume ‘/mysql/log‘
[[email protected] ~]# mount -o subvol=log /dev/sda5 /mnt/ 挂载子卷到/mnt [[email protected] ~]# ls /mnt/ [[email protected] ~]# cp /etc/se securetty security/ selinux/ services sestatus.conf [[email protected] ~]# cp /etc/services /mnt/ [[email protected] ~]# 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):
[[email protected] ~]# umount /mnt/ [[email protected] ~]# mount /dev/sda5 /mysql/ #挂载父卷依然能看到自己的数据,相反是不行的 [[email protected] ~]# ls /mysql/log services [[email protected] ~]# btrfs subvolume delete /mysql/log2 #删除子卷 Transaction commit: none (default) Delete subvolume ‘/mysql/log2‘ [[email protected] ~]# ls /mysql/ abc.txt log
创建快照
[[email protected] ~]# btrfs subvolume create /mysql/log3 #先创建一个子卷 Create subvolume ‘/mysql/log3‘ [[email protected] ~]# btrfs subvolume snapshot /mysql/log3/ /mysql/log3_snapshot #创建快照 Create a snapshot of ‘/mysql/log3/‘ in ‘/mysql/log3_snapshot‘ [[email protected] ~]# btrfs subvolume delete /mydata/log3_snapshot #删除快照卷
把ext系列的文件系统改成btrfs
[[email protected] ~]# btrfs device delete /dev/sda7 /mysql/ #先卸载一个分区(我没有去创建一个新分区) [[email protected] mysql]# mke2fs -t ext4 -L mydata /dev/sda7 #格式化成ext4文件格式 [[email protected] ~]# mount /dev/sda7 /mydata/ #挂载 [[email protected] mysql]# cp /etc/services /mydata/ #写的数据进去
[[email protected] ~]# umount /mydata/ #改btrfs前先卸载分区 [[email protected] ~]# fsck -f /dev/sda7 #强制修复 [[email protected] ~]# btrfs-convert /dev/sd7 #把ext系列的文件系统改成btrfs [[email protected] ~]# 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 [[email protected] ~]# ls /mydata/ #数据依然还在 ext2_saved lost+found services