ZFS 存储
我们想要感谢Ed Rawlings(Spaceinvader One)所做的专业指导和贡献,这份 ZFS 存储文档正是从他的教程和见解中得来的。感谢他持续为 Unraid 用户提供帮助,帮助众多用户掌握高级存储技术。我们珍视他对 Unraid 社区的持续贡献。
ZFS 为您的 Unraid 系统带来高级的数据完整性、灵活的存储配置和高性能。本指南解释 ZFS 的核心概念,并引导您通过 Unraid WebGUI 直接管理 ZFS 池。无论您是部署新的 ZFS 存储还是整合现有的池,您都可以在这里获取启动所需的步骤和背景。
为什么选择 ZFS?
ZFS 是一种现代文件系统和卷管理器,旨在保护您的数据、预防损坏并简化存储管理。
使用 ZFS,您可以获得:
Unraid supports ZFS for any storage pool. You can create a new ZFS pool, import one from another system, or use Unraid’s unique hybrid ZFS setup: add a ZFS-formatted disk directly to the Unraid array (not a pool) and combine ZFS features with Unraid’s parity protection.
:::info[Example]
您可以在单个磁盘上使用 ZFS snapshots 和复制作为备份目标,或将快速 SSD ZFS 池复制到由 Unraid parity 保护的 ZFS 磁盘中的 array,以获得双重优势。
:::

The hybrid ZFS-in-array approach is helpful for specific backup or replication scenarios but is not a replacement for a full ZFS pool. ZFS disks in the array are managed individually; you do not get the combined performance, redundancy, or self-healing of a true multi-disk ZFS pool. For full ZFS functionality, always use dedicated ZFS pools.
池、vdevs 和冗余
一个 ZFS 池(称为“zpool”)由一个或多个 vdevs(虚拟设备)组成。在每个 vdev 内,多个物理盘通过某种冗余级别组合到一起。ZFS 在多个 vdev 上写入数据,但每个 vdev 负责自己的容错。
冗余总是针对每个 vdev 的。如果任何一个 vdev 失败,整个池将失败,即使其他 vdev 是健康的。请仔细规划您的 vdev!

创建一个 ZFS 池
- 停止array。
- 点击添加池。

- 为您的存储池选择一个名称(例如,
raptor)。 - 设置槽位数量以匹配您想要在主数据 vdev(s) 中的磁盘数量。
此初始槽位数量仅用于数据 vdev。支持 vdev(例如日志或缓存驱动器)可以在创建池后单独添加。

- 将磁盘分配到池中(磁盘顺序无关紧要)。

- 点击池名称(例如
raptor)以打开其配置屏幕。 - 将文件系统类型设置为
zfs或zfs-encrypted(用于 LUKS 加密)。

- 选择您的分配配置文件 - 这会决定您的池的冗余和性能。
在最终确定之前,检查关于分配配置文件和拓扑结构的章节以做出明智的选择。


- 如果需要,可以启用压缩(推荐用于大多数工作负载)。
- 点击完成,然后启动 array。
将 ZFS 磁盘添加到阵列(混合设置)
您可以将独立的 ZFS 磁盘添加到您的 Unraid array(而不是 ZFS 池)中,以结合 ZFS 功能和 Unraid 的 parity 保护。

- 在 文件系统 下,选择
zfs或zfs-encrypted。

- 点击 应用。
- 启动 array,并在需要时让磁盘格式化。
选择分配配置文件
当您设置 ZFS 池时,您的分配配置文件将决定您的数据如何受到保护、池的性能以及其可扩展性。以下是一些简单的比较帮助您决定哪个配置文件适合您的需求:

| 配置 | 冗余 | 性能 | 扩展 | 空间效率 | 典型用例 |
|---|---|---|---|---|---|
| 条带 | 无 | 快,但风险大 | 增加更多磁盘 | 100% | 临时/临时存储 |
| 镜像 | 1:1(RAID 1 样式) | 对于随机 I/O 表现出色 | 增加更多镜像 | 50% | 高性能,易于扩展 |
| RAIDZ1 | 每个 vdev 1 个盘 | 在处理大文件时速度快。不适合小文件或随机写入。 | 增加新的 vdev | 高 | 通用用途,1 盘容错 |
| RAIDZ2 | 每个 vdev 2 个盘 | 与 Z1 类似,但写入略慢(额外的奇偶校验) | 增加新的 vdev | 中等 | 重要数据,2 盘容错 |
| RAIDZ3 | 每个 vdev 3 个盘 | 与 Z2 类似,写入更多负担(最大安全性) | 增加新的 vdev | 低 | 任务关键型,3 盘容错 |
- 选择 镜像 如果您想要最佳性能和易于、灵活的扩展,并且愿意使用更多磁盘空间来确保冗余。
- 选择 RAIDZ1/2/3 如果您想最大化可用空间并存储大文件,但要记住扩展的灵活性较低,随机写性能较差。
- 条带 只适用于非关键性、临时数据 - 如果任何磁盘故障,您将失去所有数据。
拓扑和扩展
您如何将磁盘 分组到 vdevs 中会影响数据安全性和速度。

- 如果您将所有磁盘放入一个大型 RAIDZ2 vdev,您可以在不丢失数据的情况下丢失任意两个磁盘。然而,扩展意味着需要添加另一个完整的 vdev。
- 如果将磁盘分割成多个较小的 RAIDZ1 vdev,您将获得更好的并行性能。请注意,如果同一 vdev 中有两个磁盘故障,您将失去整个池。
- ZFS 将数据跨 vdev 条带化,而不是单个磁盘,因此更多的 vdev 能够提升处理很多小文件或随机 I/O 的工作负载性能。
- 扩展一个 ZFS 容量池通常意味着添加一个新的相同布局的 vdev,而不仅仅是单个磁盘。
压缩和 RAM
ZFS 提供的高级功能能够显著提高 Unraid 的存储效率和性能。压缩和内存需求是两个常见的关注点。
ZFS 压缩是透明的 - 它在后台运行,在数据到达磁盘之前缩小数据。
这提供了两个主要优点:
- 减少磁盘使用量: 所需存储空间更少。
- 提高性能: 写入和读取较少数据可以导致更快的操作,特别是在现代 CPU 上。

ZFS RAM 神话 - 点击展开/折叠
导入其他系统创建的 ZFS 池
Unraid 可以轻松导入其他平台上创建的 ZFS 池。
如何导入 ZFS 池 - 点击展开/折叠
- 停止阵列: 确保您的 Unraid array 已停止。
- 添加新池: 点击 添加池。
- 分配所有驱动器:
- 将 数据槽位数量 设置为您的 ZFS 池中磁盘(包括数据 vdevs 和支持 vdevs)总数。
- 将每个驱动器分配到正确的插槽。
- 示例: 对于具有 4 个驱动器镜像 vdev 和 2 个驱动器 L2ARC vdev 的池,设置 6 个插槽并分配所有六个驱动器。
- 设置文件系统为 "Auto": 点击池名称(例如,
raptor)并将 文件系统 设置为 Auto。 - 完成并启动阵列: 点击 完成,然后启动 array。
导入后,强烈建议运行 scrub 以验证数据完整性。
- 点击池名(例如
raptor)以打开其配置。 - 在 池状态 下,检查状态并点击 Scrub。

支持 vdev(子池)
Unraid 将 ZFS 支持 vdevs 称作子池。大多数用户不需要这些,但有经验的用户可能会使用:

| 支持的 vdev(子池) | 用途 | 风险/注意事项 |
|---|---|---|
| 特殊 vdev | 存储元数据和小文件 | 如果丢失,池将无法读取。 |
| 去重 vdev | 启用去重功能 | 需要大量的 RAM; 对于大多数用户来说风险较大。除非您有专业需求,否则请避免使用。 |
| 日志 vdev(SLOG) | 提高同步写入性能 | 可选。仅对某些工作负载有益。 |
| 缓存 vdev(L2ARC) | 提供基于 SSD 的读取缓存 | 可选。可以提高大型工作集的读取速度。 |
| 备用 vdev | Unraid(截至 7.1.2 版)不支持 |
大多数 Unraid 用户应避免支持 vdevs/子池,除非您有特定并且明确的需求。它们是针对专门工作负载设计的,滥用会带来复杂性或风险。
导入时未分配重要的支持 vdev 驱动器
当将 ZFS 池导入到 Unraid 时,您需要指定原始池中的每个驱动器,包括用于支持 vdevs 的驱动器,确保将其分配到池槽中。Unraid 将在 array 启动后自动识别每个驱动器的角色(数据、日志、缓存、特殊或去重)。您不需要手动指定每个驱动器的用途。
如果在导入期间忘记包含一个支持 vdev 的驱动器,结果将取决于 vdev 的功能:
| Vdev 类型 | 导入时驱动器缺失情况 | 结果 |
|---|---|---|
| 特殊 vdev 或去重 vdev | 池将无法导入或无法使用 | These vdevs store critical metadata or deduplication tables. Without them, ZFS cannot safely mount the pool. |
| 日志(SLOG)vdev | 池导入,但同步写入性能下降。 | 池仍然可访问,但你可能会注意到依赖同步写入的工作负载的性能变慢。 |
| 缓存(L2ARC)vdev | 池导入,但读取缓存丢失 | 池正常工作,但您将失去 L2ARC 缓存带来的性能提升。没有数据丢失。 |
Always assign every physical drive from your original ZFS pool, including all support vdevs, when importing into Unraid. This ensures smooth detection and integration. For new pools created in Unraid, support vdevs are optional and generally not needed for most users.
扩展存储
ZFS 功能强大,但重要的是要了解其存储扩展是如何工作的—尤其是在规划未来增长时。
以往,ZFS 的 vdev 宽度是固定的。您无法通过增加磁盘来增加现有 RAIDZ vdev 的大小。
扩展池的方法包括:
- 添加新 vdev: 通过添加新的 vdev(如新镜像或 RAIDZ 组)来扩展您的池。这增加了容量,但您必须以符合 vdev 配置的方式成组地增加磁盘。
- 用更大的磁盘替换驱动: 一次替换每个 vdev 驱动为更大的磁盘。请参阅 驱动替换 以获取详尽步骤。在所有驱动替换并且池解析之后,vdev 的容量将增加。
- 创建新池: 启动一个新的 ZFS 池可将不同的数据类型或工作负载组织并独立管理。
在建立池之前,考虑您需要多少存储空间 - 不仅是今天,还包括未来的需要。ZFS 在良好规划时会带来回报,特别是当您想要避免以后繁琐的升级时。
在现有 Unraid 服务器上使用 ZFS 池
如果你运行传统 Unraid array 并希望添加 ZFS 池,以下是一些有效的集成方法:
| 使用场景 | 描述 | 详细信息/示例 |
|---|---|---|
| 用于 appdata 和 Docker 的快速 SSD/NVMe 池 | Store the appdata share for fast, responsive containers and databases. This supports snapshots for easy rollbacks and can also host VMs for high I/O. | 许多用户选择 2 驱动 ZFS 镜像。此方式扩展简单并提供强大的性能。 |
| 用于重要数据的ZFS池 | 使用 ZFS 镜像或 RAIDZ2 池来存储不可替代的文件,如照片、税务记录和 %%user-share|用户共享%% 数据。%%ZFS|zfs%% 检查腐败并通过冗余自愈。 | 这种设置通过自动的完整性检查和自我修复功能保护关键数据。 |
| 每日备份或复制目标 | 使用 ZFS 盘(即便是在 Unraid array 中)作为复制目标。您可以在本地或从另一个 Unraid 服务器复制其他池。 | 利用 zfs send/receive 或诸如 Syncoid 之类的工具,以实现快速可靠的备份和还原。 |
| Snapshot-based recovery pool | Keep point-in-time snapshots of critical data or containers. snapshots can be auto-scheduled and are space-efficient. | 此功能可以从意外删除或配置错误中快速恢复。 |
避免常见的 ZFS 错误
ZFS 是一个强大的文件系统,但有几个常见的陷阱可能削弱其优势。在配置您的池之前,要牢记以下几点以获取更流畅的体验:
-
RAIDZ 内磁盘大小不匹配: ZFS 视 RAIDZ vdev 中所有磁盘为最小磁盘的大小。为了确保最高效,请使用每个 vdev 中大小相同的驱动器。
-
通过 WebGUI 扩展 RAIDZ vdev: 虽然 Unraid 7.1.x 及更新版本支持通过命令行扩展 RAIDZ,但此功能尚未在 WebGUI 中可用。目前,请通过 CLI 展开或通过 GUI 添加新 vdev。
-
ZFS disk vs. full zpool: A single ZFS-formatted disk in the Unraid array does not offer the redundancy or features of a dedicated ZFS pool. To leverage advanced functionality, use standalone pools.
-
未满足 RAM 的去重功能: 去重需要大量内存,禁用去重会对性能产生重大影响。只有在完全了解需求的情况下启用去重功能。
-
Vdev 冗余是局部的: ZFS 中的冗余是局部的,不是在整个池上共享。请确保规划 vdev 布局以实现所需的强度。
