字数 1482,阅读大约需 8 分钟
本篇给出 4 个真实场景的 Btrfs 部署方案:桌面 / 服务器 / 容器 / 家用 NAS。
一、桌面 / 工作站
1.1 推荐配置
| |
|---|
| Fedora Workstation / openSUSE Tumbleweed / Ubuntu Desktop |
| |
| |
| 不用 Btrfs(用 zram / swapfile) |
1.2 安装时配置
openSUSE 安装器会自动配置 Btrfs:
/ subvol=@ Btrfs
/home subvol=@home Btrfs
swap
/boot ext4
手动配置 fstab:
# /etc/fstab
UUID=... / btrfs subvol=@,compress=zstd,space_cache=v2,noatime 0 0
UUID=... /home btrfs subvol=@home,compress=zstd,space_cache=v2,noatime 0 0
1.3 snapper 自动快照
openSUSE 自动配置 snapper:
# 看快照
$ snapper list
# 看时间线快照
$ snapper -c root timeline
# 回滚
$ snapper -c root undochange 1..0
1.4 优势
- • 升级失败可回滚(
snapper rollback)
二、服务器(生产)
2.1 推荐配置
2.2 系统盘配置
# 系统盘(2 块 SSD 做 RAID1)
$ mkfs.btrfs -L system -d raid1 -m raid1 /dev/sdb /dev/sdc
# mount
$ mount /dev/sdb /mnt
$ btrfs subvolume create /mnt/@
$ btrfs subvolume create /mnt/@home
$ btrfs subvolume create /mnt/@var
$ btrfs subvolume create /mnt/@srv
$ btrfs subvolume create /mnt/@snapshots
$ umount /mnt
# fstab
UUID=... / btrfs subvol=@,compress=zstd,noatime 0 0
UUID=... /home btrfs subvol=@home,compress=zstd,noatime 0 0
UUID=... /var btrfs subvol=@var,compress=zstd,noatime 0 0
UUID=... /srv btrfs subvol=@srv,compress=zstd,noatime 0 0
UUID=... /.snapshots btrfs subvol=@snapshots 0 0
2.3 数据库场景(特殊)
数据库不推荐用 Btrfs 的 COW 模式:
# 方案 1:单独 subvolume + nodatacow
$ btrfs subvolume create /mnt/@db
$ mount -o subvol=@db,nodatacow /dev/sdb /mnt/db
$ mkdir /mnt/db/postgresql
$ chattr +C /mnt/db/postgresql
# 方案 2:直接用 ext4(保守)
$ mkfs.ext4 /dev/sdd
$ mount /dev/sdd /var/lib/postgresql
生产数据库推荐用 ext4/xfs + LVM + 硬件 RAID。Btrfs 适合文件存储,不适合数据库。
2.4 文件存储服务器
# 4 块 4TB HDD 做 raid5
$ mkfs.btrfs -L files -d raid5 -m raid1 /dev/sd{b..e}
# 挂载
$ mount /dev/sdb /data
# 子卷划分
$ btrfs subvolume create /data/projects
$ btrfs subvolume create /data/archives
$ btrfs subvolume create /data/backups
# fstab
UUID=... /data btrfs subvol=data,compress=zstd,noatime 0 0
# 后续子卷在 /data/ 下独立管理
三、家用 NAS
3.1 典型配置
| |
|---|
| OpenMediaVault / TrueNAS Scale / Rockstor / 自建 |
| |
| |
3.2 OMV + Btrfs 部署
OpenMediaVault 6+ 支持 Btrfs:
# 安装
$ apt install openmediavault
# 装 btrfs-progs
$ apt install btrfs-progs
# 在 OMV 界面创建 Btrfs pool
# 4 块 4TB HDD raid5
3.3 Snapper 自动管理
# 创建配置
$ snapper -c data create-config /mnt/data
# 自动拍 + 自动清理
$ vim /etc/snapper/configs/data
TIMELINE_CREATE="yes"
TIMELINE_LIMIT_HOURLY="10"
TIMELINE_LIMIT_DAILY="10"
TIMELINE_LIMIT_WEEKLY="0"
TIMELINE_LIMIT_MONTHLY="6"
3.4 send/recv 异地备份
# 备份到另一台机器
$ btrfs send /mnt/.snapshots/.../snapshot | ssh backup-nas btrfs receive /backup/data
四、容器存储
4.1 Docker
Btrfs 是 Docker 的原生 storage driver 之一(已废弃):
新部署推荐 overlay2,Btrfs driver 已 deprecated。
如果用 Btrfs 做 Docker 存储:
# /etc/docker/daemon.json
{
"storage-driver": "btrfs"
}
但不推荐。改用:
{
"storage-driver": "overlay2"
}
底层用 Btrfs:
# Docker 数据目录放 Btrfs
$ btrfs subvolume create /mnt/@docker -o mountpoint=/var/lib/docker
# 在 /etc/fstab 设置
4.2 Kubernetes + Btrfs
K8s 用 local persistent volume 配合 Btrfs:
apiVersion: v1
kind: PersistentVolume
metadata:
name: btrfs-pv
spec:
capacity:
storage: 100Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: btrfs-local
local:
path: /data/k8s/pv-001
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- k8s-node-01
但生产 K8s 通常用 longhorn / rook / ceph 等动态存储。
4.3 LXC 容器
LXC 与 Btrfs 是绝配:
# 创建容器 rootfs 子卷
$ btrfs subvolume create /var/lib/lxc/ubuntu-base
# 创建容器(几乎是瞬间)
$ lxc-create -t ubuntu -n my-container --bdev btrfs /var/lib/lxc
# 快照容器
$ lxc-snapshot my-container
# 克隆容器
$ lxc-copy my-container my-container-2
ZFS / Btrfs + LXC = 比 KVM 轻,比 Docker 灵活 的虚拟化方案。
五、VM 虚拟化
5.1 KVM + Btrfs
# 创建 VM 磁盘镜像(稀疏)
$ truncate -s 100G /mnt/vms/vm-001.qcow2
$ qemu-img create -f qcow2 /mnt/vms/vm-001.qcow2 100G
# 或用 Btrfs 的 reflink(更高效)
$ cp --reflink=0 /mnt/vms/template.qcow2 /mnt/vms/vm-001.qcow2
注意:qcow2 内部也用 COW,与 Btrfs COW 双重叠加,性能会受影响。
更优方案:
# 用 raw 镜像(无 qcow2)
$ truncate -s 100G /mnt/vms/vm-001.raw
# KVM 性能更好
或用 LVM 块设备(绕过 Btrfs COW):
# 单独盘做 LVM
# Btrfs 做数据存储
# LVM 做 VM 磁盘
六、监控系统
6.1 监控项
# 1. 容量
$ btrfs filesystem usage /mnt
# 2. 错误
$ btrfs device stats /mnt
# 3. 设备 SMART
$ smartctl -a /dev/sdb
# 4. scrub 状态
$ btrfs scrub status /mnt
6.2 智能告警
#!/bin/bash
# /usr/local/bin/btrfs-alert.sh
for mnt in /data /home; do
# 容量
USED=$(df -BG $mnt | tail -1 | awk '{print $3}' | tr -d 'G')
if [ "$USED" -gt 800 ]; then
echo "ALERT: $mnt is ${USED}G used"
fi
# 错误
btrfs device stats $mnt 2>/dev/null | grep -v " 0$" | while read line; do
echo "ALERT: $mnt: $line"
done
done
6.3 自动化维护
# /etc/cron.d/btrfs-maintenance
# 每月 scrub
0 4 1 * * root /sbin/btrfs scrub start /mnt/data
0 4 2 * * root /sbin/btrfs scrub start /mnt/home
# 每周 trim(SSD)
0 5 * * 0 root /sbin/fstrim /mnt/data
0 5 * * 0 root /sbin/fstrim /mnt/home
七、生产环境最佳实践
7.1 推荐配置
7.2 一定要做的事
✅ 启用压缩(compress=zstd)
✅ 启用 SMART 监控
✅ 定期 scrub(每月)
✅ send/recv 异地备份
✅ 监控容量 ≥ 90% 报警
✅ 系统盘用 snapper 自动快照
7.3 一定不要做的事
❌ 数据库用 Btrfs COW 模式
❌ raid5/6 用于关键数据(旧内核)
❌ qgroup 在高 IO 场景(性能陷阱)
❌ 在 RHEL 商业版上用 Btrfs
❌ 把 Btrfs 当成"无脑可靠的 ZFS"——它还在改进中
八、本篇小结
口诀: