当前位置:首页>Linux>Linux Btrfs文件系统之raid

Linux Btrfs文件系统之raid

  • 2026-10-11 07:06:33
Linux Btrfs文件系统之raid

字数 1212,阅读大约需 7 分钟

Btrfs 在文件系统层实现 RAID(无需 mdadm)。本篇讲清 raid0/1/5/6/10 的选择、配置、scrub、和 write hole 的问题。

一、Btrfs RAID 概览

Btrfs 的 RAID 比传统硬件 RAID 和 mdadm 灵活:

类型
类似
至少盘数
冗余
状态
single
无
1
无
单盘
DUP
元数据 2 份
1
metadata 2 份
必有
raid0
RAID 0
2
无
性能
raid1
RAID 1
2
N-1 块
安全
raid5
RAID 5
2(推荐 3+)
1 块
⚠️ 仍争议
raid6
RAID 6
3(推荐 4+)
2 块
⚠️ 仍争议
raid10
RAID 10
4
N/2 块
性能+冗余

重要警告:Btrfs RAID5/6 历史上多次出现 write hole bug。Linux 5.5 起部分修复,但生产仍建议 RAID10。

二、创建 RAID

2.1 RAID0(条带化,无冗余)

$ mkfs.btrfs -d raid0 -m raid1 /dev/sdb /dev/sdc
#           ^^^^^^^^^  data 用 raid0

#                      ^^^^^^^ metadata 用 raid1
  • • 性能:读 ≈ 2×,写 ≈ 2×
  • • 风险:1 块坏全丢
  • • 适用:临时数据、临时计算

2.2 RAID1(镜像)

# 2 块盘 RAID1
$ mkfs.btrfs -d raid1 -m raid1 /dev/sdb /dev/sdc

# 3 块盘 RAID1(3 份镜像)

$ mkfs.btrfs -d raid1 -m raid1 /dev/sdb /dev/sdc /dev/sdd
  • • 性能:读 ≈ 2×(多源读),写 ≈ 1×(写多份)
  • • 冗余:N-1 块
  • • 适用:关键数据推荐

2.3 RAID5(推荐 3+ 盘)

$ mkfs.btrfs -d raid5 -m raid1 /dev/sdb /dev/sdc /dev/sdd
  • • 性能:读 ≈ (N-1)×,写 ≈ 1×(算校验)
  • • 冗余:1 块
  • • 容量:(N-1) × 单盘
  • • 风险:write hole 历史 bug(部分已修)

2.4 RAID6(推荐 4+ 盘)

$ mkfs.btrfs -d raid6 -m raid1 /dev/sdb /dev/sdc /dev/sdd /dev/sde
  • • 性能:读 ≈ (N-2)×,写 ≈ 1×(算校验)
  • • 冗余:2 块
  • • 容量:(N-2) × 单盘
  • • 适用:大硬盘推荐

2.5 RAID10(条带+镜像)

# 4 块盘:2 个 mirror,再 stripe
$ mkfs.btrfs -d raid10 -m raid10 /dev/sdb /dev/sdc /dev/sdd /dev/sde
  • • 性能:读 ≈ 2×,写 ≈ 2×
  • • 冗余:每组可丢一半
  • • 容量:N/2 × 单盘
  • • 适用:生产数据库推荐

三、修改 RAID 级别(balance)

3.1 用 balance 转换

# 把数据从 single 转为 raid1
$ btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt
转换
命令参数
data
-dconvert=raid1
metadata
-mconvert=raid1
system
-sconvert=raid1

3.2 实战:单盘转 RAID1

# 1. 加盘
$ btrfs device add /dev/sdc /mnt

# 2. balance 转 RAID1

$ btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt

# 3. 看进度

$ btrfs balance status /mnt

四、scrub(校验和修复)

# 启动 scrub
$ btrfs scrub start /mnt

# 状态

$ btrfs scrub status /mnt

scrub 在 RAID1/5/6 中自动用副本修复不一致的 extent。

五、Write Hole:核心争议

5.1 什么是 write hole?

传统 RAID5(mdadm):
  写数据:① 写数据 ② 写校验
  断电时可能 ① 完成 ② 没完成
  → 校验和数据不一致(write hole)
  → 必须 mdadm --assemble --force 修复
  → 数据可能丢

Btrfs RAID5/6:
  COW + transaction 模型理论上能避免
  但实际实现有过 bug(Linux 5.5 之前的 early hole)
  → 部分场景下数据可能仍丢

5.2 Btrfs RAID5/6 修复时间线

内核版本
状态
Linux 4.x
❌ 严重 bug(实际数据损坏)
Linux 5.5+
⚠️ 修复部分 bug
Linux 5.10+
✅ 较好,但仍建议 RAID10
Linux 6.x
✅ 较成熟

5.3 现状

2024 年现状:Btrfs RAID5/6 仍在改进中,生产关键数据用 RAID10。

六、RAID 选型决策树

你的场景是什么?
│
├── 临时数据 / 高性能
│   └── raid0(必须接受盘坏数据全丢)
│
├── 关键数据 / 性能 + 冗余
│   └── raid10(4 盘起步)
│
├── 大量存储 / 容量利用率高
│   ├── 大盘(>4TB)→ raid6
│   ├── 中盘(1~4TB)→ raid5(5.10+ 内核)
│   └── 商业环境 → raid10(保守)
│
└── 单盘
    └── DUP metadata(默认)+ 重要数据定期备份

七、实战配置

案例 1:家用 4 盘 NAS

# 4 块 4TB HDD
# 推荐 raid5(家用性价比高)或 raid6(更安全)


# raid5

$ mkfs.btrfs -d raid5 -m raid1 -L nasdata /dev/sdb /dev/sdc /dev/sdd
# 容量:3 × 4TB = 12TB(损 1 块冗余)


# raid6(更保守)

$ mkfs.btrfs -d raid6 -m raid1 -L nasdata /dev/sdb /dev/sdc /dev/sdd /dev/sde
# 容量:4 × 4TB = 16TB(但盘数要到 4)

案例 2:性能优先(数据库)

# 4 块 SSD
$ mkfs.btrfs -d raid10 -m raid10 -L dbdata /dev/sdb /dev/sdc /dev/sdd /dev/sde
# 容量:2 × 单盘

# 性能:4 块盘的读 + 2 块盘的写

案例 3:混合(SSD cache + HDD)

# HDD 主数据
# SSD 做缓存


# 先建 pool

$ mkfs.btrfs -d raid1 -m raid1 -L tank /dev/sdb /dev/sdc

# 加 SSD 做 cache(btrfs 自身不直接做 cache,但可以放热数据)

# 用 bcache / lvmcache / dm-cache 在更底层

八、RAID 内 spare

Btrfs 暂时不支持 hot spare(与 mdadm 不同)。需要手动替换。

替代方案:

  • • 监控 SMART
  • • 故障盘出现时手动 btrfs replace

九、本篇小结

场景
RAID 选择
理由
家用 4 盘
raid5 或 raid6
容量利用率高
数据库
raid10
性能 + 安全
关键数据
raid1
最稳
临时数据
raid0
性能
单盘
metadata DUP
默认已开

重要警告:

  • • 生产关键数据用 raid10
  • • raid5/6 在 Linux 5.10+ 内核才稳定
  • • 任何 RAID 都不替代备份!

最新文章

随机文章