Btrfs文件系统

一:概述

    1.1简介

        Btrfs被称为是下一代Linux文件系统。通常念成 Butter FS,Better FS 或B-tree FS。它采用了很多先进的文件系统设计,不仅解决了 ext2/3的扩展性问题,支持写时拷贝(copy-on-write),支持高效的snapshot和clone,使用b-tree作为存储的数据结构。让人们看到了下一代文件系统所具有的许多其他特性。

    1.2原理及特性
    扩展性相关特性
        B-Tree:btrfs文件系统中所有的metadata都由BTree管理。使用 BTree 的主要好处在于查找,插入和删除操作都很高效。
        基于Extent的文件存储:Extent就是一些连续的block,一个extent由起始的block加上长度进行指定,故Extent 能有效地减少元数据开销。
        动态inode分配:每一个inode只是BTree中的一个节点,用户可以无限制地任意插入新的inode,其物理存储位置是动态分配的。所以btrfs没有对文件个数的限制。
        SSD优化支持:Btrfs文件系统针对SSD的分布写操作技术特性做优化,不仅能提高SSD的使用寿命,而且能提高读写性能。
    数据一致性相关特性
        COW(copy-on-write):即每次写磁盘数据时,先将更新数据写入一个新的“块”,当新数据写入成功之后,再更新相关的数据结构指向新 “块”。
        Checksum技术:保证了数据的可靠性,避免silent corruption现象。因硬件原因,从磁盘上读出的数据会出错,而且这样的错误是不会被上层软件所察觉。解决这个问题的方法是保存数据的校验和,在读取数据后检查校验和。如果不符合,便知道数据出现了错误。
    多设备管理特性
        Subvolume(子卷管理):采用subvolume技术,可以将一个大的文件系统可以被划分为多个子文件系统,这些子文件系统共享底层的设备空间,在需要磁盘空间时便从底层设备中分配。
        Snapshot(快照管理):快照是对文件系统某一时刻的完全备份。建立快照之后,对文件系统的修改不会影响快照中的内容。
        软件RAID:基于多物理磁盘设备的前提条件下,Btrfs对metadata及date支持软件RAID技术,使其数据安全性及冗余性更高。默认情况下对metadata实施RAID1。

二:命令指令

    2.1操作系统环境&软件版本信息

# cat /proc/version
Linux version 3.10.0-327.13.1.el7.x86_64 (builder@kbuilder.dev.centos.org) 
(gcc version 4.8.3 20140911 (Red Hat 4.8.3-9) (GCC) ) #1 SMP Thu Mar 31 16:04:38 UTC 2016

# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)     #Minimal

# btrfs version
btrfs-progs v3.19.1

# mkfs.btrfs -V
mkfs.btrfs, part of btrfs-progs v3.19.1

    2.2安装
        Centos_7.2系统默认集成Btrfs及相关工具

    2.3命令说明

mkfs.btrfs [options] <device> [<device>...]            #用于创建Btrfs文件系统
常用选项:
    -d PROFILE    #data存储级别:raid0, raid1, raid5, raid6, raid10, dup or single
    -f    #强制覆盖已存在的文件系统
    -L LABEL    #设置磁盘卷表
    -m PROFILE    #metadata存储级别:raid0, raid1, raid5, raid6, raid10, dup or single
    -n SIZE    #设置nodesize大小
    -O LIST    #设置或者罗列文件系统特性
    -U UUID    #指定UUID设备号
btrfs <command> [<args>]            #对Btrfs文件系统进行管理及控制
常用子命令:
    balance    #磁盘数据分布平衡操作
    check    #btrfs磁盘扫描&校验
    device    #磁盘物理设备管理及控制
    filesystem    #文件系统的信息查询及修改
    subvolume    #子卷管理&快照管理
btrfs-convert    #将ext2文件系统转换成btrfs文件系统
常用选项:
        -r    #将btrfs文件系统还原回ext2文件系统

三:使用教程

    前期准备工作:为虚拟机添加4块磁盘

新建位图图像.bmp

# fdisk -l
Disk /dev/sdb: 2147 MB, 2147483648 bytes, 4194304 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: 2147 MB, 2147483648 bytes, 4194304 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/sde: 2147 MB, 2147483648 bytes, 4194304 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: 2147 MB, 2147483648 bytes, 4194304 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/sda: 42.9 GB, 42949672960 bytes, 83886080 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: 0x000187db
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     1026047      512000   83  Linux
/dev/sda2         1026048     3123199     1048576   82  Linux swap / Solaris
/dev/sda3         3123200    83886079    40381440   83  Linux

    3.1创建btrfs文件系统

# mkfs.btrfs -L mybtrfs -d raid5 -m raid5 /dev/sdb /dev/sdc /dev/sdd 
btrfs-progs v3.19.1
See http://btrfs.wiki.kernel.org for more information.

Turning ON incompat feature 'extref': increased hardlink limit per file to 65536
Turning ON incompat feature 'raid56': raid56 extended format
Turning ON incompat feature 'skinny-metadata': reduced-size metadata extent refs
adding device /dev/sdc id 2
adding device /dev/sdd id 3
fs created label mybtrfs on /dev/sdb
    nodesize 16384 leafsize 16384 sectorsize 4096 size 6.00GiB

创建btrfs文件系统,指定卷标为 mybtrfs,并指定matadata与data数据存储级别为raid5(PS:需要3盘磁盘支持,raid10需要4块,raid1&raid0需要2块)

    3.2查看btrfs文件系统相关信息

# btrfs filesystem show
Label: 'mybtrfs'  uuid: b8557848-3dde-41b7-8025-056e8e7d2938
    Total devices 3 FS bytes used 112.00KiB
    devid    1 size 2.00GiB used 437.50MiB path /dev/sdb
    devid    2 size 2.00GiB used 417.50MiB path /dev/sdc
    devid    3 size 2.00GiB used 417.50MiB path /dev/sdd

# blkid /dev/sdb /dev/sdc /dev/sdd
/dev/sdb: LABEL="mybtrfs" UUID="b8557848-3dde-41b7-8025-056e8e7d2938" UUID_SUB="ba10169d-0487-41cd-a27c-0c4f3c175be3" TYPE="btrfs" 
/dev/sdc: LABEL="mybtrfs" UUID="b8557848-3dde-41b7-8025-056e8e7d2938" UUID_SUB="666ffc52-9c45-40e5-aaf9-869746ae5d7c" TYPE="btrfs" 
/dev/sdd: LABEL="mybtrfs" UUID="b8557848-3dde-41b7-8025-056e8e7d2938" UUID_SUB="d2927b8d-ac87-4191-8edf-c19658b67245" TYPE="btrfs"

    3.3挂载并使用btrfs文件系统

# mount -t btrfs LABEL=mybtrfs /mnt
# mount -t btrfs -o SSD LABEL=mybtrfs /mnt    #SSD 优化选项
# mount
/dev/sdb on /mnt type btrfs (rw,relatime,seclabel,space_cache)
# umount /mnt/

    3.4挂载设备磁盘空间的增加及减少(逻辑空间的收缩及扩张)

# btrfs filesystem resize -1G /mnt    #挂载空间缩小1G空间
Resize '/mnt' of '-1G'
# df -Th
/dev/sdb       btrfs     5.0G   17M  4.2G   1% /mnt

# btrfs filesystem resize max /mnt    #空间增长还原至逻辑空间最大值
Resize '/mnt' of 'max'
# df -Th
/dev/sdb       btrfs     6.0G   17M  5.2G   1% /mnt

    3.5磁盘空间的增加及减少(物理磁盘设备的增加及减少)

# btrfs device add /dev/sde /mnt    #添加新物理磁盘到现有btrfs文件系统中

# btrfs filesystem show
Label: 'mybtrfs'  uuid: b8557848-3dde-41b7-8025-056e8e7d2938
    Total devices 4 FS bytes used 256.00KiB
    devid    1 size 2.00GiB used 437.50MiB path /dev/sdb
    devid    2 size 2.00GiB used 417.50MiB path /dev/sdc
    devid    3 size 2.00GiB used 417.50MiB path /dev/sdd
    devid    4 size 2.00GiB used 0.00B path /dev/sde

# btrfs balance start /mnt    #新添加进的磁盘空间利用率为0,为使数据平均分布在各个磁盘,使用balance子命令平衡数据分布
Done, had to relocate 6 out of 6 chunks
# btrfs filesystem show
Label: 'mybtrfs'  uuid: b8557848-3dde-41b7-8025-056e8e7d2938
    Total devices 4 FS bytes used 384.00KiB
    devid    1 size 2.00GiB used 416.00MiB path /dev/sdb
    devid    2 size 2.00GiB used 416.00MiB path /dev/sdc
    devid    3 size 2.00GiB used 416.00MiB path /dev/sdd
    devid    4 size 2.00GiB used 416.00MiB path /dev/sde

# btrfs device delete /dev/sde /mnt    #删除新物理磁盘到现有btrfs文件系统中
# btrfs filesystem show
Label: 'mybtrfs'  uuid: b8557848-3dde-41b7-8025-056e8e7d2938
    Total devices 3 FS bytes used 320.00KiB
    devid    1 size 2.00GiB used 480.00MiB path /dev/sdb
    devid    2 size 2.00GiB used 480.00MiB path /dev/sdc
    devid    3 size 2.00GiB used 480.00MiB path /dev/sdd
#PS:删除物理磁盘时,切记要检查原btrfs文件系统中文件总容量大小。确保
# (磁盘删除前磁盘空间总容量) - (磁盘删除后磁盘空间总容量) > (磁盘删除前磁盘文件总容量)

    3.6子卷创建管理&快照管理

btrfs子卷即可理解成linux文件系统"根"目录及下挂节点目录,可以把btrfs子卷与根的概念理解成独立的文件目录系统结构。

“根”节点即是btrfs磁盘系统最上层挂载点,下挂文件目录节点既可理解成是btrfs子卷。

子卷可以被单独挂载使用,但是如果上级目录或顶层节点被挂载使用后,其子卷自动被挂载。

btrfs快照功能实则是子卷管理的一种衍生应用,即对需快照文件夹创建一个具备映射功能的子卷

# btrfs subvolume create /mnt/test_sub    #创建子卷,该子卷可独立挂载在其他目录节点上
Create subvolume '/mnt/test_sub'

# ll /mnt/
total 0
drwxr-xr-x. 1 root root 0 Apr 15 14:58 test_sub

# btrfs subvolume delete /mnt/test_sub    #删除子卷
# ll /mnt/    #原文件系统文件列表
total 4
-rw-r--r--. 1 root root 501 Apr 15 15:06 fstab

# btrfs subvolume snapshot /mnt /mnt/snapshot_dir/    #创建/mnt文件夹的快照文件夹/mnt/snapshot_dir/
Create a snapshot of '/mnt' in '/mnt/snapshot_dir'    #可通过修改/mnt/fstab文件查看快照功能的实现

# btrfs subvolume delete snapshot_dir    #删除快照

    3.7btrfs & ext2fs 格式转换

# btrfs-convert /dev/sda3    #ext2 --> btrfs
# btrfs-convert -r /dev/sda3    #btrfs --> ext2


四:项目拓展

    编撰ing~~~

原创文章,作者:苏门答腊,如若转载,请注明出处:http://www.178linux.com/14770