在 Ubuntu 上构建 RAID0 + bcache + Btrfs 高性能存储阵列
场景背景
在企业级应用或家庭实验室(HomeLab)中,我们常常面临一个矛盾的需求:既需要 TB 级别的海量存储空间,又希望获得接近固态硬盘的 I/O 响应速度。全闪存阵列成本高昂,而纯机械硬盘阵列在随机读写时又显得力不从心。
本方案通过组合三种技术来解决这一痛点:
- RAID0:将两块 3.6T 机械硬盘条带化,提供约 7.3T 的可用容量和翻倍的顺序读写带宽。
- bcache:利用一块 111.8G 的 SSD 作为高速缓存层,透明地加速底层机械阵列的读写性能。
- Btrfs:采用现代文件系统,提供透明的数据压缩、空间缓存优化等高级特性。
硬件环境
在开始配置前,请确认服务器的磁盘拓扑。本教程基于以下 lsblk 输出环境:
sda 8:0 1 0B 0 disk
sdb 8:16 0 223.6G 0 disk
├─sdb1 8:17 0 1.9G 0 part /boot/efi
└─sdb2 8:18 0 221.7G 0 part /
sdc 8:32 0 111.8G 0 disk # SSD,用作 bcache 缓存
sdd 8:48 0 3.6T 0 disk # 机械硬盘1
sde 8:64 0 3.6T 0 disk # 机械硬盘2
前置警告:本方案采用 RAID0 级别,没有任何数据冗余。阵列中任意一块机械硬盘发生物理故障,将导致 全部数据永久丢失。此方案仅适用于对性能要求极高、且有完善外部备份机制的非关键数据场景。操作前请务必确认目标磁盘,误操作可能导致系统崩溃或数据损毁。
分步骤配置指南
第一步:安装必要工具
我们需要 mdadm 来管理软 RAID,以及 bcache-tools 来管理缓存层。
apt install mdadm bcache-tools
第二步:清除磁盘旧签名
在重新划分磁盘用途前,必须清除可能存在的旧文件系统、RAID 或分区表签名,防止 mdadm 或 bcache 识别冲突。
wipefs --all /dev/sdd
wipefs --all /dev/sde
wipefs --all /dev/sdc
第三步:创建 GPT 分区并设置 RAID 类型
对两块机械硬盘 /dev/sdd 和 /dev/sde 分别执行以下 gdisk 操作:
- 输入
o创建新的空 GPT 分区表。 - 输入
n新建分区(使用默认参数,一路回车)。 - 输入
t更改分区类型,输入代码fd00(Linux RAID)。 - 输入
w写入分区表并退出。
第四步:创建 RAID0 阵列
使用 mdadm 将两个分区组合成 RAID0 阵列 /dev/md0:
mdadm --create --verbose /dev/md0 --level=0 --raid-devices=2 /dev/sdd1 /dev/sde1
验证阵列状态:
cat /proc/mdstat
mdadm --detail /dev/md0
预期输出应显示阵列状态为 clean,容量约为 7.28 TiB:
Raid Level : raid0, Array Size : 7813769216 (7.28 TiB 8.00 TB), State : clean
第五步:创建 bcache 缓存层
将 SSD(/dev/sdc)作为缓存,绑定到 RAID 阵列(/dev/md0)上。这里使用 --writeback 模式以获取最佳写入性能:
make-bcache -B /dev/md0 -C /dev/sdc --writeback
预期输出包含缓存桶信息:
nbuckets: 228946, bucket_size: 1024
验证 bcache 状态:
lsblk | grep bcache
cat /sys/block/bcache0/bcache/state
cat /sys/block/bcache0/bcache/cache_mode
bcache-super-show /dev/sdc
输出示例:
bcache0 251:0 0 7.3T 0 disk
clean
writethrough [writeback] writearound none
方括号 [writeback] 表示当前已激活写回模式。
第六步:格式化 Btrfs 并挂载
将 bcache 虚拟设备格式化为 Btrfs 文件系统,标签设为 DATA:
mkfs.btrfs -L DATA /dev/bcache0
mkdir /data
mount /dev/bcache0 /data/
df -h
/dev/bcache0 7.3T 5.8M 7.3T 1% /data
第七步:持久化配置
为了防止重启后阵列无法自动组装,必须保存配置并更新启动镜像:
# 保存 RAID 配置
mdadm --detail --scan >> /etc/mdadm/mdadm.conf
update-initramfs -u
# 获取 bcache 设备的 UUID
blkid /dev/bcache0
/dev/bcache0: LABEL="DATA" UUID="c0e26c2c-d86c-48c5-b0c7-06dd8d192c85" ... TYPE="btrfs"
第八步:配置 fstab 自动挂载
编辑 /etc/fstab,使用 UUID 路径进行挂载,并添加针对 Btrfs 的优化参数。参考原有 fstab 格式,新增条目如下:
# /etc/fstab: static file system information.
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/sda2 during curtin installation
/dev/disk/by-uuid/5cd51f0b-7688-4a38-81c4-c6d85ddf6bf8 / btrfs defaults 0 1
# /boot/efi was on /dev/sda1 during curtin installation
/dev/disk/by-uuid/942A-FB86 /boot/efi vfat defaults 0 1
# RAID0 array (sdd+sde) with bcache cache (sdc) during manual configuration
/dev/disk/by-uuid/c0e26c2c-d86c-48c5-b0c7-06dd8d192c85 /data btrfs defaults,noatime,compress=zstd,space_cache=v2,nofail 0 0
第九步:验证挂载
执行以下命令确保配置无误且挂载成功:
mount -a
df -h
确认 /dev/bcache0 已成功挂载到 /data 目录。
关键挂载参数说明
在 fstab 中,我们为 Btrfs 配置了以下关键选项:
- noatime:禁止更新文件的访问时间(atime)。对于机械硬盘阵列,这能显著减少不必要的元数据写入,延长磁盘寿命并提升性能。
- compress=zstd:启用 zstd 透明压缩。zstd 在压缩率和 CPU 开销之间取得了极佳的平衡,对于文本、日志等数据,不仅能节省空间,还能减少物理 I/O 次数,变相提升机械盘的读取速度。
- space_cache=v2:使用 Btrfs 第二代空间缓存。相比 v1,v2 在频繁创建/删除小文件的场景下,元数据操作性能有数量级的提升。
- nofail:如果该设备在启动时不存在或挂载失败,系统不会进入紧急模式(emergency mode),而是继续正常启动。这对于非系统盘的数据阵列非常重要,可避免缓存盘或阵列故障导致服务器无法开机。
注意事项
- RAID0 的高风险性:单盘故障等同于全部数据丢失。请务必配合外部备份策略使用。
- writeback 模式的缓存风险:在 writeback 模式下,数据先写入 SSD 缓存再异步刷入机械盘。如果此时 SSD 发生故障,尚未刷入的脏数据将永久丢失。若对数据安全性要求高于写入性能,请切换为 writethrough 模式(通过
echo writethrough > /sys/block/bcache0/bcache/cache_mode)。 - 持久化配置不可遗漏:必须同时完成 mdadm.conf 保存、update-initramfs 更新以及 fstab 配置,否则重启后阵列可能降级或无法挂载。
- 操作前确认目标:wipefs --all 是不可逆操作,执行前请反复核对设备名称,切勿对系统盘或数据盘误操作。
- 数据备份:在进行任何底层存储重构前,务必备份重要数据。
- fstab 中的 dump 和 pass 设为 0:Btrfs 有自己的校验机制,且 RAID0 做 fsck 意义不大,设为 0 可避免启动时不必要的检查。
最终拓扑图
以下是本方案的数据流向拓扑:
[ 应用程序 / 用户数据 ]
|
v
[ Btrfs 文件系统 ] <-- 透明压缩 (zstd) / 空间缓存 (v2)
|
v
[ bcache0 虚拟设备 ]
/ \
[ SSD 缓存层 ] [ RAID0 阵列 /dev/md0 ]
(writeback) / \
[ /dev/sdd1 ] [ /dev/sde1 ]
(3.6T HDD) (3.6T HDD)
总结
通过组合 RAID0、bcache 和 Btrfs,我们在有限的硬件预算下,成功构建了一个兼具大容量、高吞吐和智能缓存的存储方案。RAID0 提供了基础带宽,bcache 抹平了机械盘的随机读写劣势,而 Btrfs 的压缩和空间缓存特性则进一步提升了整体性能。只要充分理解并敬畏 RAID0 的风险,做好数据备份,这套方案将是高性价比存储架构的绝佳选择。