NAS 折腾日记(9)TrueNAS 部署与存储配置
创建于 2026-11-08
更新于 2026-11-08
科技
nas
truenas
docker
zfs
5183 字 · 约 18 分钟

前言

前面几篇主要记录家里的 QNAP 和 PVE,除此之外,我还在异地维护了一台 TrueNAS。主要是想有一套独立的存储,放开发数据,运行 Gitea 等开发应用,同时作为 Linux 开发机和其它设备交换文件的中转。

这台机器已经用了有一段时间,之前讨论过它上面的应用,却一直没有整理基础配置。最近更新 Immich 时又检查了一遍存储和挂载,正好把这一篇补上。先把系统、存储池、共享和应用目录说清楚,下一篇再写照片管理。

一、用途与硬件

家里的 QNAP 继续承担原有的文件和媒体存储,PVE 运行虚拟机、LXC 和相应服务,相关配置见 NAS 折腾日记(2)PVE 与 Docker 基础环境部署。TrueNAS 放在异地,有自己的硬盘和应用,不依赖家中的 NAS 才能工作。

平时开发用的文件可以先放到这台机器,再从其它设备访问;代码由 Gitea 管理。文件共享和应用数据都交给 TrueNAS 管,比较适合它现在的用途。它也可以接收家中 QNAP 发来的备份,后面通过 rsync 配置接收目录。

目前的硬件和安装方式如下:

项目 当前配置
CPU Intel N100,4 核
内存 32 GB
系统盘 16 GB 傲腾
数据盘 四块二手 12 TB 机械硬盘
存储布局 单个四盘 RAIDZ1
系统 TrueNAS 25.10.8,直接安装在物理机上

TrueNAS 直接安装在傲腾上,四块机械盘用来存数据,应用通过 TrueNAS Apps 运行。

二、系统安装

2.1 安装 TrueNAS

从 TrueNAS 安装说明进入下载页面,取得 Community Edition 安装镜像,制作启动 U 盘。在主机启动菜单中选择 U 盘,进入安装器后选择 Install/Upgrade,再选择准备好的系统盘。

安装会清空选中的磁盘。 确认型号和容量,四块数据盘不要选进去。可以提前记下硬盘对应关系,避免只凭设备顺序判断。

按引导设置管理员账号,完成后移除安装介质,从系统盘启动。控制台会显示管理地址,在同一网络的电脑上打开并登录。系统管理员用于管理 NAS,后面的共享文件另建普通用户。

2.2 网络配置

首次安装用单网口接入网络即可。登录 WebUI 后检查时区、默认网关和 DNS,再决定用静态地址还是在路由器中做 DHCP 地址保留。后续 Linux 挂载、应用访问都要使用这个地址,频繁变化会比较麻烦。

我的两块网卡组成了 bond0,使用 LACP,MTU 为 1500,地址由 DHCP 获取。

如果也要配置 LACP,需要交换机端对应端口支持并配置相同的聚合组,再在 TrueNAS Network 中创建 Link Aggregation,将地址配置到聚合接口。修改管理接口时,保留本地控制台访问,按界面提示测试并确认网络配置。只有一条网线或交换机不支持时,保持单网口就可以。

LACP 可以让多个连接分担链路,单次文件复制的速度通常仍受单条链路限制。

三、存储配置

3.1 创建存储池

在 Storage 中创建存储池,下面统一用 pool 作为示例名称。选择四块数据盘,放到同一个 Data VDEV,布局选择 RAIDZ1。提交前检查盘数、容量和磁盘标识,确认这些盘允许清空;已有池应走导入流程,不要重新创建。

我当前的池就是这个布局,四盘中有一盘容量用于校验,可容忍其中一块盘故障。四块 12 TB 硬盘扣除校验,相当于三块盘的容量,实际可用空间还要扣除文件系统开销,并注意 TB 与 TiB 的单位区别。

RAIDZ1 是现有配置,不能防止误删,也不替代备份。是否需要 RAIDZ2,应在建池前结合数据重要性和容量需求决定,创建步骤可参考 存储配置说明。

完成后,Storage 中应显示池为 ONLINE。也可以在 Shell 中查看状态和容量:

bash
1
2
3
zpool status zpool list zfs list

3.2 创建数据集

我目前把应用、文档、备份文件和媒体下载分开保存,应用下面再按服务划分。下面将名称和路径统一换成示例:

text
1
2
3
4
5
6
7
8
9
10
pool/ ├── apps/ │ ├── gitea/ │ └── immich/ │ ├── data/ │ ├── pgData/ │ └── mlcache/ ├── documents/ ├── backup/ └── media/

在 Datasets 中选中父级,点击 Add Dataset,分别创建需要的子数据集。它们可以独立设置权限、快照和配额,后面修改某个应用时也容易找到对应数据。数据集文档介绍了各预设的区别。

用于 Windows 共享的目录可以选 SMB 预设;需要同时通过 SMB、NFS 访问时考虑 Multiprotocol;应用数据使用 Apps 预设,再按该应用要求调整权限。数据库等应用还需要按镜像要求设置 UID/GID。

这里使用 lz4 压缩,recordsize 保持 128 KiB。新建数据集先保留默认值,有数据库等应用的具体要求时,再单独调整对应数据集。

四、文件共享

4.1 SMB 共享

先在 Credentials 的用户管理中创建普通共享用户,例如 nasuser,设置密码并启用 SMB/Samba Authentication。管理 WebUI 的账号和访问共享的账号可以分开,root 也不是 SMB 登录账号。

以 documents 为例,在数据集权限中为该用户或所属组授予需要的修改权限,再到 Shares 的 Windows (SMB) Shares 添加共享,路径选择 /mnt/pool/documents,共享名使用 documents。保存后启用 SMB 服务及开机启动。

在 Windows 文件资源管理器中输入:

text
1
\\YOUR_TRUENAS_IP\documents

使用刚创建的账号登录。先新建一个临时文件,再修改、读取和删除它,确认权限符合预期。如果只能看到目录却不能写入,检查数据集 ACL 和共享设置,不要直接给整个存储池开放所有权限。设置步骤见 共享配置说明。

4.2 NFS 挂载

我当前同时启用了 SMB 和 NFS。Linux 可以通过 NFS 挂载需要的目录,应用和工具使用本地路径访问,跨设备交换文件也方便一些。

在 Shares 中添加 NFS 共享,选择要导出的数据集路径,Allowed Hosts 或 Networks 限定为实际需要访问的客户端。数据集权限要与客户端使用的 UID/GID 或显式配置的用户映射对应。两边都有一个同名用户,不代表它们的数字 UID 相同。

下面是在 Debian/Ubuntu 客户端临时测试挂载的示例。将 YOUR_TRUENAS_IP 换成管理地址:

bash
1
2
3
4
sudo apt install nfs-common sudo mkdir -p /mnt/nas-documents sudo mount -t nfs YOUR_TRUENAS_IP:/mnt/pool/documents /mnt/nas-documents findmnt /mnt/nas-documents

随后用日常开发用户创建、读取并删除一个临时文件,不要只用 root 测试。确认读写正常后,再根据开发机的启动方式配置自动挂载。

若同一目录同时通过 SMB、NFS 写入,要统一考虑两种协议的权限,不能分别给一套互相冲突的规则。尤其已有文件来自其它设备时,先查看数字 UID/GID 和 ACL,再决定怎么映射。

五、应用部署

共享能正常读写后,再配置 Apps。首次进入时选择应用使用的存储池,这台机器的 Apps 与业务数据使用同一个机械盘池。TrueNAS 会管理自己的 ix-apps 数据集,业务目录另外建在 apps 下,不手动改内部目录。

目前这台 NAS 上有 Gitea、Immich 等应用。它们的数据需要留在容器外,安装时通过 Host Path 把对应数据集挂进去。这里要区分宿主机路径和容器内路径,例如:

数据 宿主机示例路径 Immich 容器内路径
照片和派生文件 /mnt/pool/apps/immich/data /data
数据库 /mnt/pool/apps/immich/pgData /var/lib/postgresql
模型 /mnt/pool/apps/immich/mlcache /mlcache

同样是文件,数据库、照片和模型的权限要求及备份方式不完全相同,所以分开准备。镜像更新会重建容器,Host Path 保留后,新容器仍可读取原来的数据。

应用商店提供的服务优先按安装表单配置。需要自定义 Compose 的应用也能单独部署,但要记录由谁管理、配置保存在哪里,避免 WebUI 和命令行各维护一份。我在 25.04 时就用过 Docker Compose,当前 25.10 的 Apps 也使用 Docker。查找教程时要留意版本,旧版 Kubernetes 应用和 FreeBSD Jail 的步骤不适用于这里。相关入口见 Apps 配置说明。

N100 和 32 GB 内存同时承担存储与应用,需要给各服务留出余量。比如后面 Immich 的中文模型加载曾超过 4 GiB 容器限制,配置应用时就不能只看 NAS 总内存。Gitea 的代码仓库、数据库和附件也要分别纳入备份,不能只保留容器镜像。

六、rsync 服务

除了 SMB 和 NFS,我还在 Apps 中部署了 rsyncd,用来接收 QNAP 的备份。这里先把 TrueNAS 这一端配好,QNAP 上的 HBS 3 只需要按地址、端口和模块名连接。

6.1 模块配置

在前面的 backup 数据集下创建 qnap 子数据集,示例路径为 /mnt/pool/backup/qnap。为备份准备一个本地用户,让它拥有这个目录的写入权限,并记下数字 UID/GID。rsync 模块使用这组 UID/GID 写文件。

进入 Apps,搜索并安装 Rsync Daemon。添加一个模块,下面使用统一示例值:

字段 设置
监听端口 30026
Module Name qnap-backup
Host Path /mnt/pool/backup/qnap
Access Mode Read/Write
UID / GID 前面准备的备份用户和组的数字 ID
Hosts Allow 实际连接到 TrueNAS 的 QNAP 来源地址

模块名是客户端访问的入口,后面 HBS 3 选择的是 qnap-backup,无需填写 NAS 上的完整目录路径。

6.2 账号认证

rsync 的认证账号可以与本地系统用户分开。这里使用 qnap-backup 作为认证名,密码单独设置;前面的 UID/GID 负责文件权限。

在 TrueNAS 上创建 /mnt/pool/apps/rsyncd-auth,其中放一个 rsyncd.secrets 文件。文件内容是一行,替换下面的密码占位符:

text
1
qnap-backup:REPLACE_WITH_A_STRONG_PASSWORD

当前 Rsync Daemon 应用以 root 启动,认证文件设为 root 所有、权限 600,所在目录仅允许 root 访问。这个文件不要放进备份模块或 SMB 共享中。

在应用的 Additional Storage 中,将 /mnt/pool/apps/rsyncd-auth 只读挂载到 /rsync-auth。随后在该模块的 Auxiliary Parameters 中逐项添加:

Parameter Value
auth users qnap-backup
secrets file /rsync-auth/rsyncd.secrets

保存并启动应用。使用内网或已经建立的 VPN 连接,rsync daemon 本身不提供传输加密,不把这个端口直接开放到公网。

6.3 连接测试

从允许访问的 Linux 客户端执行下面的命令,按提示输入模块密码:

bash
1
rsync --list-only rsync://qnap-backup@YOUR_TRUENAS_IP:30026/qnap-backup/

新目录为空时没有文件列表也正常,主要看有没有认证、模块不存在或权限错误。再用单独的测试文件确认写入,HBS 3 配置时也使用这组连接信息。

后续 QNAP 一篇会继续写 HBS 3 的任务创建、定时执行和恢复。同步时是否跟随源端删除文件,也在那里结合备份目的单独设置,避免把误删一起同步过来。

七、备份与维护

系统配好后,在管理界面导出 TrueNAS 配置,另存到其它设备。涉及密钥的导出内容应妥善保管。系统配置用于恢复用户、共享等设置,照片、仓库和数据库仍需要各自的数据备份,详见 TrueNAS 备份说明。

目前数据池有 Scrub 任务,用来检查数据校验和,应用升级前也会保留手工快照。周期快照和复制任务还没有配置,后面准备为开发文档和应用数据分别设置保留策略。

应用升级前先记录版本和挂载,导出数据库,必要时停止写入再做快照。恢复时用独立目录或测试实例验证,避免拿正在使用的数据直接试。

下一篇继续配置 Immich。QNAP 到 TrueNAS 的 HBS 3 备份另开一篇,接着前面的 rsync 配置写任务和恢复操作。

系列阅读

参考

手机扫码阅读
本文作者: 有次元袋的 tiger
本文链接: https://www.superheaoz.top/2026/11/53816/
版权声明: 本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 我的个人天地!