btrfs 的特性
首先是扩展性 (scalability) 相关的特性。btrfs 最重要的设计目标是应对大型机器对文件系统的扩展性要求。 Extent,B-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 。对于这类 chunk,btrfs 将 chunk 分成两个条带,写 metadata 的时候,会同时写入两个条带内,从而实现对 metadata 的保护。
btrfs支持压缩
比如一个文件不经过压缩的情况下需要 100 次磁盘 IO 。但花费少量 CPU 时间进行压缩后,只需要 10 次磁盘 IO 就可以将压缩后的文件写入磁盘。在这种情况下,IO 效率反而提高了。当然,这取决于压缩率。目前 btrfs 采用 zlib 提供的 DEFALTE/INFLATE 算法进行压缩和解压。在将来,btrfs 应该可以支持更多的压缩算法,满足不同用户的不同需求。
具体的操作命令:
创建及挂载
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"
查看使用率:(data、medata、system等等)
格式: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