Bcachefs 完全指南 / 第 5 章:高级特性
第 5 章:高级特性
基础已就绪,进阶特性大显身手
5.1 快照 (Snapshots)
5.1.1 快照原理
Bcachefs 的快照基于 CoW 机制,创建时只复制元数据,不复制实际数据:
创建快照前:
/data/file.txt → Block A (实际数据)
创建快照 /snap:
/data/file.txt → Block A (指向同一数据)
/snap/file.txt → Block A (共享同一数据)
修改 file.txt 后:
/data/file.txt → Block B (新数据,CoW)
/snap/file.txt → Block A (快照保留旧数据)
5.1.2 快照操作
# 创建快照
sudo bcachefs subvolume snapshot /mnt/data /mnt/snapshots/snap-$(date +%Y%m%d)
# 创建只读快照(推荐)
sudo bcachefs subvolume snapshot -r /mnt/data /mnt/snapshots/snap-readonly
# 列出所有快照
sudo bcachefs subvolume list /mnt/data
# 删除快照
sudo bcachefs subvolume delete /mnt/snapshots/snap-20250101
# 从快照恢复数据(直接复制文件)
cp /mnt/snapshots/snap-20250101/important.txt /mnt/data/
5.1.3 快照最佳实践
| 场景 | 策略 |
|---|---|
| 每日备份 | 每天创建只读快照,保留 7 天 |
| 开发测试 | 在修改前创建快照,测试后删除 |
| 数据库 | 刷新缓冲区后创建快照 |
5.2 压缩 (Compression)
5.2.1 创建压缩文件系统
# 使用 zstd 压缩(推荐)
sudo bcachefs format /dev/sdb --compression=zstd
# 使用 lz4 压缩(性能优先)
sudo bcachefs format /dev/sdb --compression=lz4
# 使用 gzip 压缩(压缩比优先)
sudo bcachefs format /dev/sdb --compression=gzip
# 设置压缩级别
sudo bcachefs format /dev/sdb --compression=zstd --compression_level=3
5.2.2 在线修改压缩
# 挂载时指定压缩
sudo mount -t bcachefs -o compress=zstd /dev/sdb /mnt/data
# 重新挂载修改压缩
sudo mount -o remount,compress=lz4 /mnt/data
# 关闭压缩
sudo mount -o remount,compress=none /mnt/data
5.2.3 压缩算法对比
| 算法 | 压缩比 | 压缩速度 | 解压速度 | CPU 开销 | 适用场景 |
|---|---|---|---|---|---|
| none | 1:1 | - | - | 无 | 已压缩数据 |
| lz4 | ~2.1:1 | 780 MB/s | 4000 MB/s | 极低 | 实时/性能优先 |
| zstd | ~3.1:1 | 515 MB/s | 1500 MB/s | 中等 | 通用(推荐) |
| gzip | ~3.0:1 | 38 MB/s | 400 MB/s | 较高 | 兼容性需求 |
5.2.4 查看压缩效果
# 查看文件系统使用情况
sudo bcachefs fs usage /mnt/data
# 查看压缩统计
sudo bcachefs fs usage --verbose /mnt/data
# 对比未压缩大小
sudo du -sh /mnt/data/data_dir
sudo du -sh --apparent-size /mnt/data/data_dir
5.2.5 压缩调优
# zstd 级别选择(1-19,默认 3)
# 级别 1-3: 速度优先
# 级别 3-7: 平衡(推荐)
# 级别 8-19: 压缩比优先(CPU 开销大)
# 测试不同级别的效果
for level in 1 3 6 9; do
echo "=== zstd level $level ==="
sudo bcachefs format /dev/sdb --compression=zstd --compression_level=$level
sudo mount -t bcachefs /dev/sdb /mnt/data
cp -r /test-data /mnt/data/
sudo bcachefs fs usage /mnt/data
sudo umount /mnt/data
done
5.3 加密 (Encryption)
5.3.1 加密概述
Bcachefs 支持文件系统级别的透明加密,基于 Linux 内核的 fscrypt 框架。
加密层次:
┌─────────────────────────────────────┐
│ 应用程序 │
├─────────────────────────────────────┤
│ Bcachefs (透明加密/解密) │
│ ┌───────────────────────────┐ │
│ │ 加密密钥 → 内核密钥环 │ │
│ │ 算法: AES-256-XTS │ │
│ └───────────────────────────┘ │
├─────────────────────────────────────┤
│ 块设备层 │
├─────────────────────────────────────┤
│ 存储设备 │
└─────────────────────────────────────┘
5.3.2 创建加密文件系统
# 交互式创建(提示输入密码)
sudo bcachefs format --encrypted /dev/sdb
# 使用密码文件
echo "my-secure-password" > /tmp/bcachefs-key
sudo bcachefs format --encrypted --keyfile=/tmp/bcachefs-key /dev/sdb
rm /tmp/bcachefs-key
# 使用硬件安全模块
sudo bcachefs format --encrypted --tpm /dev/sdb
5.3.3 挂载加密文件系统
# 交互式挂载(提示输入密码)
sudo mount -t bcachefs /dev/sdb /mnt/data
# 使用密码文件挂载
sudo mount -t bcachefs --keyfile=/path/to/keyfile /dev/sdb /mnt/data
# 使用内核密钥环(更安全)
# 首先添加密钥到内核密钥环
echo "my-secure-password" | keyctl padd user bcachefs-key "" @u
# 然后挂载
sudo mount -t bcachefs --keyloc=keyring /dev/sdb /mnt/data
5.3.4 加密注意事项
| 方面 | 说明 |
|---|---|
| 性能影响 | AES-NI 硬件加速下,开销约 5-10% |
| 密码丢失 | 无法恢复,务必妥善保管密钥 |
| 压缩兼容 | 加密后的数据无法压缩,先压缩后加密 |
| 多设备 | 所有设备使用同一密钥 |
| 密钥轮换 | 需要解密后重新加密 |
5.4 RAID 配置
5.4.1 Bcachefs RAID 概述
Bcachefs 支持灵活的冗余配置,不使用传统的 RAID 级别编号:
Bcachefs 冗余模型:
┌──────────────────────────────────────────┐
│ replicas=N → 数据存 N 个副本 │
│ metadata_replicas=N → 元数据存 N 个副本 │
│ ──────────────────────────────────────── │
│ erasure_coding → 类似 RAID 5/6 │
│ (开发中) │
└──────────────────────────────────────────┘
5.4.2 镜像配置 (RAID 1)
# 创建双副本文件系统
sudo bcachefs format \
/dev/sdb /dev/sdc \
--replicas=2
# 或创建后修改
sudo mount -t bcachefs /dev/sdb:/dev/sdc /mnt/data
# 查看副本状态
sudo bcachefs fs usage --verbose /mnt/data
5.4.3 三副本配置
# 创建三副本(需要 3 个设备)
sudo bcachefs format \
/dev/sdb /dev/sdc /dev/sdd \
--replicas=3
# 元数据使用更高副本数
sudo bcachefs format \
/dev/sdb /dev/sdc /dev/sdd \
--replicas=2 \
--metadata_replicas=3
5.4.4 RAID 状态监控
# 检查文件系统健康状态
sudo bcachefs fs usage /mnt/data
# 检查设备状态
sudo bcachefs device list /mnt/data
# 监控内核日志中的 RAID 相关信息
dmesg | grep -i "bcachefs\|raid\|degraded"
5.5 去重 (Deduplication)
5.5.1 去重原理
去重前:
File A → Block X (数据: "Hello World")
File B → Block Y (数据: "Hello World")
File C → Block Z (数据: "Hello World")
占用: 3 个块
去重后:
File A → Block X (数据: "Hello World")
File B → Block X (引用计数: 2)
File C → Block X (引用计数: 3)
占用: 1 个块
5.5.2 启用去重
# 创建时启用去重
sudo bcachefs format /dev/sdb --dedup
# 在线启用去重
sudo mount -t bcachefs -o dedup /dev/sdb /mnt/data
# 运行去重扫描
sudo bcachefs dedup /mnt/data
5.5.3 去重注意事项
| 方面 | 说明 |
|---|---|
| 内存开销 | 去重需要维护哈希表,消耗内存 |
| CPU 开销 | 哈希计算需要 CPU 资源 |
| 空间节省 | 取决于数据重复度 |
| 适用场景 | 虚拟机镜像、备份存储 |
| 不适用 | 视频、音频等已压缩数据 |
5.6 配额管理
5.6.1 配额类型
Bcachefs 配额类型:
┌────────────────────────────────────┐
│ 用户配额 (User Quota) │
│ - 按 UID 限制 │
│ - 适用于多用户系统 │
├────────────────────────────────────┤
│ 组配额 (Group Quota) │
│ - 按 GID 限制 │
│ - 适用于项目组 │
├────────────────────────────────────┤
│ 子卷配额 (Subvolume Quota) │
│ - 按子卷限制 │
│ - 适用于容器/VM │
└────────────────────────────────────┘
5.6.2 配额操作
# 启用配额
sudo bcachefs quota enable /mnt/data
# 设置用户配额
sudo bcachefs quota set /mnt/data --user=1000 --size=100G
# 设置组配额
sudo bcachefs quota set /mnt/data --group=developers --size=500G
# 查看配额
sudo bcachefs quota show /mnt/data
# 查看配额使用情况
sudo bcachefs quota usage /mnt/data
5.6.3 配额告警
# 设置软限制和硬限制
sudo bcachefs quota set /mnt/data \
--user=1000 \
--soft_limit=80G \
--hard_limit=100G
# 当达到软限制时,用户会收到警告
# 当达到硬限制时,写入操作会失败
5.7 标签管理
5.7.1 设备标签
# 创建时设置标签
sudo bcachefs format \
--label=fast.0 /dev/nvme0n1 \
--label=slow.0 /dev/sdb \
--label=slow.1 /dev/sdc
# 查看设备列表和标签
sudo bcachefs device list /mnt/data
5.7.2 数据放置策略
# 将元数据放在快速设备上
sudo bcachefs format \
--label=fast.0 /dev/nvme0n1 \
--label=slow.0 /dev/sdb \
--metadata_target=fast
# 将热数据放在 SSD
sudo bcachefs format \
--label=ssd.0 /dev/nvme0n1 \
--label=hdd.0 /dev/sdb \
--foreground_target=ssd \
--background_target=hdd \
--promote_target=ssd
5.8 文件属性
5.8.1 透明压缩设置
# 设置文件压缩
sudo bcachefs setattr /mnt/data/file.txt --compression=zstd
# 设置目录压缩
sudo bcachefs setattr /mnt/data/dir/ --compression=zstd
# 查看文件属性
sudo bcachefs getattr /mnt/data/file.txt
5.8.2 不可变标志
# 设置文件为不可变
sudo chattr +i /mnt/data/important.txt
# 清除不可变标志
sudo chattr -i /mnt/data/important.txt
# 查看文件标志
lsattr /mnt/data/important.txt
5.9 本章小结
| 特性 | 状态 | 推荐场景 |
|---|---|---|
| 快照 | ✅ 稳定 | 备份、测试、版本控制 |
| 压缩 | ✅ 稳定 | 节省空间(文本/代码) |
| 加密 | ✅ 可用 | 敏感数据保护 |
| RAID | ✅ 可用 | 数据冗余保护 |
| 去重 | 🟡 实验 | 虚拟机镜像、备份 |
| 配额 | ✅ 可用 | 多用户/多项目管理 |
扩展阅读
上一章: ← 第 4 章:基础操作 | 下一章: 第 6 章:多设备与分层存储 →