当前位置:首页>Linux>Linux Btrfs文件系统常见使用场景

Linux Btrfs文件系统常见使用场景

  • 2026-10-05 17:10:25
Linux Btrfs文件系统常见使用场景

字数 1482,阅读大约需 8 分钟

本篇给出 4 个真实场景的 Btrfs 部署方案:桌面 / 服务器 / 容器 / 家用 NAS。

一、桌面 / 工作站

1.1 推荐配置

组件
选型
操作系统
Fedora Workstation / openSUSE Tumbleweed / Ubuntu Desktop
根分区
Btrfs(subvol @)
home
Btrfs(subvol @home)
swap
不用 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)
  • • COW + 校验和保证数据完整性
  • • 透明压缩节省空间

二、服务器(生产)

2.1 推荐配置

角色
Btrfs 用法
系统盘
根分区 + home
数据库
不推荐
(COW 写放大)
文件存储
推荐(压缩、快照)
备份目标
推荐(send/recv)

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 / 自建
硬盘
4~8 块 NAS 盘
内存
1 GB / TB 存储

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 推荐配置

场景
配置
系统盘
raid1 + 自动快照(snapper)
文件存储
raid5/6 + send/recv 异地
数据库
不推荐
(用 ext4/xfs)
容器
子卷隔离 + overlay2

7.2 一定要做的事

✅ 启用压缩(compress=zstd)
✅ 启用 SMART 监控
✅ 定期 scrub(每月)
✅ send/recv 异地备份
✅ 监控容量 ≥ 90% 报警
✅ 系统盘用 snapper 自动快照

7.3 一定不要做的事

❌ 数据库用 Btrfs COW 模式
❌ raid5/6 用于关键数据(旧内核)
❌ qgroup 在高 IO 场景(性能陷阱)
❌ 在 RHEL 商业版上用 Btrfs
❌ 把 Btrfs 当成"无脑可靠的 ZFS"——它还在改进中

八、本篇小结

场景
推荐
注意
桌面
Btrfs + snapper
升级前自动快照
服务器文件
Btrfs raid5/6
send/recv 备份
数据库
ext4/xfs
Btrfs COW 不适合
家用 NAS
Btrfs raid5 + snapper
异地备份
容器
overlay2 + Btrfs 底层
不要用 Btrfs driver
LXC
Btrfs + subvolume
最佳搭配

口诀:

  • • 桌面:snapper 自动管理
  • • 文件服务器:raid5/6 + 异地
  • • 数据库:别用
  • • 容器:overlay2 + Btrfs 底层
  • • 关键数据:3-2-1 备份原则

最新文章

随机文章