← 返回信息流
AI 资讯Hacker News·1 小时前

无需品牌NAS,教你用ZFS搭建最小存储服务器

原标题:How to Build a Minimal ZFS NAS Without Synology, QNAP, TrueNAS

速览

本文介绍如何在不使用Synology、QNAP、TrueNAS等商业NAS系统的情况下,利用ZFS文件系统构建一个最小化的NAS存储方案。通过选择合适的硬件和开源工具,用户可以实现低成本、高效率的自建存储。对于追求定制化和开放性的存储爱好者具有参考价值。

AI 深度解读

背景

在 NAS(网络附加存储)领域,Synology、QNAP、TrueNAS 等商业或开源方案提供了丰富的图形界面和企业级功能,但并非所有用户都需要这些“花哨”特性。本文作者从一个实际需求出发:只需要一个基础 NAS,能够通过 Samba 共享 ZFS 数据集,不需要任何 GUI 或复杂管理套件。TrueNAS 虽然功能全面,但作者认为它“大材小用”,且希望拥有一个完全可控、不依赖第三方系统的存储方案。此外,ZFS 文件系统的一个核心优势——配置完全存储在磁盘本身,主机 OS 损坏后只需重新安装 ZFS 工具并执行 zfs import 即可恢复数据——这个特性很少被明确解释,本文特意强调了这一点。

核心内容

1. ZFS 的“自包含”特性

ZFS 文件系统的所有配置信息(包括 RAID 级别、磁盘布局、压缩设置等)都直接存储在磁盘上,而非依赖主机操作系统。这意味着:

  • 如果主机 OS 被意外摧毁,只需将所有磁盘移到另一台机器,安装 ZFS 工具,运行 zfs import,数据即可恢复。
  • 磁盘本身就是一个完整的存储单元,不受主机更改影响。例如,一个由 6 块磁盘组成的 RAIDZ2(类似 RAID 6)阵列,迁移到新机器后依然能识别为 RAIDZ2。

2. 构建步骤

第一步:定位并组织磁盘

  • 使用 lsblk -d -o TRAN,NAME,TYPE,MODEL,SERIAL,SIZE 列出所有磁盘。
  • 通过 /dev/disk/by-id 下的符号链接获取磁盘的持久化 ID(例如 nvme-Samsung_SSD_990_PRO_4TB_XXXXX),避免使用 /dev/nvme0n1 等可能因插拔而变化的设备名。
  • 可选:创建 /etc/zfs/vdev_id.conf 文件,为磁盘设置别名(如 nvme0nvme1),方便后续创建池时使用。运行 udevadm trigger 使别名生效,别名会出现在 /dev/disk/by-vdev/ 下。
  • 注意:vdev_id.conf 仅用于方便创建池,并非 ZFS 必要配置。即使丢失,也不影响数据恢复。

第二步:创建 ZPOOL

  • 安装 OpenZFS(例如在 RHEL 9 上执行 dnf install zfs)。
  • 创建池时建议设置 ashift=12,对应 4KB 扇区大小。现代大容量 SSD(如 Samsung 990 Pro)实际扇区为 4KB 甚至 8KB,但默认向 OS 报告 512B。ashift=12 可显著提升性能,且一旦创建池后无法更改。
  • 示例命令:zpool create -o ashift=12 s16z1 raidz1 nvme0 nvme1 nvme2 nvme3(创建名为 s16z1 的 RAIDZ1 池,由 4 块 NVMe 组成)。
  • 验证:zpool status s16z1 显示池状态为 ONLINE;zdb | grep ashift 确认 ashift=12
  • 设置挂载点和压缩:zfs set mountpoint=/mnt/s16z1 s16z1zfs set compression=lz4 s16z1
  • 创建数据集:zfs create s16z1/docszfs create s16z1/backups。数据集不仅仅是文件夹,还可以独立管理快照、加密、复制等整个 ZFS 特性集。建议在顶层为不同大类别(如文档、备份)创建独立数据集。

第三步:通过网络共享磁盘

  • 使用 Samba 实现文件共享,Samba 与 ZFS 无关,只要数据集已挂载到主机即可。
  • 安装 Samba:apt install samba(或 dnf install samba)。
  • 创建 UNIX 用户(如 john)并设置密码:useradd -m johnpasswd john
  • 将 UNIX 用户关联到 Samba:smbpasswd -a john,设置 Samba 密码。远程客户端将使用 SYS\john 作为用户名访问共享。
  • 编辑 Samba 配置文件 /etc/samba/smb.conf,添加共享定义。例如:
    [docs]
    path = /mnt/s16z1/docs
    valid users = john
    read only = no
    browseable = yes
    
  • 重启 Samba 服务:systemctl restart smb
  • 针对 Apple Time Machine 备份,需要额外设置:在 [backups] 共享中添加 fruit:time machine = yes,并启用相关模块。具体配置可参考文档。

关键要点

  • ZFS 配置完全自包含:所有 RAID 布局、数据集属性等存储在磁盘本身上,主机 OS 无关紧要。迁移磁盘后只需 zfs import 即可恢复。
  • 避免使用动态设备名:创建池时务必使用 /dev/disk/by-id/ 下的持久化 ID,或通过 vdev_id.conf 设置别名,防止因磁盘顺序变化导致池无法导入。
  • ashift=12 是最佳实践:创建池时设置,可匹配现代 SSD 的 4KB 扇区,显著提升性能,且无法事后修改。
  • 数据集优于普通文件夹:ZFS 数据集支持独立快照、压缩、加密、复制等操作,适合按大类(如文档、备份)划分,避免将整个池作为单一共享。
  • Samba 共享与 ZFS 解耦:文件共享协议(Samba/NFS 等)与底层文件系统无关,只需确保数据集已挂载即可。
  • 最小化依赖:不需要 Synology、QNAP、TrueNAS 等全功能套件,只需 Linux + ZFS + Samba 即可实现稳定、可控的 NAS。
  • 安全与权限:为 Samba 创建独立的 UNIX 用户和 Samba 密码,可限制访问特定共享。

意义与影响

本文展示了一种“极简主义”的 NAS 构建思路,对于技术用户而言具有重要参考价值:

  • 降低复杂性:摒弃了 TrueNAS 等企业级软件的庞大功能集,直接使用 Linux 核心组件(ZFS + Samba),减少了系统开销和潜在故障点。
  • 增强数据可移植性:ZFS 的自包含特性意味着用户不必担心厂商锁定或主机硬件损坏。只要磁盘完好,数据可以在任何支持 ZFS 的 Linux 系统上恢复。
  • 性能优化意识:强调 ashift 设置的重要性,提醒用户注意现代 SSD 的实际扇区大小,避免因默认配置导致性能损失。
  • 可复现性:步骤清晰,从磁盘识别到创建池再到共享,全流程可操作。作者还鼓励读者根据自身需求调整(如 RAIDZ2 等)。
  • 对商业 NAS 的反思:虽然 Synology、QNAP 等提供了便捷的 GUI 和丰富的应用,但本文提醒用户:如果仅仅需要基础文件共享,过度依赖这些系统可能带来不必要的复杂性和依赖。掌握底层原理后,可以构建更透明、更可控的存储方案。

总之,这是一篇面向有一定 Linux 基础的用户的技术指南,既实践了 ZFS 的核心功能,又传递了“少即是多”的设计哲学。

查看原文 →neil.computer