ZFS vs btrfs:家用 NAS 选哪个文件系统

起因

新装 NAS 4 块 4TB 硬盘。选 file system 时纠结 ZFS vs btrfs。
都支持:snapshot / compression / dedup / RAID / checksum。
但底层设计 + 成熟度 + 稳定性差异不小。下面是我做完功课的对比。

共同特性

  • 文件系统级 checksum(侦测 bit rot)
  • transparent compression(zstd / lz4 / gzip)
  • snapshot + send/receive 增量
  • pool / volume / dataset 抽象
  • 多盘 RAID-like 配置
  • copy-on-write 设计

主要差异

1. RAID

ZFS

  • mirror / raidz (raid5) / raidz2 (raid6) / raidz3
  • pool 一旦创建后不能扩容 vdev 内的盘(v2024 改了,但有限制)
  • 加更多盘要新 vdev(stripe over vdev)

btrfs

  • single / dup / raid0 / raid1 / raid10 / raid5 / raid6
  • 极灵活:随时加盘 / 移盘 / 改 RAID profile(balance 操作)
  • raid5/6 仍然 NOT production ready(这是 btrfs 最大坑)

家用 NAS 常见配置:

  • 4 块盘 + ZFS RAID-Z2:可挂 2 块(最佳容错)
  • 4 块盘 + btrfs RAID1:只挂 1 块;btrfs RAID1 是"每文件 2 副本"
    而非"两组镜像",新颖但适配差

2. 稳定性 / 数据安全

ZFS

  • 2005 起 production,全球大企业用,经受 20 年实战
  • 数据完整性是设计第一原则
  • bug 极少(且大多在 cutting-edge 功能)

btrfs

  • 2007 起,主线内核 2009+
  • 单盘 / RAID0/1/10 稳,RAID5/6 多年文档警告 not production
  • 2024 ext4 maintainer 写过 "I still don't recommend btrfs raid5/6"
  • 多盘环境历史 bug 多于 ZFS

数据安全敏感 → ZFS。

3. 内存需求

ZFS

  • ARC (Adaptive Replacement Cache) 吃内存:1GB / 1TB rule of thumb
  • 16GB NAS + 16TB 数据:ARC 占 10GB +
  • 启用 dedup 更吃(每 1TB ~5GB RAM)
  • 可调整 zfs_arc_max

btrfs

  • 内存占用低很多
  • 4GB RAM 也能稳定跑 8TB btrfs

老 NAS / 低 RAM 设备 → btrfs。

4. 性能

随机读写:ZFS(with ARC)通常更快。
顺序读写:相近。
压缩:ZFS lz4 / zstd 性能略好。

但实际差距不大(除非 RAM 极充裕时 ZFS ARC 效果显著)。

5. snapshot + send/receive

两者都有,用法相似:

# ZFS
zfs snapshot tank/data@daily-20240524
zfs send tank/data@yesterday tank/data@daily-20240524 | ssh remote 'zfs receive ...'

# btrfs
btrfs subvolume snapshot /mnt/data /mnt/data/.snapshots/daily-20240524 -r
btrfs send -p /mnt/data/.snapshots/yesterday /mnt/data/.snapshots/daily-20240524 | ssh remote 'btrfs receive ...'

ZFS send 更成熟稳定。btrfs send/receive 有过历史 bug。

6. 加密

ZFS 2.0+:内置 native encryption
btrfs:依赖 LUKS 下层加密(不是 fs 级 native)

ZFS 加密更灵活(per-dataset key)。

7. 文件系统级 quota

ZFS:quota 是基础特性,per-dataset / per-user
btrfs:qgroup 复杂 + 历史 bug + 性能影响

需要 quota → ZFS。

8. Linux kernel 集成

ZFS:不在 mainline kernel(CDDL vs GPL license 冲突)。
- 装 OpenZFS 模块(apt install zfsutils-linux)
- 每次 kernel 升级需要 DKMS 重 build
- Ubuntu 官方支持;其它 distro 看情况

btrfs:mainline kernel 内置,开箱即用

部署简单 → btrfs。
但 ZFS 装好后稳定,DKMS 自动重 build,不算大坑。

9. 工具生态

任务 ZFS btrfs
GUI Cockpit ZFS / TrueNAS Cockpit btrfs / Snapper
备份 sync syncoid + sanoid(极成熟) btrbk
自动 snapshot sanoid snapper / btrbk
pool 监控 zpool status + zed btrfs scrub status

ZFS 工具链更成熟(成熟得益于 Solaris 时代积累)。

10. 修复 / 恢复

ZFS
- zpool scrub 自动修复有 redundancy 的损坏
- 严重时 zpool import -F 强制恢复
- 数据恢复工具:zdb(专家用)

btrfs
- btrfs scrub 类似
- 严重时 btrfs restore 拉文件出来
- 但 RAID5/6 + 多盘损坏场景历史上有人 lose 数据

ZFS recover 工具更可靠。

选择决策

场景 推荐
4+ 盘 + RAID5/6 + 关键数据 ZFS (RAID-Z2)
2 盘 mirror 都行(btrfs 略简单)
单盘大容量 btrfs(CoW + snapshot)
内存紧张(< 4GB) btrfs
内存充裕(> 16GB) ZFS
笔记本 + Fedora btrfs(mainline)
严格 quota / multi-tenant ZFS
想随时改 RAID profile btrfs
远程异地复制 ZFS(syncoid 成熟)

我的实际选择

家用 NAS(4 × 4TB):ZFS RAID-Z2 + zstd 压缩
- 容忍 2 盘挂
- 16GB RAM 给 ARC 用
- 用 sanoid + syncoid 自动 snapshot + 远程异地

笔记本 Linux 根分区:btrfs
- mainline,无 DKMS 折腾
- snapshot 频繁,Fedora 系自动 snapper

安装

ZFS on Ubuntu 22.04+

sudo apt install -y zfsutils-linux

# 4 盘 RAID-Z2 + 4K aligned + lz4 默认
sudo zpool create -o ashift=12 \
    -O compression=lz4 -O atime=off -O xattr=sa -O dnodesize=auto \
    tank raidz2 \
    /dev/disk/by-id/scsi-... \
    /dev/disk/by-id/scsi-... \
    /dev/disk/by-id/scsi-... \
    /dev/disk/by-id/scsi-...

btrfs on Ubuntu / Fedora

sudo apt install -y btrfs-progs

# 4 盘 RAID10
sudo mkfs.btrfs -L data -m raid10 -d raid10 /dev/sdb /dev/sdc /dev/sdd /dev/sde
sudo mkdir /mnt/data
sudo mount -o compress=zstd:3,space_cache=v2 /dev/sdb /mnt/data

常见操作对照

# 看状态
zpool status -v             # ZFS
btrfs filesystem usage /mnt/data   # btrfs

# 校验所有数据
zpool scrub tank
btrfs scrub start /mnt/data

# 加盘扩容
zpool add tank /dev/new-disk         # 新 vdev (stripe)
btrfs device add /dev/new-disk /mnt/data && btrfs balance start /mnt/data

# snapshot
zfs snapshot tank/data@snap
btrfs subvolume snapshot /mnt/data /mnt/data/.snap/snap

# 删除 snapshot
zfs destroy tank/data@snap
btrfs subvolume delete /mnt/data/.snap/snap

# 看压缩比
zfs get compressratio tank
compsize /mnt/data

踩过的坑

ZFS

  1. ARC 吃光内存 → 容器 OOM。zfs_arc_max 调小。
  2. DKMS 升级 kernel 慢 → reboot 后 zpool 找不到。等 DKMS build 完
    再 reboot。
  3. pool import 失败 → 用 disk by-id 不要 /dev/sdX(顺序会变)。
  4. dedup 慎用 → 5GB RAM / 1TB 数据,开了多数情况后悔。

btrfs

  1. RAID5/6 不要上生产——文档明确警告。
  2. subvolume 嵌套乱 → snapshot 时易踩坑。清晰目录结构。
  3. balance 时机器抖 → 大量 IO 影响业务。低峰跑 + 限速。
  4. qgroup 启用后慢 5-10 倍 → 不需要 quota 就别开。

多年使用感受

我个人 5+ 年家用 NAS 跑 ZFS:

  • 多次硬盘故障,RAID-Z2 透明处理 + 在线替换
  • 月度 scrub 偶尔修复 bit rot(每次几 KB;硬盘老化的标志)
  • snapshot 救命过若干次:误删文件 / VM 改坏直接回滚

btrfs 笔记本 3 年:

  • snapshot 救过几次升级失败
  • 偶尔 scrub 报错(无 redundancy 时无法 fix),重要数据靠云备份
  • 性能 / 稳定够日常用

两个都好。选符合你 use case 的不犯错。

精确评价 共 0 人评价
可复现性
可复现 · 0 不可复现 · 0
文风
文风流畅 · 0 文风晦涩 · 0
立场
支持 · 0 反对 · 0

登录后即可对本帖作出评价。

评论区 0 条 · 所有人可在此交流

登录后参与评论。

还没有评论,来说两句。