1、何为btrfsnode
Btrfs(一般念成Butter FS,B-tree, Better FS),由Oracle于2007年宣布并进行中的COW(copy-on-write式)文件系统。GPL受权的开源文件系统。目标是取代Linux目前的ext3文件系统,改善ext3的限制,特别是单一文件大小的限制,总文件系统大小限制以及加入文件校验和特性。加入目前ext3/4未支持的一些功能,例如可写的磁盘快照(snapshots),以及支持递归的快照(snapshots of snapshots),内建磁盘阵列(RAID)支持,支持子卷(Subvolumes)的概念,容许在线调整文件系统大小。linux
文件系统彷佛是内核中比较稳定的部分,多年来,人们一直使用 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 表现出了极大的关注,投入了资金和人力。bash
2、btrfs的核心特性ide
多物理卷支持:btrfs可由多个底层物理卷组成;支持RAID,以联机“添加”、“移除”,“修改”;工具
写时复制更新机制(CoW):复制、更新及替换指针,而非“就地”更新。即当咱们修改某个文件的时候,不会直接修改源文件,而是复制一份而后对复制的文件进行修改,修改完把源文件的指针指向复制的文件。ui
数据及元数据校验码:存储每个文件的时候,会把数据的校验码和元数据的校验码经过文件某些扩展保存下来,每一个文件读取时快速校验文件是否损坏,若是检测到损坏还会自动尝试进行修复。spa
子卷:sub_volume,每个子卷均可以独立进行挂载debug
快照:Btrfs 支持建立快照 (snapshot),和克隆 (clone) ,支持快照的快照;指针
透明压缩:任何数据流发往btrfs文件系统的时候,它自动可以经过占据CPU的时钟周期完成数据压缩后存放,当文件须要读取的时候又自动解压缩。可以节约空间,可是花费CPU时钟周期。orm
3、btrfs的管理
在Centos 7以上的版本中,btrfs默认是已经支持的了,可是在Centos 7如下的版本中,若是想要使用btrfs须要从新编译和更新内核及其对应的管理工具。
[root@localhost ~]# mkfs mkfs mkfs.cramfs mkfs.ext3 mkfs.minix mkfs.btrfs mkfs.ext2 mkfs.ext4 mkfs.xfs #默认安装的Centos 7已经支持btrfs文件系统
在实验中,为了演示真实生产环境,咱们为虚拟主机添加了三块硬盘来作实验,由于btrfs数据和元数据存放机制是能够基于阵列的形式的,同个硬盘的同一分区作btrfs除了单纯的组合分区大小外并没有其余意义。
[root@localhost ~]# fdisk -l Disk /dev/sda: 107.4 GB, 107374182400 bytes, 209715200 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0x00012971 Device Boot Start End Blocks Id System /dev/sda1 * 2048 2099199 1048576 83 Linux /dev/sda2 2099200 44042239 20971520 83 Linux /dev/sda3 44042240 48236543 2097152 82 Linux swap / Solaris Disk /dev/sdb: 8589 MB, 8589934592 bytes, 16777216 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/sdc: 8589 MB, 8589934592 bytes, 16777216 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/sdd: 8589 MB, 8589934592 bytes, 16777216 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes #能够看到新添加的三块硬盘:/dev/sdb,/dev/sdc,/dev/sdd
建立btrfs文件系统:
mkfs.btrfs
-L 'LABEL':指定卷标名
-d <type>: raid0, raid1, raid5, raid6, raid10, single:指定数据的存放机制
-m <profile>: raid0, raid1, raid5, raid6, raid10, single , dup:指定元数据的存放机制
-O <feature>:指定格式化时启动的feature,不是全部内核都支持,须要内核启动对应的某些功能
-O list-all: 列出支持的全部feature;
[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 nodesize 16384 leafsize 16384 sectorsize 4096 size 16.00GiB #把/dev/sdb和/dev/sdc以默认的机制整合为一个btrfs文件系统,LABEL名存放在/dev/sdb上,总大小为两个硬盘大小 [root@localhost ~]# btrfs filesystem show Label: 'mybtrfs' uuid: d004175e-6488-4ded-a50b-815d58542171 Total devices 2 FS bytes used 112.00KiB devid 1 size 8.00GiB used 1.83GiB path /dev/sdb devid 2 size 8.00GiB used 1.81GiB path /dev/sdc #显示btrfs文件系统的信息,这里能够看到咱们刚刚建立的卷标名为:mybtrfs的uuid,和整合的两个硬盘 [root@localhost ~]# blkid /dev/sdb /dev/sdb: LABEL="mybtrfs" UUID="d004175e-6488-4ded-a50b-815d58542171" UUID_SUB="814a7aa3-77e7-442b-845d-dfbeaa14e143" TYPE="btrfs" [root@localhost ~]# blkid /dev/sdc /dev/sdc: LABEL="mybtrfs" UUID="d004175e-6488-4ded-a50b-815d58542171" UUID_SUB="0f17445e-24b3-43fa-b8df-ffe49bbb2852" TYPE="btrfs" #这里能够看到两个硬盘的UUID是同样的,说明属于同一个btrfs文件系统卷,可是子卷UUID_SUB是不同的 [root@localhost ~]# mkdir /mybtrfs [root@localhost ~]# mount /dev/sdb /mybtrfs/ [root@localhost ~]# mount proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime,seclabel) devtmpfs on /dev type devtmpfs (rw,nosuid,seclabel,size=499884k,nr_inodes=124971,mode=755) securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime) tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,seclabel) devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,seclabel,gid=5,mode=620,ptmxmode=000) configfs on /sys/kernel/config type configfs (rw,relatime) /dev/sda2 on / type ext4 (rw,relatime,seclabel,data=ordered) selinuxfs on /sys/fs/selinux type selinuxfs (rw,relatime) systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=30,pgrp=1,timeout=300,minproto=5,maxproto=5,direct) mqueue on /dev/mqueue type mqueue (rw,relatime,seclabel) hugetlbfs on /dev/hugepages type hugetlbfs (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/sdb on /mybtrfs type btrfs (rw,relatime,seclabel,space_cache) [root@localhost ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda2 20G 903M 18G 5% / devtmpfs 489M 0 489M 0% /dev tmpfs 497M 0 497M 0% /dev/shm tmpfs 497M 6.6M 491M 2% /run tmpfs 497M 0 497M 0% /sys/fs/cgroup /dev/sda1 1014M 114M 901M 12% /boot /dev/sdb 16G 896K 14G 1% /mybtrfs #能够看到咱们建立挂载的btrfs已经能够正常使用
前面咱们说过btrfs是支持透明压缩机制的,在Centos 7中,mount有个选项是支持透明压缩机制的,若是须要开启,挂载的时候可使用下面命令:
mount -o compress={lzo|zlib} DEVICE MOUNT_POINT
[root@localhost mybtrfs]# mount -o compress=zlib /dev/sdb /mybtrfs/
4、btrfs的管理
①、查看和设置btrfs文件系统
btrfs filesystem show
--mounted:查看已经挂载的btrfs文件系统信息
--all-devices:查看全部的btrfs文件系统信息,默认值
<path>|<uuid>|<device>|<label>:指明查看具体挂载路径,uuid,设备,卷标名的btrfs文件系统信息
[root@localhost mybtrfs]# btrfs filesystem show --mounted Label: 'mybtrfs' uuid: d004175e-6488-4ded-a50b-815d58542171 Total devices 2 FS bytes used 768.00KiB devid 1 size 8.00GiB used 1.83GiB path /dev/sdb devid 2 size 8.00GiB used 1.81GiB path /dev/sdc
btrfs filesystem sync
<path>:把挂载使用的btrfs文件系统在内存中的数据同步到硬盘上
btrfs filesystem df
<path>:查看已挂载的btrfs文件系统的数据和元数据使用率状况
[root@localhost mybtrfs]# btrfs filesystem df /mybtrfs/ Data, RAID0: total=1.60GiB, used=640.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
btrfs filesystem label
<device>|<mount_point>:查看设备和挂载点的LABEL名
[<device>|<mount_point>] [<newlabel>]:修改设备和挂载点的LABEL名
[root@localhost mybtrfs]# btrfs filesystem label /dev/sdd mybtrfs1 [root@localhost mybtrfs]# btrfs filesystem label /dev/sdd mybtrfs1
btrfs filesystem resize
[<devid>:]<size>[gkm]|[<devid>:]max <path>:调整挂载的btrfs文件系统的大小
[root@localhost mybtrfs]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda2 20G 903M 18G 5% / devtmpfs 489M 0 489M 0% /dev tmpfs 497M 0 497M 0% /dev/shm tmpfs 497M 6.6M 491M 2% /run tmpfs 497M 0 497M 0% /sys/fs/cgroup /dev/sda1 1014M 114M 901M 12% /boot /dev/sdb 16G 896K 14G 1% /mybtrfs [root@localhost mybtrfs]# btrfs filesystem resize -4G /mybtrfs/ Resize '/mybtrfs/' of '-4G' [root@localhost mybtrfs]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda2 20G 903M 18G 5% / devtmpfs 489M 0 489M 0% /dev tmpfs 497M 0 497M 0% /dev/shm tmpfs 497M 6.6M 491M 2% /run tmpfs 497M 0 497M 0% /sys/fs/cgroup /dev/sda1 1014M 114M 901M 12% /boot /dev/sdb 12G 896K 6.0G 1% /mybtrfs #能够看到mybtrfs大小由原来的16G变为12G [root@localhost mybtrfs]# btrfs filesystem resize max /mybtrfs/ Resize '/mybtrfs/' of 'max' #直接把逻辑边界调整为最大物理边界值
②、查看和设置btrfs设备
btrfs device add [-Kf] <dev> [<dev>...] <path>:为已经建立的btrfs中新添加一个设备,当硬盘已经格式化为其余文件系统时候,须要指定-f进行强制执行
[root@localhost mybtrfs]# btrfs device add /dev/sdd /mybtrfs/ [root@localhost mybtrfs]# btrfs filesystem show Label: 'mybtrfs' uuid: d004175e-6488-4ded-a50b-815d58542171 Total devices 3 FS bytes used 768.00KiB devid 1 size 8.00GiB used 1.83GiB path /dev/sdb devid 2 size 8.00GiB used 1.81GiB path /dev/sdc devid 3 size 8.00GiB used 0.00 path /dev/sdd #这里咱们能够看到新添加的磁盘中使用为0,这是由于新添加的磁盘数据没有均衡到新磁盘中 [root@localhost mybtrfs]# btrfs balance start /mybtrfs/ Done, had to relocate 6 out of 6 chunks [root@localhost mybtrfs]# btrfs filesystem show Label: 'mybtrfs' uuid: d004175e-6488-4ded-a50b-815d58542171 Total devices 3 FS bytes used 448.00KiB devid 1 size 8.00GiB used 1.03GiB path /dev/sdb devid 2 size 8.00GiB used 256.00MiB path /dev/sdc devid 3 size 8.00GiB used 288.00MiB path /dev/sdd #添加完硬盘的时候须要对数据进行均衡操做,让数据平衡存放到各硬盘中
btrfs device delete [-Kf] <dev> [<dev>...] <path>:在已经建立的btrfs删除一个设备
[root@localhost mybtrfs]# btrfs device delete /dev/sdb /mybtrfs/ #删除设备时,btrfs的容量要大于数据容量,删除设备btrfs会自动把删除的设备中的数据移动到其余设备中
btrfs device scan [(--all-devices|-d)|<device> [<device>...]]:扫描btrfs中的设备
btrfs device stats [(--all-devices|-d)|<device> [<device>...]]:显示I/O统计数据
③、均衡全部数据到各btrfs设备,从新修改数据和元数据的组织机制
btrfs balance start <path>:当咱们联机添加硬盘时,就须要把以前硬盘中的数据均衡到全部的硬盘中
[root@localhost mybtrfs]# btrfs balance start /mybtrfs/
注意:修改数据存放机制,设备若是不够的话raid级别是不支持的。入raid5至少须要三块硬盘
btrfs balance start -dconvert= raid0,raid1,raid5,raid6,raid10,single <path>:联机修改数据的存放机制
[root@localhost mybtrfs]# btrfs balance start -dconvert=raid5 /mybtrfs/ Done, had to relocate 1 out of 3 chunks
btrfs balance start -mconvert= raid0,raid1,raid5,raid6,raid10,single,dup <path>:联机修改元数据的存放机制
[root@localhost mybtrfs]# btrfs balance start -mconvert=raid5 /mybtrfs/ Done, had to relocate 2 out of 3 chunks
btrfs balance status <path>:查看当前磁盘均衡信息
btrfs balance pause <path>:暂停数据均衡,若是数据量太大又遇到业务繁忙时,能够暂时中止
btrfs balance resume <path>:从新执行中止的数据均衡
btrfs balance cancel <path>:清除运行或中止的数据均衡
④、管理btrfs设备子卷
btrfs subvolume create [-i <qgroupid>] <name>:建立子卷
[root@localhost mybtrfs]# btrfs subvolume create /mybtrfs/logs Create subvolume '/mybtrfs/logs' [root@localhost mybtrfs]# btrfs subvolume list /mybtrfs/ ID 262 gen 57 top level 5 path logs #如今能够查看到logs子卷,ID为262 root@localhost /]# umount /mybtrfs/ [root@localhost /]# mkdir /logs [root@localhost /]# mount -o subvol=logs /dev/sdb /logs/ #当挂载父卷的时候,全部的子卷都会默认挂载,使用此命令单独挂载子卷
btrfs subvolume delete [options] <subvolume> [<subvolume>...]:删除子卷
[root@localhost mybtrfs]# btrfs subvolume delete /mybtrfs/logs/ Transaction commit: none (default) Delete subvolume '/mybtrfs/logs'
btrfs subvolume list [options] [-G <value>] [-C <value>] [--sort=rootid,gen,ogen,path] <path>:列出全部或指定的子卷
[root@localhost mybtrfs]# btrfs subvolume list /mybtrfs/ ID 262 gen 57 top level 5 path logs #如今能够查看到logs子卷,ID为262
btrfs subvolume snapshot [-r] <source> <dest>|<name>:作快照
[root@localhost mybtrfs]# btrfs subvolume create /mybtrfs/logs Create subvolume '/mybtrfs/logs' [root@localhost mybtrfs]# btrfs subvolume snapshot /mybtrfs/logs/ /mybtrfs/logs_snapshot Create a snapshot of '/mybtrfs/logs/' in '/mybtrfs/logs_snapshot' [root@localhost mybtrfs]# btrfs subvolume list /mybtrfs/ ID 262 gen 64 top level 5 path logs ID 263 gen 64 top level 5 path logs_snapshot #能够查看此时快照卷做为父卷的子卷已经生产。
因为btrfs写时复制的机制,这里还能够对单个文件进行快照
[root@localhost logs]# cp --reflink passwd passwd.snap
btrfs subvolume get-default <path>:查看那个子卷为默认卷
btrfs subvolume set-default <id> <path>:设置默认子卷
btrfs subvolume show <path>:查看子卷的详细信息
[root@localhost /]# btrfs subvolume show /logs/ /logs Name: logs uuid: 7776e291-e9c4-664d-8eb7-15a42a1bdcb4 Parent uuid: - Creation time: 2015-09-29 07:28:59 Object ID: 262 Generation (Gen): 58 Gen at creation: 57 Parent: 5 Top Level: 5 Flags: - Snapshot(s):
⑤、将其余文件系统转换为btrfs系统
一、对须要转换的文件系统进行强制检查
[root@localhost logs]# fsck -f /dev/sda4 fsck from util-linux 2.23.2 e2fsck 1.42.9 (28-Dec-2013) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information /dev/sda4: 11/655360 files (0.0% non-contiguous), 83137/2621440 block
二、使用btrfs-convert命令进行转换
[root@localhost logs]# btrfs-convert /dev/sda4 creating btrfs metadata. creating ext2fs p_w_picpath file. cleaning up system chunk. conversion complete.
三、查看是否转换成功并挂载查看是否正常
[root@localhost logs]# btrfs filesystem show Label: none uuid: 5eb3f147-519a-49ea-ad21-d754f966aafa Total devices 1 FS bytes used 324.80MiB devid 1 size 10.00GiB used 10.00GiB path /dev/sda4
四、对转换成功的文件系统降级回原来的文件系统
[root@localhost logs]# btrfs-convert -r /dev/sda4 rollback complete. [root@localhost logs]# blkid /dev/sda4 /dev/sda4: UUID="b9b43946-e2df-4348-b431-0cb5212b2f0d" TYPE="ext4" #这里能够看到/dev/sda4已经降级会ext4