跳到主要内容

ZFS 存储

Special 谢谢

我们要感谢Ed Rawlings (Spaceinvader One) 的专业技术和指导,本ZFS存储文档是从他的教程和见解改编而成的。他的教程帮助了无数的Unraid用户掌握了高级存储技术。我们感谢他对 Unraid 社区的持续贡献。

ZFS brings advanced data integrity, flexible storage configurations, and high performance to your Unraid system. This guide explains ZFS core concepts and walks you through managing ZFS pools directly from the Unraid WebGUI. Whether you're setting up new ZFS storage or integrating an existing pool, you’ll find the steps and context you need to get started confidently.


为什么选择 ZFS?

ZFS 是一种现代文件系统和卷管理器,旨在保护您的数据、预防损坏并简化存储管理。

使用 ZFS,您可以获得:

  • 自动数据完整性检查和自我修复
  • 内置 RAID 支持(镜像、RAIDZ)
  • Snapshots 和克隆功能,用于轻松备份和回滚
  • 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.

Example

您可以在单个磁盘上使用 ZFS snapshots 和复制作为备份目标,或将快速 SSD ZFS 池复制到由 Unraid parity 保护的 ZFS 磁盘中的 array,以获得双重优势。

备注

混合ZFS-in-array方法对特定的备份或复制场景有帮助,但不能替代完整的ZFS池。ZFS磁盘在array中单独管理;您无法获得真正多磁盘ZFS池的组合性能、冗余或自愈功能。为获得完整ZFS功能,总是使用专用的ZFS池。

池、vdevs 和冗余

A ZFS pool (called a "zpool") is made up of one or more vdevs (virtual devices). Each vdev is a group of physical disks with its own redundancy level. ZFS writes data across vdevs, but each vdev is responsible for its fault tolerance.

注意

Redundancy is always per vdev. If any vdev fails, the entire pool fails, even if other vdevs are healthy. Plan your vdevs with care!


创建一个 ZFS 池

要使用 WebGUI 创建 ZFS 池:

  1. 停止array
  2. 点击添加池

  1. 为您的存储池选择一个名称(例如,raptor)。
  2. 设置槽位数量以匹配您想要在主数据 vdev(s) 中的磁盘数量。
备注

此初始插槽数仅适用于数据vdev。支持vdev(如日志或缓存驱动器)可以在创建池后单独添加。

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

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

  1. 选择您的分配配置文件 - 这会决定您的池的冗余和性能。
提示

在最终确定之前,检查关于分配配置文件和拓扑结构的章节以做出明智的选择。

  1. 如果需要,可以启用压缩(推荐用于大多数工作负载)。
  2. 点击完成,然后启动 array

将 ZFS 磁盘添加到阵列(混合设置)

您可以将独立的 ZFS 磁盘添加到您的 Unraid array(而不是 ZFS 池)中,以结合 ZFS 功能和 Unraid 的 parity 保护。

What 这使得
  • %%Parity Protection%%: ZFS 磁盘由 Unraid 的 array parity 保护,确保您的数据免受单个(或多个,取决于您的 parity drives)磁盘故障的影响。

  • 数据完整性:ZFS提供块级别的完整性检查(校验和)。虽然单个磁盘不能自行修复位腐败,但ZFS将检测腐败并提醒你,使你能够在静默数据丢失之前从备份中恢复。

  • ZFS 特性: 您可以在此磁盘上使用 ZFS snapshots 和复制,使其成为备份目标、特定数据集或需要将 ZFS 特性与传统 Unraid 存储结合的场景的理想选择。

ZFS 磁盘添加到 array:

  1. WebGUI 中转到 Main 标签。
  2. 停止array
  3. 点击阵列设备下的空槽。
  4. 选择您要添加的磁盘。

  1. 文件系统 下,选择 zfszfs-encrypted

  1. 点击 应用
  2. 启动 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 盘容错
How 选择
  • 选择 镜像 如果您想要最佳性能和易于、灵活的扩展,并且愿意使用更多磁盘空间来确保冗余。
  • 选择 RAIDZ1/2/3 如果您想最大化可用空间并存储大文件,但要记住扩展的灵活性较低,随机写性能较差。
  • 条带 只适用于非关键性、临时数据 - 如果任何磁盘故障,您将失去所有数据。

拓扑和扩展

您如何将磁盘分组到 vdevs 中会影响数据安全性和速度。

  • If you put all your disks into a large RAIDZ2 vdev, you can lose any two disks without losing data. However, expansion means adding another full vdev.
  • You'll gain better parallel performance if you split disks into multiple smaller RAIDZ1 vdevs. Be cautious; if two disks fail in the same vdev, you will lose the whole pool.
  • ZFS 将数据跨 vdev 条带化,而不是单个磁盘,因此更多的 vdev 能够提升处理很多小文件或随机 I/O 的工作负载性能。
  • 扩展一个 ZFS 容量池通常意味着添加一个新的相同布局的 vdev,而不仅仅是单个磁盘。
提示

Plan your pool’s layout to fit your needs and future growth. Unlike the Unraid array, you can’t add a single disk to an existing vdev using the WebGUI.


压缩和 RAM

ZFS提供的高级特性可以显著提高 Unraid 的存储效率和性能。两个常见的关注点是压缩和内存需求。

ZFS 压缩是透明的 - 它在后台运行,在数据到达磁盘之前缩小数据。

这提供了两个主要优点:

  • 减少磁盘使用量: 所需存储空间更少。
  • 提高性能: 写入和读取较少数据可以导致更快的操作,特别是在现代 CPU 上。

提示

为大多数 Unraid ZFS 池启用 ZFS 压缩。它安全、高效,几乎不影响兼容性或稳定性。

ZFS 内存神话 - 点击展开/折叠

你可能听过这种过时的建议:“ZFS 需要每 1 TB 存储空间 1 GB 的 RAM。”这不再适用于大多数用户。ZFS 利用 RAM 进行其自适应替换缓存(ARC),这能加速常访问的读取速度。

Unraid 会自动限制 ZFS 对系统 RAM 的合理使用(通常为总 RAM 的 1/8)。这使 ZFS 能够在不影响 Docker 容器,VMs 或 Unraid OS 的前提下良好运行。

信息

ZFS 随着可用内存的增加而具有良好的扩展性。更多的 RAM 可以提高缓存性能,但 ZFS 在适度硬件条件下也能可靠地运行。不要让旧有的建议阻止你在 Unraid 上使用 ZFS


导入其他系统创建的 ZFS 池

Unraid 可以轻松导入其他平台上创建的 ZFS 池。

如何导入 ZFS 池 - 点击展开/折叠
  1. 停止阵列: 确保您的 Unraid array 已停止。
  2. 添加新池: 点击 添加池
  3. 分配所有驱动器:
    • 数据槽位数量 设置为您的 ZFS 池中磁盘(包括数据 vdevs 和支持 vdevs)总数。
    • 将每个驱动器分配到正确的插槽。
    • 示例: 对于具有 4 个驱动器镜像 vdev 和 2 个驱动器 L2ARC vdev 的池,设置 6 个插槽并分配所有六个驱动器。
  4. 设置文件系统为 "Auto": 点击池名称(例如,raptor)并将 文件系统 设置为 Auto
  5. 完成并启动阵列: 点击 完成,然后启动 array
自动检测

Unraid 会自动检测和导入 ZFS 池。支持vdevs(如日志、缓存/L2ARC、特殊/去重)列在 WebGUI子池下。导入时无需单独添加子池。Unraid 会在所有必要的驱动器分配后自动与主数据磁盘一起导入它们。

导入后,强烈建议运行 scrub 来验证数据完整性。

  • 点击池名(例如 raptor)以打开其配置。
  • 池状态 下,检查状态并点击 Scrub


支持 vdev(子池)

Unraid 将 ZFS 支持vdevs称为子池。大多数用户需要这些,但高级用户可能会遇到它们:

支持的 vdev(子池)用途风险/注意事项
Special vdev存储元数据和小文件如果丢失,池将无法读取。
去重 vdev启用去重需要大量RAM;大多数用户来说风险大。除非有专门需要,否则请避免使用。
日志 vdev (SLOG)提高同步写入性能可选。只对特定负载有利。
缓存 vdev (L2ARC)提供基于 SSD 的读取缓存可选。可以提升大工作集的读取速度。
备用 vdevUnraid(截至 7.1.2 版)不支持
注意

除非有明确理解的需要,大多数 Unraid 用户应避免使用支持 vdevs/子池。它们是为专用工作负载设计的,如果使用不当可能会增加复杂性或风险。


导入时未分配重要的支持 vdev 驱动器

当你将一个 ZFS 池导入 Unraid 时,你需要将原始池中的每个驱动器,包括用于支持 vdev 的驱动器,分配到池槽中。一旦array 启动,Unraid 会自动识别每个驱动器的角色(数据、日志、缓存、特殊或去重)。你不需要手动指定每个驱动器的作用。

如果在导入期间忘记包含一个支持 vdev 的驱动器,结果将取决于 vdev 的功能:

vdev 类型导入时驱动器缺失结果
特殊 vdev 或去重 vdev池将无法导入或无法使用这些 vdev 存储关键元数据或去重表。没有它们,%%ZFS
日志 (SLOG) vdev池导入,但同步写入性能下降。池仍然可以访问,但你可能会注意到依赖于同步写入的工作负载性能较慢。
缓存 (L2ARC) vdev池导入,但读取缓存丢失池正常运行,但你会失去 L2ARC 缓存的性能提升。没有数据丢失。
提示

导入到 Unraid 时,始终分配原始 ZFS 池的每个物理驱动器,包括所有支持 vdev。这保证了顺畅的检测和集成。对于在 Unraid 中创建的新池,支持 vdevs 是可选的且通常对于大多数用户不需要。


扩展存储

ZFS 功能强大,但重要的是要了解其存储扩展是如何工作的—尤其是在规划未来增长时。

从历史上看,ZFS vdevs 有固定的宽度。你不能向现有的 RAIDZ vdev 添加磁盘来扩大它。

扩展池的方法包括:

  • **添加新 vdev:**通过添加另一个 vdev(如新镜像或 RAIDZ 组)来扩展你的池。这增加了容量,但你必须以与 vdev 配置相匹配的集合添加磁盘。
  • Replacing drives with larger ones: Swap each drive in a vdev, one at a time, for a larger disk. See drive replacement for detailed procedures. After all drives are replaced and the pool resolves, the vdev’s capacity increases.
  • 创建新池: 启动一个新的 ZFS 池可将不同的数据类型或工作负载组织并独立管理。
Planning 前进

在构建你的池之前,考虑你需要的存储量 - 不仅是今天,而且是将来。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
重要数据的 %%ZFSzfs%% 池为不可替代的文件(如照片、税务记录和 %%user share
每日备份或复制目标在 Unraid %%arrayarray%% 中使用一个 %%ZFS
Snapshot-based recovery poolKeep point-in-time snapshots of critical data or containers. snapshots can be auto-scheduled and are space-efficient.此功能可实现快速从意外删除或错误配置中恢复。

避免常见的 ZFS 错误

ZFS 是一个强大的文件系统,但有几个常见的陷阱可能会阻碍其带来的好处。在配置池之前,务必记住下面几点,以便获得更顺畅的体验:

  • Drive size mismatch in RAIDZ: ZFS treats all disks in a RAIDZ vdev as the size of the smallest one. To ensure the best efficiency, always use identically sized drives within each vdev.

  • **通过 WebGUI 扩展 RAIDZ vdevs:**尽管 Unraid 7.1.x 及更高版本支持通过命令行扩展 RAIDZ, 但这一功能在 WebGUI 中尚未可用。目前,请通过 CLI 扩展或通过 GUI 添加新的 vdevs。

  • 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.

  • **内存不足的去重:**去重需要大量内存,在没有足够内存的情况下启用去重会严重影响性能。仅在完全了解要求的情况下启用去重。

  • vdev 冗余是局部的:ZFS 中的冗余是局部适用于每个 vdev,并且不会在池之间共享。务必规划你的 vdev 布局,以达到所需的弹性水平。