如何构建一个无需Synology、QNAP、TrueNAS的简约ZFS NAS
摘要
本教程介绍如何在Debian Linux上使用OpenZFS和Samba构建一个基于ZFS的简约NAS,避免使用TrueNAS或Synology等企业级解决方案。
暂无内容
查看缓存全文
缓存时间: 2026/07/08 05:17
# 如何在不使用 Synology、QNAP、TrueNAS 的情况下搭建极简 ZFS NAS
来源:https://neil.computer/notes/how-to-setup-minimal-zfs-nas-without-truenas/
## 如何在不使用 Synology、QNAP、TrueNAS 的情况下搭建极简 ZFS NAS
发布于:2024\-08\-23
Oracle 的 ZFS 系统如果你只需要一个基础 NAS,并且不在乎图形界面功能,那么设置一个 ZFS 数据集并通过 Samba 共享到网络其实出奇简单。
#### 范围:
| 项目 | 详情 |
|------|------|
| 范围与需求 | |
| RAID 级别 | RAIDZ1(1 块磁盘冗余) |
| 操作系统 | Debian 12 Bookworm |
| 加密 | 无 |
| ZFS 实现 | OpenZFS, zfs\-2\.1\.1 |
| CPU | 4 核,便宜的 Xeon 服务器 CPU |
| 内存 | ECC RDIMM 16 GB |
| 存储 | 4×4TB NVMe SSD |
| 备份 | 未涉及,请使用 [ZFS Backup Scheduler](https://github.com/wyager/zfs-backup?ref=neil.computer) |
| 技能要求 | 基本熟悉 Linux |
| 技能水平 | 入门/简单 |
我写这篇文章是为了记录给自己以后看,你也可以根据自己的需求调整。TrueNAS 的问题在于它是一个功能全面、号称企业级的软件套件。虽然它可能设置起来很简单(我从未试过),但我根本不需要它提供的那些花哨功能。这是我所需要的和它所提供的之间的不匹配;并非 TrueNAS 本身有什么问题。另外,对于你完全了解的系统,并且无需依赖另一个东西,这本身也是一种优势。
## ZFS 最好的功能,却从未被解释或写在任何地方
ZFS 文件系统是自包含的。如果你的操作系统突然被摧毁,只需将所有磁盘拿到另一台机器上,或者安装一个新操作系统,安装 `zfs`,运行 `zfs import`,就能取回你的数据。这种自由度被低估了,也没有被很好地理解。而且它在任何地方都没有被解释过。
值得强调:关于 ZFS 的所有配置/细节都存储在磁盘本身上。如果你用 6 块磁盘设置了一个 RAIDZ2(RAID 6),那么它们是自包含的。将它们移动到另一台安装了 `zfs` 工具的机器上,只需运行 `zfs import`。砰,它们就会以 RAIDZ2 的形式出现。这是一个惊人的功能,无论主机操作系统、机器等发生什么情况;只要磁盘没有损坏,你的数据就是安全的。
## 步骤 1. 定位并整理磁盘
使用 `lsblk -d -o TRAN,NAME,TYPE,MODEL,SERIAL,SIZE` 命令列出 Linux 机器上的所有磁盘。
```bash
[root@sys ~]# lsblk -d -o TRAN,NAME,TYPE,MODEL,SERIAL,SIZE
TRAN NAME TYPE MODEL SERIAL SIZE
sda disk Virtual disk 40G
nvme nvme5n1 disk Samsung SSD 990 PRO 4TB XXXXXXXXXXXXXXX 3.6T
nvme nvme2n1 disk Samsung SSD 990 PRO 4TB XXXXXXXXXXXXXXX 3.6T
nvme nvme6n1 disk Samsung SSD 990 PRO 4TB XXXXXXXXXXXXXXX 3.6T
nvme nvme3n1 disk Samsung SSD 990 PRO 4TB XXXXXXXXXXXXXXX 3.6T
```
这些是三星的全新 NVMe 驱动器,因此应该是完全未分配的。
这些磁盘也映射到了 ID,运行 `ls -lh /dev/disk/by-id`:
```bash
[root@sys ~]# ls -lh /dev/disk/by-id
total 0
lrwxrwxrwx. 1 root root 10 May 10 09:34 dm-name-rhel-root -> ../../dm-0
lrwxrwxrwx. 1 root root 10 May 10 09:34 dm-name-rhel-swap -> ../../dm-1
lrwxrwxrwx. 1 root root 10 May 10 09:34 lvm-pv-uuid-DGBpev-Na0C-tY20-YY6E-tpL3-epNA-8Ts3Y0 -> ../../sda3
lrwxrwxrwx. 1 root root 13 May 10 09:34 nvme-Samsung_SSD_990_PRO_4TB_XXXXXXXXXXXXXXX -> ../../nvme2n1
lrwxrwxrwx. 1 root root 13 May 10 09:34 nvme-Samsung_SSD_990_PRO_4TB_XXXXXXXXXXXXXXX -> ../../nvme5n1
lrwxrwxrwx. 1 root root 13 May 10 09:34 nvme-Samsung_SSD_990_PRO_4TB_XXXXXXXXXXXXXXX -> ../../nvme3n1
lrwxrwxrwx. 1 root root 13 May 10 09:34 nvme-Samsung_SSD_990_PRO_4TB_XXXXXXXXXXXXXXX -> ../../nvme6n1
```
注意,它们通过符号链接指向 `/dev/` 中的磁盘名称。
我们可以创建一个 `/etc/zfs/vdev_id.conf` 文件,将这些 ID 映射为别名:
```bash
[root@sys ~]# vim /etc/zfs/vdev_id.conf
# 在 vdev_id.conf 文件中添加以下行
alias nvme0 /dev/disk/by-id/nvme-Samsung_SSD_990_PRO_4TB_XXXXXXXXXXXXXXX
alias nvme1 /dev/disk/by-id/nvme-Samsung_SSD_990_PRO_4TB_XXXXXXXXXXXXXXX
alias nvme2 /dev/disk/by-id/nvme-Samsung_SSD_990_PRO_4TB_XXXXXXXXXXXXXXX
alias nvme3 /dev/disk/by-id/nvme-Samsung_SSD_990_PRO_4TB_XXXXXXXXXXXXXXX
```
运行 `udevadm trigger` 来设置别名(或者可以重启机器)。我们可以通过运行 `ls -lh /dev/disk/by-vdev` 来验证别名是否已映射:
```bash
lrwxrwxrwx. 1 root root 13 May 10 10:28 nvme0 -> ../../nvme2n1
lrwxrwxrwx. 1 root root 13 May 10 10:28 nvme1 -> ../../nvme5n1
lrwxrwxrwx. 1 root root 13 May 10 10:28 nvme2 -> ../../nvme3n1
lrwxrwxrwx. 1 root root 13 May 10 10:28 nvme3 -> ../../nvme6n1
```
[别名映射](https://openzfs.github.io/openzfs-docs/man/v2.2/5/vdev_id.conf.5.html?ref=neil.computer)完全是可选的;在创建 zpool 时,你可以选择使用完整 ID `/dev/disk/by-id/nvme-eui.002538414143c248`,就像我们将在下一节中做的那样。使用别名会很方便。但是,请不要使用 `/dev/nvme1, /dev/nvme2, ...`,因为顺序无法保证,特别是当你将新驱动器挂载到系统时。创建 `vdev_id.conf` 可以确保驱动器的序列号与别名绑定。
还记得我们之前讨论过主机操作系统上不需要配置吗?`/etc/zfs/vdev_id.conf` 并非必需,仅在创建 zpool 时为了方便而使用。如果你的操作系统被摧毁,并且丢失了 `vdev_id.conf`,那完全没关系。
## 步骤 2. 创建 ZPOOL
在本教程中,我将创建一个 RAIDZ1(RAID 5)的 zpool。这意味着有 1 块磁盘冗余,以防故障。如果你想增加冗余,RAIDZ2(RAID 6)当然会更加可靠。
首先,我们需要在 Linux 机器上安装 ZFS。请参考 [OpenZFS 安装文档](https://openzfs.github.io/openzfs-docs/Getting%20Started/index.html?ref=neil.computer)。通常非常简单,比如在我的 RHEL 9 上,运行 `dnf install zfs`。
我建议在创建 zpool 时设置 `ashift=12` 选项,因为这是你最后的机会。大多数磁盘由于向后兼容的原因向操作系统报告 512B 扇区大小,但像 Samsung 990 Pro 这样的大磁盘的扇区大小为 4KB 甚至 8KB。`ashift=12` 表示扇区大小为 4KB,这将大幅提升性能。
```bash
[root@sys ~]# ls /dev/disk/by-vdev
nvme0 nvme1 nvme2 nvme3
[root@sys ~]# zpool create -o ashift=12 s16z1 raidz1 nvme0 nvme1 nvme2 nvme3
[root@sys ~]# zpool status s16z1
pool: s16z1
state: ONLINE
config:
NAME STATE READ WRITE CKSUM
s16z1 ONLINE 0 0 0
raidz1-0 ONLINE 0 0 0
nvme0 ONLINE 0 0 0
nvme1 ONLINE 0 0 0
nvme2 ONLINE 0 0 0
nvme3 ONLINE 0 0 0
errors: No known data errors
[root@sys ~]#
```
完美!我选择 `s16z1` 作为名称,因为它描述了存储大小和 RAID 类型。大多数教程会使用 `tank`,因为它和 `pool` 相关。有点俗气,我拒绝这样做。
我们还没完成。`zpool` 是磁盘抽象层,而 `zfs` 是文件系统。当我们运行 `zpool create` 时,它会同时创建一个 `zfs` 文件系统。
通过运行 `zfs get all s16z1` 列出 zfs 文件系统的所有属性。要检查我们的 zpool 是否正确配置了 `ashift=12`,可以运行:
```bash
[root@sys ~]# zdb | grep ashift
ashift: 12
```
在共享系统之前,我们可以(可选地)配置压缩以及默认挂载点。
```bash
[root@sys ~]# zfs set mountpoint=/mnt/s16z1 s16z1
[root@sys ~]# zfs set compression=lz4 s16z1
```
接下来,在 `s16z1` 根数据集下创建几个 ZFS 数据集。我们将在下一节通过 Samba 共享它们。
```bash
[root@sys ~]# zfs create s16z1/docs
[root@sys ~]# zfs create s16z1/backups
```
`docs` 用于文档,`backups` 用于 Time Machine 备份。你可以根据需要创建任意数量的数据集。尽量让它们保持顶层。如果你想知道常规文件系统文件夹和数据集之间有什么区别——ZFS 数据集远不止是一个文件夹。你可以管理数据集的无数属性,加密它,发送和复制数据集,创建快照等等——本质上就是 ZFS 的完整功能集。因此,为你的文件大类别创建单独的数据集是个好主意。`docs` 或 `backups` 作为数据集的抽象级别很不错。如果你只想将 `docs` 发送到另一台远程服务器作为备份,你可以在不发送整个 `s16z1` 根数据集的情况下做到。
我们将讨论如何将 `s16z1/docs` 作为通用共享,以及通过共享带有特殊属性的 `s16z1/backups` 来创建合适的 Time Machine 存储(用于 Apple 系统)。
我们将为此使用 Samba,共享文件系统的类型与 ZFS 正交。只要它挂载在主机系统上,ZFS 并不关心。
安装 Samba:
```bash
[root@sys ~]# apt install samba
```
创建一个专门用于 Samba 的 UNIX 用户,我们称之为 `john`:
```bash
[root@sys ~]# useradd -m john
```
并为 `john` 创建 UNIX 密码:
```bash
[root@sys ~]# passwd john
```
接下来,通过为 `john` 创建 Samba 密码,将 UNIX 用户 `john` 关联到 Samba。连接共享的主机将使用此密码作为 `SYS\john`。
```bash
[root@sys ~]# smbpasswd -a john
```
`john` 也会被添加到 Samba 用户组。你可以通过运行以下命令验证 `john` 是否为 SMB 用户:
```bash
[root@sys ~]# pdbedit -L -v john
Unix username: john
NT username:
Account Flags: [U ]
User SID: S-1-5-21-880039843-1994218806-4034623300-1001
Primary Group SID: S-1-5-21-880039843-1994218806-4034623300-513
Full Name: john
Home Directory: \\SYS\john
HomeDir Drive:
Logon Script:
Profile Path: \\SYS\john\profile
Domain: SYS
Account desc:
Workstations:
Munged dial:
Logon time: 0
Logoff time: Wed, 06 Feb 2036 08:06:39 MST
Kickoff time: Wed, 06 Feb 2036 08:06:39 MST
Password last set: Fri, 23 Aug 2024 23:46:08 MST
Password can change: Fri, 23 Aug 2024 23:46:08 MST
Password must change: never
Last bad password : 0
Bad password count : 0
Logon hours : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
```
要删除 `john` SMB 用户,使用 `pdbedit -x -u john`。
现在,UNIX 用户和 Samba 用户都设置好了,配置 Samba 服务就非常简单了。
编辑 `/etc/samba/smb.conf`(删除所有内容并替换为以下内容):
```ini
[docs]
path = /mnt/s16z1/docs
browseable = yes
read only = no
guest ok = no
valid users = john
create mask = 0755
[backups]
path = /mnt/s16z1/backups
read only = no
guest ok = no
inherit acls = yes
spotlight = yes
fruit:aapl = yes
fruit:time machine = yes
vfs objects = catia fruit streams_xattr
valid users = john
```
在 macOS 上通过 Finder 使用 `cmd+K` 挂载测试,使用以下 URL 格式:`smb://10.0.0.6/docs` 和 `smb://10.0.0.6/backups`,其中 `10.0.0.6` 是共享 SMB 共享的服务器 IP。
要在 Debian 系统或类似系统上测试,安装 `apt install smbclient` 并运行:
```bash
[root@sys ~]# smbclient -U john //10.0.0.6/docs -c 'ls'
```
挂载 `smb://10.0.0.6/backups`,它将在 macOS 上显示为 Time Machine 共享。挂载后,通过将共享添加到 macOS > 设置 > 通用 > Time Machine 来启动 Time Machine 备份。
目前就这些。我计划再写一篇文章扩展讲解加密和非常强大的 ZFS 数据集复制功能。
封面图感谢 Oracle ZFS 系统。天哪,它太美了:https://docs.oracle.com/cd/E78901_01/html/E78910/gqtmb.html?ref=neil.computer
相似文章
我的新家庭服务器软件选择
一篇个人博客文章,详细描述了作者为新家庭服务器选择操作系统和服务管理软件的经历,比较了Synology、TrueNAS、Debian以及使用Runit的Void Linux。
Frood:一个基于Alpine Initramfs的NAS
描述了一种完全从Alpine Linux initramfs运行NAS的方法,支持干净启动、A/B部署、声明式git跟踪配置,并相比Alpine的无盘模式降低了复杂性。
构建企业级家庭实验室(五):Synology Btrfs 陷阱
家庭实验室系列第五篇,提醒在企业级存储环境中使用 Synology Btrfs 实现时可能踩到的坑。
Show HN:ZeroFS – 一个用于S3的日志结构文件系统
ZeroFS是一个日志结构文件系统,可将兼容S3的存储桶作为POSIX文件系统通过NFS和9P提供,或作为原始块设备,并具备压缩、加密和本地缓存以加快读取速度。它通过了广泛的POSIX和压力测试套件,包括内核构建和Jepsen故障转移测试。
Ubiquiti: 企业级 NAS,基于 ZFS 构建
Ubiquiti 推出 ENAS,一款基于 ZFS 的企业级 NAS,采用 Arm Neoverse N2 处理器,提供高达 1PB 存储,通过 UniFi 实现免许可证管理,并支持 iSCSI 和集中备份编排。