起因
新装 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
- ARC 吃光内存 → 容器 OOM。
zfs_arc_max调小。 - DKMS 升级 kernel 慢 → reboot 后 zpool 找不到。等 DKMS build 完
再 reboot。 - pool import 失败 → 用 disk by-id 不要 /dev/sdX(顺序会变)。
- dedup 慎用 → 5GB RAM / 1TB 数据,开了多数情况后悔。
btrfs
- RAID5/6 不要上生产——文档明确警告。
- subvolume 嵌套乱 → snapshot 时易踩坑。清晰目录结构。
- balance 时机器抖 → 大量 IO 影响业务。低峰跑 + 限速。
- qgroup 启用后慢 5-10 倍 → 不需要 quota 就别开。
多年使用感受
我个人 5+ 年家用 NAS 跑 ZFS:
- 多次硬盘故障,RAID-Z2 透明处理 + 在线替换
- 月度 scrub 偶尔修复 bit rot(每次几 KB;硬盘老化的标志)
- snapshot 救命过若干次:误删文件 / VM 改坏直接回滚
btrfs 笔记本 3 年:
- snapshot 救过几次升级失败
- 偶尔 scrub 报错(无 redundancy 时无法 fix),重要数据靠云备份
- 性能 / 稳定够日常用
两个都好。选符合你 use case 的不犯错。
登录后参与评论。