Btrfs 基础介绍:核心特性与工作机制
Btrfs(全称为 B-tree File System,也被称作 Butter FS 或 Better FS)是 Oracle 自 2007 年起开发的一款文件系统,采用 GPL 许可证发布。其最突出的亮点是写时复制(Copy-on-Write,简称 CoW)机制,设计初衷是替代 ext2、ext3 及 ext4。那么,Btrfs 究竟有何独特之处?下面我们来详细解析其主要功能。
写时复制(CoW):举例来说,当你需要修改文件 A 时,系统并不会直接改动原文件,而是先复制一份生成文件 B,随后所有修改操作都在 B 上执行。这相当于自动创建了一个快照,即使误改,原文件 A 依然完好无损,可以轻松恢复。
多物理卷支持:Btrfs 能够将多块底层硬盘整合为一个文件系统,内置 RAID 功能(支持条带、镜像等),并且支持在线执行“添加”“移除”“修改”等操作,灵活性极高。
B-tree 子卷:类似于 LVM 中在卷组内创建逻辑卷,Btrfs 允许在一个卷上创建多个子卷,每个子卷可以独立挂载和使用,便于资源隔离。
数据校验码(checksum):写入文件时,系统会分别保存源数据及其校验码(通过扩展属性)。读取时自动校验,一旦发现数据损坏,系统还能尝试自动修复——这一特性在大规模存储场景中非常实用。
快照与增量快照:支持对快照再次创建快照,便于实现增量备份,节省存储空间。
透明压缩:数据在写入时自动压缩,读取时自动解压,旨在节省磁盘空间。当然,这会增加 CPU 开销,适合对存储空间敏感但对性能要求不太苛刻的场景。
Btrfs 文件系统的创建与常用命令
创建 Btrfs 文件系统主要使用 mkfs.btrfs 命令,其参数含义清晰直观:
mkfs.btrfs
-L 'LABEL' # 设定卷标
-d # 数据存储类型选项:raid0, raid1, raid5, raid6, raid10, single
-m # 元数据存储机制:同上,另多一个 dup
-O # 格式化时启用特定特性,使用 -O list-all 可查看所有可用特性
挂载时执行 mount -t btrfs /dev/sdb MOUNT_POINT,如需启用透明压缩,可附加 -o compress={lzo|zlib} 参数。
其他常用管理命令:
- 调整文件系统大小:
btrfs filesystem resize ±VALUE MOUNT_POINT - 管理磁盘设备:
btrfs devices [subcommand] args - 均衡数据分布:
btrfs balance [subcommand] args - 创建子卷:
btrfs subvolume [subcommand] [args] - 创建快照:
btrfs snapshot(注意:快照必须与原卷处于同一卷组,子卷的快照必须处于相同父卷下) - 删除快照:
btrfs subvolume delete snapshot-name
更多子命令详情可参考 man btrfs-filesystem。
Btrfs 实际应用示例:创建、扩容与快照操作
下面通过一个完整流程演示如何管理 Btrfs 文件系统:
# 查看当前磁盘分区情况
fdisk -l
# 将 /dev/sdb 和 /dev/sdc 共同创建为一个 Btrfs 文件系统,卷标设置为 "mybtrfs"
mkfs.btrfs -L "mybtrfs" /dev/sdb /dev/sdc
# 查看已创建的 Btrfs 文件系统信息
btrfs filesystem show
# 查看设备的 UUID(你会发现 sdb 和 sdc 的 UUID 相同,说明它们属于同一卷)
blkid /dev/sdb
# 创建挂载点并挂载(挂载任意一个设备即可,例如 /dev/sdb)
mkdir /mybtrfs
mount -t btrfs /dev/sdb /mybtrfs
# 卸载后,重新以透明压缩方式挂载(使用 lzo 算法)
umount /dev/sdb
mount -o compress=lzo /dev/sdb /mybtrfs
# 调整文件系统容量(缩减 10GB)
btrfs filesystem resize -10G /mybtrfs
# 添加新硬盘 /dev/sdd,系统将自动扩展逻辑边界
btrfs devices add /dev/sdd /mybtrfs
# 修改元数据的 RAID 级别(例如改为 raid1)
btrfs balance start -mconvert=raid1 /mybtrfs
# 查看数据均衡的当前状态
btrfs balance status /mybtrfs
# 移除设备 /dev/sda(系统会自动迁移数据)
btrfs device delete /dev/sda /mybtrfs
# 创建子卷
btrfs subvolume create /mybtrfs
btrfs subvolume create /mybtrfs/logs
# 卸载父卷后,可直接单独挂载子卷
umount /mybtrfs
mount /dev/sdb /mybtrfs
# 列出所有子卷
btrfs subvolume list /mybtrfs
以上操作涵盖了 Btrfs 日常管理的常见场景:创建、扩容、缩容、RAID 调整、子卷快照等。需要特别留意的是,btrfs balance 是调整底层数据布局的有力工具,但操作耗时较长,尤其在大容量磁盘上,务必预留充足的执行时间。
