btrfs文件系统介绍

btrfs 的特性

首先是扩展性 (scalability) 相关的特性。btrfs 最重要的设计目标是应对大型机器对文件系统的扩展性要求。 ExtentB-Tree 和动态 inode 创建等特性保证了 btrfs 在大型机器上仍有卓越的表现,其整体性能而不会随着系统容量的增加而降低。

 

其次是数据一致性 (data integrity) 相关的特性。系统面临不可预料的硬件故障,Btrfs 采用 COW 事务技术来保证文件系统的一致性。 btrfs 还支持 checksum,避免了 silent corrupt 的出现。而传统文件系统则无法做到这一点。

 

第三是和多设备管理相关的特性。 Btrfs 支持创建快照 (snapshot),和克隆 (clone) btrfs 还能够方便的管理多个物理设备,使得传统的卷管理软件变得多余。

 

最后是其他难以归类的特性。这些特性都是比较先进的技术,能够显著提高文件系统的时间 / 空间性能,包括延迟分配,小文件的存储优化,目录索引等。

 

 

COW机制:

即每次写磁盘数据时,先将更新数据写入一个新的 block,当新数据写入成功之后,再更新相关的数据结构指向新 block

 

 

Subvolume

Subvolume 是很优雅的一个概念。即把文件系统的一部分配置为一个完整的子文件系统,称之为 subvolume

 

采用 subvolume,一个大的文件系统可以被划分为多个子文件系统,这些子文件系统共享底层的设备空间,在需要磁盘空间时便从底层设备中分配,类似应用程序调用 malloc() 分配内存一样。可以称之为存储池。这种模型有很多优点,比如可以充分利用 disk 的带宽,可以简化磁盘空间的管理等。

 

所谓充分利用 disk 的带宽,指文件系统可以并行读写底层的多个 disk,这是因为每个文件系统都可以访问所有的 disk 。传统的文件系统不能共享底层的 disk 设备,无论是物理的还是逻辑的,因此无法做到并行读写。

 

所谓简化管理,是相对于 LVM 等卷管理软件而言。采用存储池模型,每个文件系统的大小都可以自动调节。而使用 LVM,如果一个文件系统的空间不够了,该文件系统并不能自动使用其他磁盘设备上的空闲空间,而必须使用 LVM 的管理命令手动调节。

 

Subvolume 可以作为根目录挂载到任意 mount 点。 subvolume 是非常有趣的一个特性,有很多应用。

假如管理员只希望某些用户访问文件系统的一部分,比如希望用户只能访问 /var/test/ 下面的所有内容,而不能访问 /var/ 下面其他的内容。那么便可以将 /var/test 做成一个 subvolume /var/test 这个 subvolume 便是一个完整的文件系统,可以用 mount 命令挂载。比如挂载到 /test 目录下,给用户访问 /test 的权限,那么用户便只能访问 /var/test 下面的内容了。

 

 

快照和克隆:

快照是对文件系统某一时刻的完全备份。建立快照之后,对文件系统的修改不会影响快照中的内容。这是非常有用的一种技术。

 

比如数据库备份。假如在时间点 T1,管理员决定对数据库进行备份,那么他必须先停止数据库。备份文件是非常耗时的操作,假如在备份过程中某个应用程序修改了数据库的内容,那么将无法得到一个一致性的备份。因此在备份过程中数据库服务必须停止,对于某些关键应用这是不能允许的。

 

利用快照,管理员可以在时间点 T1 将数据库停止,对系统建立一个快照。这个过程一般只需要几秒钟,然后就可以立即重新恢复数据库服务。此后在任何时候,管理员都可以对快照的内容进行备份操作,而此时用户对数据库的修改不会影响快照中的内容。当备份完成,管理员便可以删除快照,释放磁盘空间。

 

快照一般是只读的,当系统支持可写快照,那么这种可写快照便被称为克隆。克隆技术也有很多应用。比如在一个系统中安装好基本的软件,然后为不同的用户做不同的克隆,每个用户使用自己的克隆而不会影响其他用户的磁盘空间。非常类似于虚拟机。

 

Btrfs 支持 snapshot clone 。这个特性极大地增加了btrfs 的使用范围,用户不需要购买和安装昂贵并且使用复杂的卷管理软件。

 

btrfs 缺省情况下对 metadata 进行 RAID1 保护

前面已经提及 btrfs 将设备空间划分为 chunk,一些 chunk 被配置为 metadata,即只存储 metadata 。对于这类 chunkbtrfs chunk 分成两个条带,写 metadata 的时候,会同时写入两个条带内,从而实现对 metadata 的保护。

 

 

 

btrfs支持压缩

比如一个文件不经过压缩的情况下需要 100 次磁盘 IO 。但花费少量 CPU 时间进行压缩后,只需要 10 次磁盘 IO 就可以将压缩后的文件写入磁盘。在这种情况下,IO 效率反而提高了。当然,这取决于压缩率。目前 btrfs 采用 zlib 提供的 DEFALTE/INFLATE 算法进行压缩和解压。在将来,btrfs 应该可以支持更多的压缩算法,满足不同用户的不同需求。

 

 

 

具体的操作命令:

 

  1. 创建及挂载

fdisk /dev/sdb           # fdisk命令添加个新的分区

mkfs.btrfs /dev/sdb1 -L "test"

         -LLabel   #设置卷标

         -d<type>: raid0, raid1, raid5, raid6, raid10, single

         -m<profile>: raid0, raid1, raid5, raid6, raid10, single, dup

         -O<feature>

                   -Olist-all: 列出支持的所有feature

挂载文件系统:

         mkdir/btrfsdisk

         格式:mount -t btrfs /dev/sdb MOUNT_POINT

         mount-t btrfs /dev/sdb1 /btrfsdisk/

透明压缩机制:

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

         mount-o compress=zlib /dev/sdb1 /btrfsdisk

 

补充:

# 使用命令将ext4分区转换为btrfs文件系统,使用这种方法还可以将系统回滚到ext格式,且分区中的数据保持原样。

ext类型转为btrfs文件系统: btrfs-convert /dev/sd*

如果需要回滚到ext,只要执行btrfs-convert -r /dev/sd*

btrfs常用的几个子命令如下:

子命令功能

filesystem                管理一个btrfs文件系统,包括标签设置/同步等等

[filesystem]balance  Balance btrfs filesystem chunks across singleor several devices.

device                       Manage devices managed by btrfs, includingadd/delete/scan and so on.

subvolume                Create/delete/list/manage btrfs subvolume.


filesystem

属性查看:

         格式:btrfsfilesystem show[--mounted|--all-devices|<path>|<uuid>|<device>|<label>]

         btrfsfilesystem show

         btrfsfilesystem show -d           # 显示详细情况

修改卷标:

         格式:btrfsfilesystem label[<dev>|<mount_point>] [newlabel]

         btrfsfilesystem label /btrfsdisk "BTRFS"

查看使用率:(datamedatasystem等等)

         格式:df<path> [<path>...]

         btrfsfilesystem df /btrfsdisk/

在线磁盘整理:

         格式:btrfs filesystemdefragment [options] <file>|<dir> [<file>|<dir>...]

         btrfsfilesystem defragment /btrfsdisk/sub1

调整大小resize

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

                  # 可以使用btrfs filesystemshow 命令查看到uuid

balance

在设备之间平衡数据块:

         格式: [filesystem] balance start [options] <path>

         btrfsfilesystem balance start -v /btrfsdisk/

         Options:

                   -d[filters]

                            acton data chunks

                   -m[filters]

                            acton metadata chunks

                   -s[filters]

                            acton system chunks (only under -f)

                   -v   be verbose

                   -f   force reducing of metadata integrity

查看数据块平衡的状态信息:

         格式:btrfs [filesystem] balance status [-v] <path>

         btrfsfilesystem balance status /btrfsdisk/

 

device

添加设备到btrfs文件系统:

         格式:btrfs device add [-Kf] <dev> [<dev>...] <path>

         btrfsdevice add -f /dev/sdb2 /btrfsdisk/

删除设备从指定的btrfs文件系统:

         格式:btrfs device delete <dev> [<dev>...] <path>

         btrfsdevice del /dev/sdb2 /dev/sdb3 /btrfsdisk/

扫描btrfs文件系统:

         格式:btfrs device scan [device]

         btrfsdevice scan /dev/sdb1

 

subvolume

创建子卷:

         格式:btrfs subvolume create <dest/name>

         btrfssubvolume create /btrfsdisk/SB2

删除子卷:

         格式:btrfssubvolume delete <dest/name>

         btrfssubvolume delete /btrfsdisk/SB3

列出有哪些子卷:

         格式:btrfssubvolume list <path>

         btrfssubvolume list /btrfsdisk

显示子卷详情:

         格式:btrfssubvolume show <path>

         btrfssubvolume show /btrfsdisk/SB1

 

snapshot

创建快照

         例:btrfssubvolume snapshot -r /btrfsdisk/sub2 /btrfsdisk/sub1/snap2


你可能感兴趣的:(btrfs)