为什么在 Proxmox 上使用 ZFS
ZFS 为 Proxmox VE 带来了企业级功能:通过校验和实现数据完整性(检测并修复静默损坏)、透明压缩、即时快照和克隆以及灵活的类似 RAID 池。它用单个统一的堆栈取代了传统的卷管理和文件系统层。
创建池
池是由虚拟设备 (vdev) 构建的。常见的vdev类型:
| Vdev 类型 | 最小磁盘 | 可用容量 | 描述 |
|---|---|---|---|
| 镜子 | 2 | 50% | 跨两个磁盘镜像数据 |
| RAIDZ1 | 3 | 67% | 单奇偶校验(最多 1 个磁盘故障) |
| RAIDZ2 | 4 | 50% | 双奇偶校验(最多 2 次失败) |
| RAIDZ3 | 5 | 40% | 三重奇偶校验(最多 3 次失败) |
| 条纹 | 1 | 100% | 无冗余(不推荐) |
创建镜像池:
zpool create -o ashift=12 tank mirror /dev/sda /dev/sdb
ashift=12 选项可确保 4K 扇区对齐,这对于现代 SSD 和 HDD 至关重要。短行程和分区对齐进一步提高了性能。
添加缓存和日志设备
ZFS 支持单独的设备以实现性能加速:
- SLOG(单独的意图日志)— 吸收同步写入(NFS、数据库事务)。小型、受电源保护的 SSD(NVMe 或 Optane)可显着提高同步写入性能。不影响读取。
zpool add tank log /dev/nvme0n1p1
- L2ARC(2 级 ARC)— 在 SSD 上缓存频繁读取的数据。添加超出 RAM 大小的读取缓存。当 ARC 驱逐较高时很有用,但会消耗 CPU 进行索引。
zpool add tank cache /dev/nvme0n1p2
压缩
ZFS 提供透明的块级压缩,在现代硬件上的 CPU 开销可以忽略不计:
| 算法 | 比率 | CPU 成本 | 最适合 |
|---|---|---|---|
| lz4 | 〜2x | 非常低 | 通用(默认) |
| zstd | ~2–5x | 低-中 | 档案、混合数据 |
| 压缩包 | ~3–6x | 高 | 最大压缩 |
| 兹勒 | 〜1x | 可以忽略不计 | 已经压缩的数据 |
对数据集启用压缩:
zfs set compression=lz4 tank/vmdata
ARC 调优和 atime
ARC(自适应替换缓存)使用系统 RAM 进行数据缓存。默认情况下,ZFS 最多消耗总 RAM 的 50%。通过内核模块参数调整:
# /etc/modprobe.d/zfs.conf
options zfs zfs_arc_max=8589934592
options zfs zfs_arc_min=4294967296
禁用 atime 以减少 SSD 上的写入放大:
zfs set atime=off tank/vmdata
修剪 SSD
为 SSD 池启用自动 TRIM 以长期保持性能:
zpool set autotrim=on tank
手动修剪可作为一次性操作:
zpool trim tank
快照和克隆
ZFS 快照是瞬时的,并且仅消耗发生变化的块(写入时复制):
zfs snapshot tank/vmdata@pre-update
zfs list -t snapshot
回滚到快照:
zfs rollback tank/vmdata@pre-update
克隆是可写快照,可用于无需复制数据的测试:
zfs clone tank/vmdata@pre-update tank/clone-test
发送/接收复制
ZFS 发送/接收将快照流式传输到另一个池,从而实现异地备份和复制:
zfs send tank/vmdata@pre-update | ssh backup-server "zfs recv backup-pool/vmdata"
增量发送仅在快照之间传输更改的块:
zfs send -i tank/vmdata@pre-update tank/vmdata@post-update | \
ssh backup-server "zfs recv backup-pool/vmdata"
擦洗和监控
定期清理验证校验和并修复静默损坏:
zpool scrub tank
zpool status -v
通过 Proxmox GUI 或 cron 安排清理。监控池健康状况和 SMART 数据:
smartctl -a /dev/sda
更换故障磁盘
更换冗余 vdev 中的故障磁盘:
zpool offline tank /dev/sda
zpool replace tank /dev/sda /dev/sdc
zpool online tank /dev/sdc
常见故障排除
- 池导入失败 —
zpool import -D恢复设备;zpool import -a导入全部。 - 设备离线 — 检查电缆,然后检查
zpool online tank /dev/sda。 - 池性能下降 — 检查碎片:
zpool list -v tank。如果是 SSD,请修剪。

