OpenIndiana 或 illumos 发行版)配合 ZFS 搭建家用 NAS,是一个性能强大、数据安全性极高的方案。虽然原版 OpenSolaris 已停止开发,但其开源社区分支依然完美继承了 ZFS 和 Solaris 的优秀特性。
以下是一个基于 OpenIndiana(一个活跃的 illumos 发行版)的详细搭建指南。
核心优势(为什么选择这个方案)
原生 ZFS 支持: 无需额外驱动或补丁,提供完整、稳定的 ZFS 功能,如去重、压缩、快照、克隆等。
卓越的数据完整性: ZFS 的端到端校验和与自动修复功能,能有效防止静默数据损坏。
强大的存储池管理: 易于创建 RAID-Z(类似 RAID-5/6),扩展存储池(添加新 Vdev)。
集成 CIFS/SMB、NFS、iSCSI 服务: 完美兼容 Windows、macOS、Linux 客户端。
低功耗与稳定性: 系统非常稳定,适合 7x24 小时运行。
硬件准备
主机: 旧 PC、迷你主机或专门的服务器硬件。建议至少 4GB 内存(每 1TB 存储推荐 1GB 内存,如果启用去重则需要更多)。
硬盘: 至少两块相同容量的硬盘用于组建 RAID-Z1(允许坏一块盘)。推荐三块或以上组 RAID-Z2(允许坏两块盘)。使用企业级或 NAS 级硬盘以获得更好的稳定性。
启动设备: 一个单独的 SSD 或 U 盘(≥16GB)用于安装操作系统。
强烈建议将系统安装在独立的设备上,与数据盘分离。
网络: 千兆或万兆网卡。家用千兆网络是基本配置。
U 盘: 用于制作安装盘。
步骤一: 下载并安装 OpenIndiana
访问官网: 前往 OpenIndiana 官网 下载最新的稳定版 ISO 镜像(如
hipster 版本)。
制作安装 U 盘: 使用 Rufus(Windows)或
dd 命令(Linux/macOS)将 ISO 写入 U 盘。
# Linux/macOS 示例
sudo dd if=openindiana-hipster.iso of=/dev/rdisk2 bs=1m
(请务必确认 /dev/rdisk2 是你的 U 盘设备)
安装系统:
- 从 U 盘启动,选择图形化或文本安装。
- 关键步骤: 在磁盘分区时,选择你的小容量 SSD 或 U 盘作为系统盘。让数据硬盘保持未分配状态。
- 设置主机名、网络、root 密码和创建一个普通用户(例如
nasadmin)。
- 完成安装后重启。
步骤二: 初始化 ZFS 存储池
假设你有三块数据盘: c2t0d0, c2t1d0, c2t2d0(你的设备名称可能不同,使用 format 命令查看)。
登录: 使用 root 或具有 Primary Administrator 角色的用户登录。
创建 RAID-Z 存储池:
# 创建一个名为 tank 的池,使用 RAID-Z1(单奇偶校验)
zpool create tank raidz1 c2t0d0 c2t1d0 c2t2d0
# 或者使用 RAID-Z2(双奇偶校验,更安全)
# zpool create tank raidz2 c2t0d0 c2t1d0 c2t2d0
tank 是池的名称,可自定义。
- 创建后,池会自动挂载到
/tank。
查看池状态:
zpool status
zpool list
zfs list
步骤三: 配置 ZFS 数据集
数据集(Dataset)类似于文件夹,但拥有独立的属性。推荐为不同用途创建独立的数据集。
# 在 tank 池下创建几个数据集
zfs create tank/media
zfs create tank/documents
zfs create tank/backup
zfs create tank/timemachine # 为 macOS Time Machine 准备
# 设置数据集属性,例如启用压缩(节省空间,性能影响很小)
zfs set compression=lz4 tank/media
zfs set compression=lz4 tank/documents
# 为备份数据集禁用压缩(如果备份文件已压缩)
zfs set compression=off tank/backup
# 设置配额(可选)
zfs set quota=500G tank/documents
步骤四: 配置 SMB/CIFS 共享(兼容 Windows/macOS)
安装 SMB 服务:
pkg install samba # 使用 pkg 包管理器安装
svcadm enable smb/server # 启动服务
(注意: OpenIndiana 可能已集成,此步可能不需要)
配置 ZFS 数据集为 SMB 共享:
# 为数据集设置 SMB 共享属性
zfs set sharesmb=on tank/media
zfs set sharesmb=name=媒体 tank/media # 自定义共享名
zfs set sharesmb=on tank/documents
zfs set sharesmb=on tank/timemachine
配置用户认证:
# 为 SMB 共享创建系统用户并设置密码
useradd -m smbuser
passwd smbuser
# 将用户添加到 `staff` 组或创建新组
usermod -G staff smbuser
配置 Samba(如果需要高级设置):
- 编辑
/etc/samba/smb.conf。
- 可以设置工作组、访问控制等。对于基础共享,ZFS 属性通常已足够。
重启 SMB 服务:
svcadm restart smb/server
在客户端访问:
- 在 Windows 文件资源管理器中输入
\\你的NAS的IP地址。
- 在 macOS Finder 中按
Cmd+K,输入 smb://你的NAS的IP地址。
步骤五: 配置 NFS 共享(兼容 Linux/Unix)
启用 NFS 服务:
svcadm enable nfs/server
svcadm enable nfs/client
配置数据集为 NFS 共享:
zfs set sharenfs=on tank/media
# 设置更精细的访问控制,例如允许一个网段读写
zfs set sharenfs="rw=@192.168.1.0/24" tank/documents
在 Linux 客户端挂载:
sudo mount -t nfs NAS_IP:/tank/media /mnt/nas_media
或将其添加到 /etc/fstab 实现开机自动挂载。
步骤六: 其他重要配置
定时快照与自动快照服务:
OpenIndiana 自带
auto-snapshot 服务,可以方便地创建定时快照。
# 启用服务
svcadm enable auto-snapshot
# 为特定数据集设置自动快照策略(例如,每小时、每天、每周、每月保留若干份)
zfs set com.sun:auto-snapshot=true tank/media
zfs set com.sun:auto-snapshot:weekly=false tank/media # 关闭周快照
快照可以用于快速恢复误删文件。
监控与邮件报警:
- 安装
smartmontools 监控硬盘健康: pkg install smartmontools。
- 配置
zpool scrub 定期数据校验(例如每周一次),并添加到 crontab。
- 可以配置
mdadm 或 zpool status 的输出,通过 sendmail 或外部脚本(如 msmtp)发送报警邮件。
远程管理:
步骤七: 日常维护命令
# 检查池状态
zpool status -x
# 手动启动数据校验(建议每月一次)
zpool scrub tank
# 查看池的 I/O 和空间使用情况
zpool iostat -v
zfs list -t all
# 创建手动快照
zfs snapshot tank/media@`date +%Y%m%d_%H%M`
# 回滚到快照
zfs rollback tank/media@snapshot_name
# 克隆快照
zfs clone tank/media@snapshot_name tank/media_clone
# 添加新硬盘扩展池(添加一个新的 Vdev,例如 mirror)
zpool add tank mirror c2t3d0 c2t4d0
# 注意:RAID-Z 不能直接添加单块盘,只能添加同等或更大规模的新 Vdev。
注意事项
- 硬盘替换: 当一块硬盘故障时,
zpool status 会显示 DEGRADED。物理替换硬盘后,使用 zpool replace tank c2t0d0(假设 c2t0d0 故障)进行替换和重建。
- 备份: RAID/ZFS 不是备份! 务必对最关键的数据实施 3-2-1 备份策略(至少三份副本,两种不同介质,一份异地备份)。
- 升级: 使用
pkg update 和 pkg upgrade 保持系统更新。在更新前,建议对关键数据集创建手动快照。
这个方案搭建的 NAS,在数据安全性和功能上远超许多现成的 NAS 产品。虽然初期配置需要一些命令行操作,但一旦运行起来,其稳定性和可靠性会非常出色。祝你搭建顺利!