无需品牌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文件,为磁盘设置别名(如nvme0、nvme1),方便后续创建池时使用。运行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 s16z1,zfs set compression=lz4 s16z1。 - 创建数据集:
zfs create s16z1/docs和zfs create s16z1/backups。数据集不仅仅是文件夹,还可以独立管理快照、加密、复制等整个 ZFS 特性集。建议在顶层为不同大类别(如文档、备份)创建独立数据集。
第三步:通过网络共享磁盘
- 使用 Samba 实现文件共享,Samba 与 ZFS 无关,只要数据集已挂载到主机即可。
- 安装 Samba:
apt install samba(或dnf install samba)。 - 创建 UNIX 用户(如
john)并设置密码:useradd -m john,passwd 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
