Btrfs 文件系统运维完全教程 / 第 5 章:RAID 多设备管理
第 5 章:RAID 多设备管理
5.1 Btrfs RAID 概述
5.1.1 Btrfs RAID vs 传统 RAID
Btrfs 在文件系统层面实现 RAID,与传统的硬件 RAID 或 mdadm 软件 RAID 有本质区别:
| 维度 | Btrfs RAID | 硬件 RAID | mdadm RAID |
|---|---|---|---|
| 实现层 | 文件系统 | RAID 控制器 | 内核块层 |
| 数据校验 | ✅ 原生 | 部分支持 | ❌ |
| 降级运行 | ✅ 自动检测 | ✅ | ✅ |
| 热添加 | ✅ 在线 | 有限 | ✅ |
| 在线转换 | ✅ balance | 不支持 | 有限 |
| 磁盘大小 | 不要求相同 | 通常要求相同 | 不要求相同 |
| 碎片管理 | 需要注意 | 透明 | 透明 |
| 性能预测 | 中等 | 好 | 好 |
5.1.2 Btrfs RAID 重要警告
⚠️ RAID 5/6 警告: Btrfs 的 RAID 5/6 实现目前仍存在 write hole 问题,不建议在生产环境中使用。推荐使用 RAID 1、RAID 10 或 RAID 1c3/1c4。
Write hole 问题:在 RAID 5/6 中,如果在写入数据和校验块之间发生断电,可能导致数据和校验块不一致,从而在后续重建时产生数据损坏。
5.1.3 支持的 RAID 级别
| RAID 级别 | 数据冗余 | 元数据冗余 | 最少设备 | 容错 | 成熟度 |
|---|---|---|---|---|---|
| single | 无 | 无(或 DUP) | 1 | 无 | ✅ 稳定 |
| DUP | 同设备 2 份 | 同设备 2 份 | 1 | 设备内 | ✅ 稳定 |
| RAID 0 | 条带化 | 条带化 | 1 | 无 | ✅ 稳定 |
| RAID 1 | 镜像 | 镜像 | 2 | 1 盘 | ✅ 稳定 |
| RAID 1c3 | 3 副本 | 3 副本 | 3 | 2 盘 | ✅ 稳定 (6.2+) |
| RAID 1c4 | 4 副本 | 4 副本 | 4 | 3 盘 | ✅ 稳定 (6.2+) |
| RAID 10 | 条带+镜像 | 条带+镜像 | 4 | 每组 1 盘 | ✅ 稳定 |
| RAID 5 | 条带+奇偶校验 | 条带+奇偶校验 | 2 | 1 盘 | ⚠️ 实验性 |
| RAID 6 | 条带+双奇偶校验 | 条带+双奇偶校验 | 3 | 2 盘 | ⚠️ 实验性 |
5.2 创建 RAID 文件系统
5.2.1 RAID 1(镜像)
# 创建 RAID 1 文件系统
sudo mkfs.btrfs -d raid1 -m raid1 -L "mirror-pool" /dev/sdb /dev/sdc
# 查看 RAID 信息
sudo btrfs filesystem show /dev/sdb
# Label: 'mirror-pool' uuid: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# Total devices 2 FS bytes used 128.00KiB
# devid 1 size 100.00GiB used 2.02GiB path /dev/sdb
# devid 2 size 100.00GiB used 2.02GiB path /dev/sdc
RAID 1 空间使用:
可用空间 = min(设备1大小, 设备2大小) / 2
示例:min(100GB, 100GB) / 2 = 50GB 可用
# 查看实际空间
sudo btrfs filesystem usage /mnt
# Data,single: total=1.00GiB, used=128.00KiB
# Metadata,DUP: total=512.00MiB, used=112.00KiB
# System,DUP: total=8.00MiB, used=16.00KiB
5.2.2 RAID 10
# RAID 10(至少需要 4 个设备)
sudo mkfs.btrfs -d raid10 -m raid10 -L "raid10-pool" /dev/sd{b,c,d,e}
# RAID 10 空间 = 所有设备总大小 / 2
# 4 × 100GB = 200GB 可用
5.2.3 RAID 1c3 / RAID 1c4
# RAID 1c3(3 副本,需要 3+ 设备,内核 6.2+)
sudo mkfs.btrfs -d raid1c3 -m raid1c3 -L "triple-mirror" /dev/sd{b,c,d}
# RAID 1c4(4 副本,需要 4+ 设备)
sudo mkfs.btrfs -d raid1c4 -m raid1c4 -L "quad-mirror" /dev/sd{b,c,d,e}
5.2.4 混合配置
数据和元数据可以使用不同的 RAID 级别:
# 元数据使用更安全的 RAID 1c3,数据使用 RAID 1
sudo mkfs.btrfs -d raid1 -m raid1c3 -L "mixed-raid" /dev/sd{b,c,d}
# 元数据 RAID 1,数据 single(节省空间,无冗余)
sudo mkfs.btrfs -d single -m raid1 -L "meta-mirror" /dev/sdb /dev/sdc
5.2.5 不同大小的设备
Btrfs RAID 允许使用不同大小的设备:
# 3 个不同大小的设备
sudo mkfs.btrfs -d raid1 -m raid1 -L "mixed-sizes" /dev/sdb /dev/sdc /dev/sdd
# /dev/sdb = 500GB, /dev/sdc = 1TB, /dev/sdd = 2TB
# Btrfs 会智能分配,但空间利用率取决于最小设备
# RAID 1 可用空间 ≈ min(500GB, 1TB, 2TB) = 500GB... 不完全如此
# Btrfs 在 3 设备 RAID 1 中实际上可以利用更多空间
5.3 设备管理
5.3.1 添加设备
# 添加新设备到文件系统
sudo btrfs device add /dev/sdd /mnt/data
# 添加并同时进行平衡(推荐)
sudo btrfs device add /dev/sdd /mnt/data
sudo btrfs balance start /mnt/data
5.3.2 删除设备
# 删除设备(数据会被迁移到其他设备)
sudo btrfs device delete /dev/sdc /mnt/data
# 删除需要有足够的空间容纳迁移的数据
5.3.3 查看设备信息
# 查看所有设备
sudo btrfs filesystem show /mnt/data
# 查看设备详细信息
sudo btrfs device stats /mnt/data
# 查看设备使用情况
sudo btrfs device usage /mnt/data
5.4 RAID 级别转换
5.4.1 在线 RAID 转换
# 从 single 转换到 RAID 1
sudo btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt/data
# 从 RAID 1 转换到 RAID 10(需要 4+ 设备)
sudo btrfs balance start -dconvert=raid10 -mconvert=raid10 /mnt/data
# 只转换元数据到 RAID 1c3
sudo btrfs balance start -mconvert=raid1c3 /mnt/data
5.4.2 RAID 转换示例
# 场景:单设备扩展到 RAID 1
# 1. 当前状态
sudo btrfs filesystem show /mnt/data
# Total devices 1
# 2. 添加第二个设备
sudo btrfs device add /dev/sdc /mnt/data
# 3. 转换为 RAID 1
sudo btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt/data
# 4. 验证
sudo btrfs filesystem show /mnt/data
# Total devices 2
5.5 降级运行与设备修复
5.5.1 降级运行
当 RAID 1 中的一个设备故障时,文件系统进入降级模式:
# 设备故障后的状态
sudo btrfs filesystem show /mnt/data
# Total devices 2 FS bytes used 10.00GiB
# devid 1 size 100.00GiB used 12.00GiB path /dev/sdb
# devid 2 size 0.00B used 0.00B path /dev/sdc ← 设备丢失
# 文件系统仍可读写,但无冗余保护
# 查看设备错误统计
sudo btrfs device stats /mnt/data
# [/dev/sdc].read_io_errs 100
# [/dev/sdc].write_io_errs 50
5.5.2 降级挂载
# 正常挂载降级的文件系统
sudo mount -o degraded /dev/sdb /mnt/data
# 如果有多个设备丢失(RAID 1 只能容忍 1 个设备丢失)
# 可能需要使用 rescue 选项
sudo mount -o rescue=usebackuproot /dev/sdb /mnt/data
5.3.3 替换故障设备
# 方法 1:替换设备(推荐)
sudo btrfs replace start /dev/sdc /dev/sdd /mnt/data
# 查看替换进度
sudo btrfs replace status /mnt/data
# 等待替换完成
sudo btrfs replace status /mnt/data
# 100.0% done
# 方法 2:删除旧设备,添加新设备
sudo btrfs device delete missing /mnt/data
sudo btrfs device add /dev/sdd /mnt/data
sudo btrfs balance start /mnt/data
💡 提示:
btrfs replace比delete + add更高效,因为它直接在设备间复制数据,不需要重新平衡整个文件系统。
5.5.4 missing 关键字
# 使用 "missing" 关键字引用丢失的设备
sudo btrfs device delete missing /mnt/data
# 添加 "missing" 设备占位(用于替换)
sudo btrfs replace start /dev/sdc /dev/sdd /mnt/data
5.6 RAID 重建
5.6.1 自动重建
Btrfs 会在检测到设备故障时自动开始重建(如果配置了冗余):
# 内核日志中的设备故障信息
dmesg | grep btrfs
# [12345.678] BTRFS warning (device sdb): csum failed root 257 ino 100 off 0 csum 0x12345678 expected 0x87654321 mirror 2
# [12345.679] BTRFS error (device sdb): bdev /dev/sdc errs: wr 1, rd 0, flush 1, corrupt 0, gen 0
5.6.2 手动修复
# 检查文件系统
sudo btrfs scrub start /mnt/data
# 查看 scrub 结果
sudo btrfs scrub status /mnt/data
# 如果 scrub 无法修复(单设备模式下),可能需要备份恢复
5.7 RAID 5/6 特别说明
5.7.1 RAID 5/6 的问题
| 问题 | 说明 |
|---|---|
| Write hole | 断电时数据和校验不一致 |
| 性能 | 随机写性能差 |
| 重建时间 | 大容量设备重建时间长 |
| 不推荐 | 社区和文档均不推荐生产使用 |
5.7.2 如果必须使用 RAID 5/6
# 启用 RAID 5/6 的相关选项
# 内核 5.19+ 有更好的处理
# 确保使用最新内核
uname -r
# 创建 RAID 5(仅测试环境)
sudo mkfs.btrfs -d raid5 -m raid1 -L "raid5-test" /dev/sd{b,c,d}
# 元数据使用 RAID 1(更安全),数据使用 RAID 5
# 避免使用 RAID 5 存储元数据
sudo mkfs.btrfs -d raid5 -m raid1 -L "raid5-safer" /dev/sd{b,c,d}
5.7.3 RAID 5/6 的替代方案
| 需求 | 推荐方案 |
|---|---|
| 高可用(2 盘容错) | RAID 1c3 |
| 高性能 + 冗余 | RAID 10 |
| 最大容量利用 | 单设备 + 频繁备份 |
| 3 盘冗余 | RAID 1c4 |
5.8 平衡操作(简要)
平衡操作在第 9 章详细讲解,这里先了解与 RAID 相关的用法:
# 查看当前块组分配
sudo btrfs filesystem df /mnt/data
# 执行全平衡(可能很慢)
sudo btrfs balance start /mnt/data
# 只平衡使用率低于 10% 的块组
sudo btrfs balance start -dusage=10 /mnt/data
# 转换 RAID 级别
sudo btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt/data
# 查看平衡进度
sudo btrfs balance status /mnt/data
# 取消平衡
sudo btrfs balance cancel /mnt/data
5.9 最佳实践
RAID 选择指南
| 场景 | 推荐 RAID | 设备数 | 说明 |
|---|---|---|---|
| 桌面/笔记本 | single + 备份 | 1 | 靠备份保护 |
| 小型服务器 | RAID 1 | 2 | 简单可靠 |
| 中型存储 | RAID 10 | 4+ | 性能 + 冗余 |
| 关键数据 | RAID 1c3 | 3+ | 3 副本保护 |
| 不推荐 | RAID 5/6 | — | write hole 问题 |
监控建议
# 定期检查设备统计
sudo btrfs device stats /mnt/data
# 脚本化检查
#!/bin/bash
ERRORS=$(sudo btrfs device stats /mnt/data | grep -v " 0$" | grep -v "^[/")
if [[ -n "$ERRORS" ]]; then
echo "ALERT: Device errors detected!"
echo "$ERRORS"
# 发送告警...
fi
5.10 本章小结
| 操作 | 命令 |
|---|---|
| 创建 RAID 1 | mkfs.btrfs -d raid1 -m raid1 /dev/sd{b,c} |
| 添加设备 | btrfs device add /dev/sdd /mnt |
| 删除设备 | btrfs device delete /dev/sdc /mnt |
| 替换设备 | btrfs replace start /dev/old /dev/new /mnt |
| 转换 RAID | btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt |
| 降级挂载 | mount -o degraded /dev/sdb /mnt |
| 设备统计 | btrfs device stats /mnt |
关键要点:
- 生产环境推荐 RAID 1、RAID 10 或 RAID 1c3/1c4
- 不要使用 RAID 5/6(write hole 问题)
- 元数据 RAID 级别应等于或高于数据 RAID 级别
- 设备替换优先使用
btrfs replace而非 delete+add - 定期监控
btrfs device stats