强曰为道

与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

第 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 开销适用场景
none1:1--已压缩数据
lz4~2.1:1780 MB/s4000 MB/s极低实时/性能优先
zstd~3.1:1515 MB/s1500 MB/s中等通用(推荐)
gzip~3.0:138 MB/s400 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 章:多设备与分层存储 →