强曰为道

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

第 5 章:RAID 多设备管理

第 5 章:RAID 多设备管理

5.1 Btrfs RAID 概述

5.1.1 Btrfs RAID vs 传统 RAID

Btrfs 在文件系统层面实现 RAID,与传统的硬件 RAID 或 mdadm 软件 RAID 有本质区别:

维度Btrfs RAID硬件 RAIDmdadm 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镜像镜像21 盘✅ 稳定
RAID 1c33 副本3 副本32 盘✅ 稳定 (6.2+)
RAID 1c44 副本4 副本43 盘✅ 稳定 (6.2+)
RAID 10条带+镜像条带+镜像4每组 1 盘✅ 稳定
RAID 5条带+奇偶校验条带+奇偶校验21 盘⚠️ 实验性
RAID 6条带+双奇偶校验条带+双奇偶校验32 盘⚠️ 实验性

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 replacedelete + 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 12简单可靠
中型存储RAID 104+性能 + 冗余
关键数据RAID 1c33+3 副本保护
不推荐RAID 5/6write 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 1mkfs.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
转换 RAIDbtrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt
降级挂载mount -o degraded /dev/sdb /mnt
设备统计btrfs device stats /mnt

关键要点

  1. 生产环境推荐 RAID 1、RAID 10 或 RAID 1c3/1c4
  2. 不要使用 RAID 5/6(write hole 问题)
  3. 元数据 RAID 级别应等于或高于数据 RAID 级别
  4. 设备替换优先使用 btrfs replace 而非 delete+add
  5. 定期监控 btrfs device stats

扩展阅读