外观
ZFS 插件
读完这篇,你能在 OMV 上建出一个带校验和快照的 ZFS 池,把其中的数据集当作共享文件夹的存储位置,并知道哪些按钮是单向的、哪些操作会让数据消失。
适合谁
| 你的情况 | 建议 |
|---|---|
| 想要数据校验、自愈、快照、压缩,愿意多学一套概念 | 适合。ZFS 把 RAID、卷管理和文件系统合在一起 |
| 只想把几块盘变成一个共享目录 | 不必上 ZFS,看 mergerfs 或 软件 RAID |
| 想要快照但不想学 ZFS | 先看 Btrfs |
| 树莓派等 ARM 单板机 | 不建议。插件 GUIDE 写明不支持 ARM 单板机 |
| 内存很小(1–2 GiB) | 慎用。GUIDE 认为 4–8 GiB 跑家用 NAS 没问题,ARC 会随内存压力收缩 |
动手前:数据丢失与内核依赖
- 影响范围:删除池(Delete)会销毁池并擦掉成员盘上的标签,不可逆;升级池(Upgrade)开启全部新特性,单向,旧版 ZFS 之后无法导入这个池(官方中文把数据集的 Promote 也译成「升级」,别点错);往镜像或 RAID-Z 池里加一块基础(Basic)vdev 会让池变成条带,丢一块盘可能丢全池;加密数据集的口令丢了,数据就永远打不开。
- 前置条件:先按内核插件装好 Proxmox 内核(amd64),再装本插件。建池前用
存储器 → 磁盘(Storage → Disks)按型号和序列号核对目标盘,只选空盘。 - 怎么回退:建池后立刻后悔,可以删除这个空池;有数据后没有回退,只能靠独立备份。ZFS 冗余只防坏盘,不是备份,误删、勒索、整机损坏都要靠 备份策略。
插件信息
| 项 | 内容 |
|---|---|
| 包名 | openmediavault-zfs |
| 来源 | omv-extras(社区维护) |
| OMV 8 状态 | 截至 2026-10-22 的 omv-extras synchrony 软件源为 8.1.1(amd64、arm64),要求 OMV 8.3 以上 |
| 菜单位置 | 存储器 → zfs(Storage → zfs),菜单名是小写。子页:池、数据集、快照、快照任务、擦洗任务、复制任务、ARC 统计、设置 |
| 依赖 | zfsutils-linux、zfs-zed,以及二选一的模块提供者:omv-zfs-provider-pve(amd64,Proxmox 预编译模块)或 omv-zfs-provider-dkms(现场编译) |
先装 omv-extras,插件才会出现在 系统 → 插件(System → Plugins)里。
安装
系统 → 更新管理(System → Update Management)把待更新的包全部装完。- 按内核插件安装 Proxmox 内核并重启。
- 在
系统 → 插件里搜索zfs,安装openmediavault-zfs。装完按 Ctrl+Shift+R 硬刷新浏览器,侧边栏出现存储器 → zfs。
为什么要先装 Proxmox 内核:插件 GUIDE 指出,Debian backports 内核升级时可能丢失 ZFS 模块包,池会打不开;Proxmox 内核自带预编译模块,和 ZFS 软件包同步更新。插件按当前运行的内核选择模块提供者:
| 当前运行的内核 | 模块来源 |
|---|---|
amd64,内核名含 pve | omv-zfs-provider-pve,并把 ZFS 相关包固定到 Proxmox 软件源 |
| 其他(Debian 内核,或 arm64) | omv-zfs-provider-dkms,现场编译,需要当前内核的 headers |
装了 Proxmox 内核但还没重启、仍在跑 Debian 内核时就装插件,插件会按 DKMS 方式配置。重启进入 pve 内核后,它不会自己切换:要在 OMV 的 shell(root)执行一次 omv-salt deploy run zfs,才会改用 Proxmox 预编译模块。插件源码里有一条提醒你重启的提示,但它只识别旧的 pve-kernel- 包名,新的 proxmox-kernel-* 包很可能触发不了,不要依赖它。最稳妥的顺序是上面的步骤:先装 Proxmox 内核、重启,用 uname -r 确认输出里有 pve,再装 ZFS 插件。
配置与使用
先弄懂三个词
| 词 | 含义 |
|---|---|
| 池(pool) | 最顶层的存储容器,由一个或多个 vdev 组成 |
| vdev | 冗余单位。一个 vdev 整体坏掉,整个池就没了;冗余只保护 vdev 内部的单盘故障 |
| 数据集(dataset) | 池里的文件系统或卷,可以单独设压缩、配额、快照 |
| 池类型 | 最少盘数 | 容忍坏盘 | 说明 |
|---|---|---|---|
| 基础(Basic) | 1 | 0 | 没有冗余,任何一块盘坏了池就没了 |
| 镜像(Mirror) | 2 | 只剩一块即可 | 家用 NAS 的常见选择,随机读写和重建都更好 |
| RAID-Z1 | 3 | 1 | GUIDE 建议每个 vdev 不超过 7 块盘 |
| RAID-Z2 | 4 | 2 | 大容量盘更稳妥 |
| RAID-Z3 | 5 | 3 | 盘多、容量大时用 |
创建池
存储器 → zfs → 池(Pools):在池(Pool)菜单里选 添加池(Add pool)。- 填写表单:
| 字段 | 说明 |
|---|---|
| 名称(Name) | 不能含空格,不能以数字开头 |
| 池类型(Pool type) | 表单默认是 RAID-Z1,别忘了按需求改 |
| 设备(Devices) | 只列出没分区、没被使用的盘 |
| 挂载点(Mountpoint) | 留空则挂在 /<池名>,注意不在 /srv 下 |
| 设备别名(Device alias) | 默认以 ID(by-id),盘换插槽也认得;别改成 None |
| 强制创建(Force creation) | 等于 zpool create -f,盘上有旧分区表或标签时才需要,谨慎 |
| 设置 ashift(Set ashift) | 默认不勾。GUIDE 建议对现代 4K 盘显式设为 12;界面提示是「确定需要才设置」。创建后不能改 |
| 压缩(Compression) | 勾选后选压缩类型,lz4 快且省空间 |
| 区分大小写(Case sensitivity) | 默认区分,创建后不能改 |
- 保存后,顶部出现黄色提示条,点击应用。
插件建池时还会固定加上 atime=off、acltype=posix、xattr=sa、autoexpand=on、failmode=continue(来自插件源码)。POSIX ACL 因此是开着的,OMV 共享文件夹的 ACL 应当可以直接使用。
建数据集,再建共享文件夹
不要把数据直接放在池根上,至少建一个命名的文件系统。
存储器 → zfs → 数据集(Datasets):选中池,添加(Add)→ 添加文件系统(Add filesystem)。- 名称按用途起,例如
media。记录大小(Record size)默认 128K;纯大文件的媒体库可以设 1M,数据库设 4K–16K。 - 在池页或数据集页点 发现(Discover)→ 新增(Add new),把新数据集登记进 OMV 的挂载数据库。登记前会自动备份
config.xml(保留最近 20 份)。 - 点黄色提示条上的应用。
- 到
存储器 → 共享文件夹(Storage → Shared Folders),新建共享文件夹时就能选这个数据集,见 共享文件夹。
快照与找回文件
- 手动:选中数据集,添加→ 添加快照(Add snapshot),或用 快速快照(Quick snapshot),名字自动带时间戳。
- 定时:
存储器 → zfs → 快照任务(Snapshot Jobs)。选数据集、前缀(默认auto)、保留数量或保留时长、执行时间。多个任务打同一个数据集时,前缀要不同,例如daily、weekly。 - 找回单个文件:快照在数据集挂载点下的隐藏目录里,直接复制出来即可,不需要挂载:
text
/<池名>/<数据集>/.zfs/snapshot/<快照名>/- 回滚(Rollback)会把整个数据集退回到快照时刻,之后写入的数据全部丢弃。想找回单个文件,用上面的复制,不要回滚。
擦洗
存储器 → zfs → 擦洗任务(Scrub Jobs)新建任务,家用盘每月一次即可,负载重或盘较旧可以每周。擦洗会读遍所有数据,放在夜里;任务只负责启动擦洗,结果要回到池页的擦洗菜单看擦洗状态(Scrub status)。
复制到另一个池或另一台机器
存储器 → zfs → 复制任务(Replication Jobs)用 zfs send / zfs receive 做增量复制,目标可以是本机另一个池,也可以经 SSH 到远端。
- 远端复制先在
系统 → 证书 → SSH(System → Certificates → SSH)生成密钥并用 复制到远程 授权,再在任务里选这把证书。 - 已经有快照任务时,复制任务勾选 使用现有快照(Use existing snapshots),前缀要和快照任务一致,避免两个任务抢着建快照。
- 复制出去的是另一份数据,才有机会当备份;但目标池也要有自己的坏盘与误删防护。
加密数据集
添加→ 添加加密文件系统(Add encrypted filesystem)。算法选 AES-256-GCM,口令至少 8 个字符。
口令丢了就是数据丢了
把口令放进密码管理器,并在 NAS 之外再留一份。没有口令,数据集无法解锁,也没有任何后门。
自动解锁有两种:本地文件把口令明文放在 /etc/zfs/keys/,防得住单独被偷的硬盘,防不住整机被偷;远程 HTTPS 开机时从你的服务器取密钥,密钥不落在本机。删除加密数据集要用插件的删除,不要在命令行直接 zfs destroy,否则会留下密钥文件和 systemd 单元。
内存与 ARC
存储器 → zfs → 设置(Settings)里的 最大 ARC 大小(Maximum ARC size,MiB)默认 0,表示不限制,ARC 稳态约占一半内存。同机还要跑容器时,可以设成内存的一半左右。保存、应用后重启生效。8.1.1 起还有 Extra module options,每行一条 options zfs …,原样追加到模块配置,不熟悉就留空。
换一块坏盘
在池页选中池,用设备菜单里的替换设备(Replace device),选新盘,重新同步修复(resilver)立即开始,期间池显示降级(DEGRADED)。完成后用清除错误(Clear errors)清掉旧计数。替换前先按序列号确认拔的是哪一块。
检查结果
- 池页的状态是在线(ONLINE),仪表盘可以加上 ZFS 存储池健康小部件。
- 在 OMV 的 shell(root)执行:
sh
zpool status应该看到 errors: No known data errors。 3. 用一个测试数据集验证快照:写入一个文件,做快速快照,删除文件,再从 .zfs/snapshot 目录复制回来,内容一致;最后通过插件删除这个测试数据集。 4. 重启后池和共享文件夹仍然自动挂载。
备份与维护
- 配置:池结构记录在磁盘上,共享文件夹引用记录在 OMV 数据库里。动大手术前备份
config.xml,见 配置留底。 - 升级内核:Proxmox 内核和 ZFS 包同步升级,更新后重启即可。每次更新前看一眼更新列表里有没有 ZFS 相关包。
- 卸载插件:卸载会按 apt 规则连带移除不再需要的 ZFS 软件包,期间池无法使用。不会擦掉盘上的池,重装后可用导入 / 导出菜单里的导入找回。这一点本文只依据源码推断,没有实机验证,卸载前先备份。
- 数据备份:可以用复制任务、BorgBackup 或 restic,并做 恢复演练。
常见问题
装完没有 存储器 → zfs。 硬刷新浏览器;仍然没有,看 插件装完界面不对。
更新内核后池不见了。 当前内核没有匹配的 ZFS 模块。重启回到装有模块的内核,数据没有丢。
共享文件夹的文件系统下拉里没有新数据集。 在池页或数据集页运行 发现→ 新增,再点应用。
arm64 上提示缺少内核 headers。 走 DKMS 的 arm64 系统需要当前内核的 headers,装好后再点应用。本站不建议在单板机上用 ZFS。
参考资料
- 插件源码与 GUIDE:OpenMediaVault-Plugin-Developers/openmediavault-zfs
- omv-extras wiki:ZFS Plugin For OMV8(2026-05-27 更新)
- OpenZFS 文档:openzfs.github.io/openzfs-docs