Btrfs相关介绍:

Btrfs 是一个 Linux 中的新的写时复制(copy-on-write (COW))的文件系统,目的是实现高级功能的同时着重与容错功能,修复功能以及易于管理。目前由Oracle, Red Hat, 富士通, Intel, SUSE以及其他组织共同开发,在 GPL 许可证下发行,同时向任何人公开代码。


Btrfs核心特性:

多物理卷支持:btrfs可由多个底层物理卷组成;支持RAID,以联机“添加”、“移除”、“修改”;


写时复制更新机制(CoW):复制、更新及替换指针,而非“就地”更新;在文件进行修改的时候,首先将文件复制一份出来,在复制出来的文件上进行修改,修改完成之后,将指向原有文件的指针修改指向到修改完成的文件上,若修改完成的文件出现了错误,则我们可以通过原文件进行修复


数据及元数据校验码:checksum ,当存储某个文件时,checksum会将数据的源数据和数据的校验码,分别通过文件的属性扩展进行保存,当我们再次读取数据时可以方便的检测数据是否受损,如果文件受损系统可以完成自动修复;


子卷:sub_volume,在一个卷上创建多个子卷,在每一个子卷上创建文件系统,并挂载使用;


快照:支持快照的快照;因此可以实现类似增量快照的机制


透明压缩 :如果我们在存储文件时,进行压缩存储,那么在文件发往btrfs时,会自动的占用时钟周期,完成数据的压缩存放,而用户并不知道,在用户读取文件时,会自动的进行文件的解压缩,可以实现节约磁盘空间。但是压缩和解压缩会占用时钟周期;


Btrfs文件系统如何创建:



mkfs.btrfs
-L 'LABEL':指定文件系统的卷标;
-d <type>: raid0, raid1, raid5, raid6, raid10, single  指明数据的存放方式,支持RAID机制;
-m <profile>: raid0, raid1, raid5, raid6, raid10, single, dup 指明元数据的存放方式,是否可跨越多个物理卷,支持RAID机制;
-O <feature>:在格式化文件系统的时候,是否直接开启文件系统的某些特性;
-O list-all: 列出支持的所有特性;
[root@centos7 ~]# fdisk -l  #有三块硬盘sdb,sdc,sdd 用于创建btrfs 文件系统,大小均为20G
Disk /dev/sdd: 21.5 GB, 21474836480 bytes, 41943040 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/sdb: 21.5 GB, 21474836480 bytes, 41943040 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: 21.5 GB, 21474836480 bytes, 41943040 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
[root@centos7 ~]# mkfs.btrfs -L mydata  /dev/sdb /dev/sdc #将sdb,sdc创建为btrfs文件系统
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 mydata on /dev/sdb
nodesize 16384 leafsize 16384 sectorsize 4096 size 40.00GiB
[root@centos7 ~]# btrfs filesystem show   #查看系统上的所有btrfs文件系统
Label: 'mydata'  uuid: 70cf9f41-8977-4265-bf27-ca38b6459940
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
[root@centos7 ~]# blkid /dev/sdb    #查看设备sdb的属性
/dev/sdb: LABEL="mydata" UUID="70cf9f41-8977-4265-bf27-ca38b6459940" UUID_SUB="b8c340e2-6165-4b31-90df-278b5ac77a2f" TYPE="btrfs" 
[root@centos7 ~]# blkid /dev/sdc    #查看设备sdc的属性
/dev/sdc: LABEL="mydata" UUID="70cf9f41-8977-4265-bf27-ca38b6459940" UUID_SUB="a80e87bb-9564-488a-9c8f-a403d0e4090a" TYPE="btrfs"
可见/sdb,/sdc UUID一直,子卷UUID不同
[root@centos7 ~]# mkdir /mydata    #创建挂载点/mydata
[root@centos7 ~]# mount /dev/sdb /mydata   #挂载刚刚创建的文件系统,此时挂载/dev/sdc是一样的效果
[root@centos7 ~]# mount | grep /mydata    #挂载成功
/dev/sdb on /mydata type btrfs (rw,relatime,seclabel,space_cache)
#man btrfs filesystem 可用来查看命令帮助文档


调整btrfs文件系统大小(逻辑边界):



命令格式:btrfs filesystem resize  [<devid>:]<size>[gkm]|[<devid>:]max <path>

联机缩减文件系统大小

[root@centos7 ~]# btrfs filesystem resize -10G /mydata    #将文件系统大小缩减去10G
Resize '/mydata' of '-10G'
[root@centos7 ~]# df -lh /mydata    #此时文件系统大小变为了30G
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb         30G  1.0M   18G   1% /mydata

联机扩张文件系统大小:

[root@centos7 ~]# btrfs filesystem resize +5G /mydata    #将文件系统大小扩展5G
Resize '/mydata' of '+5G'
[root@centos7 ~]# df -lh /mydata    #建系统此时增加到了35G
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb         35G  1.0M   28G   1% /mydata
[root@centos7 ~]# btrfs filesystem resize max /mydata    #max,将文件系统大小调整至其物理边界40G
Resize '/mydata' of 'max'
[root@centos7 ~]# df -lh /mydata/
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb         40G  1.0M   38G   1% /mydata


调整btrfs物理边界大小:

命令格式:btrfs device add/delete/scan <dev>  MOUNT_POINT
[root@centos7 ~]# btrfs device add /dev/sdd /mydata    #为btrfs文件系统,增加一块硬盘sdd
[root@centos7 ~]# df -lh /mydata #完成后,总大小为60G
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb         60G  1.0M   56G   1% /myda


透明压缩:


只需在挂载时候,使用-o 并指定压缩方式即可,对用户是透明的,可以选择lzo或zlib两种压缩方式

命令格式:mount -o compress={lzo|zlib} DEVICE MOUNT_POINT


btrfs文件均衡:



命令格式: btrfs balance start [OPTIONS] <FILTERS> MOUNT_POINT

常用选项有:

-d: 指定数据的组织机制

-s:指定元数据的组织机制

-m:指定文件系统的组织机制

[root@centos7 ~]# btrfs device add /dev/sdd /mydata    #添加 sdd设备到btrfs文件系统
[root@centos7 ~]# btrfs filesystem show   #查看btrf文件系统信息
Label: 'mydata'  uuid: 70cf9f41-8977-4265-bf27-ca38b6459940
Total devices 3 FS bytes used 640.00KiB
devid    2 size 20.00GiB used 2.03GiB path /dev/sdc
devid    3 size 20.00GiB used 0.00 path /dev/sdb
 devid    4 size 20.00GiB used 1.03GiB path /dev/sdd
[root@centos7 ~]# btrfs balance start -mconvert=raid5 /mydata  #均衡文件,并使用raid5组织文件系统
Done, had to relocate 2 out of 3 chunk
注:raid5,至少需要3块磁盘。
删除btrfs的物理卷:
[root@centos7 ~]# btrfs device delete /dev/sdb /mydata    #将sdb设备移除
[root@centos7 ~]# df -lh /mydata
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdc         40G  1.0M   38G   1% /mydata
[root@centos7 ~]# btrfs filesystem show /mydata    #可见sdb 设备已经移除
Label: 'mydata'  uuid: 70cf9f41-8977-4265-bf27-ca38b6459940
Total devices 2 FS bytes used 640.00KiB
devid    2 size 20.00GiB used 2.03GiB path /dev/sdc
devid    3 size 20.00GiB used 1.03GiB path /dev/sdd
Btrfs v3.16.2


btrfs子卷管理:



创建子卷:

命令格式: btrfs subvolume create  /PATH 此路径必须是在btrfs文件系统的挂载目录下
[root@centos7 ~]# btrfs subvolume create /mydata/subvol    #创建子卷,子卷名为subvol
Create subvolume '/mydata/subvol'
[root@centos7 ~]# btrfs subvolume create /mydata/subvol1    #再创建子卷,子卷名为subvol1
Create subvolume '/mydata/subvol1'
[root@centos7 ~]# btrfs subvolume list /mydata    #查看btrfs 文件系统下的所有子卷信息
ID 262 gen 73 top level 5 path subvol    #ID 262 是子卷subvol的ID,可以用该ID来挂载该卷
ID 263 gen 74 top level 5 path subvol1

挂载子卷:

命令格式:  mount -o subvol=SUBVOLUME  DEVICE /MOUNT_POIN
[root@centos7 ~]# mount -o subvol=subvol /dev/sdb /mnt    #将子卷单独挂载到/mnt目录下
[root@centos7 ~]# ls /mnt    #此时是没有任何内容的
查看子卷相关信息:
命令格式:btrfs subvolume show MOUNT_POINT
[root@centos7 ~]# btrfs subvolume show /mnt    #查看子卷信息
/mnt
Name: subvol
uuid: f0b08e73-e73e-774c-9f3e-262f52eea64f
Parent uuid: -
Creation time: 2015-09-29 00:23:14
Object ID: 262
Generation (Gen): 76
Gen at creation: 73
Parent: 5
Top Level: 5
Flags: -
Snapshot(s):
[root@centos7 ~]# cp /var/log/messages /mnt    #复制messages文件到子卷subvol
[root@centos7 ~]# ls /mnt
messages
[root@centos7 ~]# umount /mnt    #卸载子卷subvol
[root@centos7 ~]# mount /dev/sdb /mydata    #将这个btrfs文件系统挂载到/mydata目录
[root@centos7 ~]# ls /mydata
subvol  subvol1
[root@centos7 ~]# ls /mydata/subvol    #可见子卷subvol的内容是可见的,所以说一旦父卷挂载,子卷就被自动挂载了
messages
注:由于是子卷,如果父卷已经挂载,则子卷就自动被挂载了
反之,如果只挂载子卷,父卷内容是不会自动挂载的,其内容,不可见
[root@centos7 ~]# umount /mydata    #卸载父卷,
[root@centos7 ~]# mount -o subvol=subvol /dev/sdb /mydata    #单独挂载子卷
[root@centos7 ~]# ls /mydata/    #此时/mydata下只有子卷的内容,并不会有父卷的内容:如subvol,subvol1目录
messages
子卷,父卷也可以分别挂载:(可是没必要单独挂载子卷,父卷挂载完成后,子卷也就被自动挂载了)
[root@centos7 ~]# umount /mydata    #卸载子卷
[root@centos7 ~]# mount -o subvol=subvol /dev/sdb /mnt    #挂载子卷到/mnt目录
[root@centos7 ~]# mount /dev/sdb /mydata           #挂载父卷到/mydata目录
[root@centos7 ~]# ls /mydata/    #此时父卷挂载成功
f1.txt  subvol  subvol1
[root@centos7 ~]# ls /mnt     #子卷内容也可单独显示
messages


删除子卷:



命令格式:btrfs subvolume delete /MOUNT_POINT
[root@centos7 ~]# btrfs subvolume delete /mydata/subvol    #删除子卷subvol
Transaction commit: none (default)
Delete subvolume '/mydata/subvol'
[root@centos7 ~]# btrfs subvolume list /mydata    #已经没有了子卷subvol信息了
ID 263 gen 74 top level 5 path subvol1
[root@centos7 ~]# btrfs subvolume snapshot /mydata/subvol1/ /mydata/subvol1_snapshot
Create a snapshot of '/mydata/subvol1/' in '/mydata/subvol1_snapshot'


子卷快照

命令格式:btrfs subvolume snapshot /PATH/TO/SUBVOLUME /PATH/TO/SNAPSHOT
[root@centos7 ~]# cp /etc/passwd /mydata/subvol1/    #复制passwd文档到子卷subvol1内
[root@centos7 ~]# btrfs subvolume snapshot /mydata/subvol1/ /mydata/subvol1_snapshot     #创建快照subvol1_snapshot
Create a snapshot of '/mydata/subvol1/' in '/mydata/subvol1_snapshot'
[root@centos7 ~]# btrfs subvolume list /mydata    #快照子卷subvol1_snapshot创建完成
ID 263 gen 84 top level 5 path subvol1
ID 264 gen 84 top level 5 path subvol1_snapshot
[root@centos7 ~]# echo "TEST FOR SNAPSHOT" >> /mydata/subvol1/passwd #在passwd文档后追加一行 "TEST FOR SNAPSHOT" 
[root@centos7 ~]# tail -1 /mydata/subvol1/passwd     #此时子卷中数据更新了
TEST FOR SNAPSHOT
[root@centos7 ~]# tail -1 /mydata/subvol1_snapshot/passwd  #此时快照中的passwd并没有更新,末尾没有"TEST FOR SNAPSHOT" 这行
root1:x:1000:1000:root1:/home/root1:/bin/bash
注:在子卷创建快照后,对原子卷做的修改操作并不会反映到快照中。


ext文件系统和btrfs文件系统互转:


命令格式:btrfs-convert [-r] Device 
    不使用-r 代表从普通文件系统,转化成btrfs文件系统
    -r:从btrfs回滚到之前的文件系统
[root@centos7 subvol1]# btrfs balance start  -mconvert=raid1 /mydata   #将之前的RAID5降级到RAID1,接下来才可以拆去三块硬盘中的其中一块
Done, had to relocate 2 out of 3 chunks
[root@centos7 subvol1]# btrfs balance start  -dconvert=raid1 /mydata    
Done, had to relocate 1 out of 3 chunks
[root@centos7 subvol1]# btrfs device  delete /dev/sdd /mydata   #此时移除设备sdd
[root@centos7 ~]# fdisk /dev/sdd       #将sdd重新创建分区sdd1
[root@centos7 ~]# mkfs.ext4 /dev/sdd1    #格式化为ext4文件系统
[root@centos7 subvol1]# mount /dev/sdd1 /mnt    #挂载sdd1
[root@centos7 subvol1]# ls /mnt 
lost+found
[root@centos7 subvol1]# cp /etc/fstab /mnt    #复制文件fstab到 /mnt
[root@centos7 ~]# ls /mnt
fstab  lost+found
[root@centos7 subvol1]# umount /mnt    #卸载文件系统,不要在线做文件系统转换
[root@centos7 subvol1]# fsck -f /dev/sdd1    #做强制检测
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/sdd1: 12/1310720 files (0.0% non-contiguous), 126323/5242624 blocks
[root@centos7 ~]# btrfs-convert /dev/sdd1
creating btrfs metadata.
creating ext2fs p_w_picpath file.
cleaning up system chunk.
conversion complete.
 
[root@centos7 ~]# btrfs filesystem show
Label: 'mydata'  uuid: cce40d16-b7ff-4346-9bbd-a498ad6d7633
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
Label: none  uuid: 7d62e69a-574b-41f8-ab83-718be0d2f5f4
Total devices 1 FS bytes used 493.50MiB
devid    1 size 20.00GiB used 20.00GiB path /dev/sdd1   #可见sdd1已经转化成了btrfs文件系统
[root@centos7 ~]# mount /dev/sdd1 /mnt
[root@centos7 ~]# ls /mnt
ext2_saved  fstab  lost+found
[root@centos7 ~]# cat /mnt/fstab    #之前的文件fstab仍旧可以正常访问
#
# /etc/fstab
# Created by anaconda on Wed Aug 19 11:07:17 2015
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=d4443e1c-7ecc-4393-9193-94beffba73e7 /boot                   xfs     defaults        0 0
/dev/mapper/centos-home /home                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults

将btrfs文件系统回滚到原普通文件系统




[root@centos7 ~]# umount /mnt
[root@centos7 ~]# btrfs-convert -r /dev/sdd1
rollback complete.
[root@centos7 ~]# mount /dev/sdd1 /mnt
[root@centos7 ~]# ls /mnt
fstab  lost+found
[root@centos7 ~]# blkid /dev/sdd1    #参考sdd1信息,可见其为ext4文件系统
/dev/sdd1: UUID="698281c8-c549-46dc-976f-ba509d531f83" TYPE="ext4" 
[root@centos7 ~]# cat /mnt/fstab #且原文件仍旧可以正常访问
#
# /etc/fstab
# Created by anaconda on Wed Aug 19 11:07:17 2015
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=d4443e1c-7ecc-4393-9193-94beffba73e7 /boot                   xfs     defaults        0 0
/dev/mapper/centos-home /home                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0