前言
前面几篇主要记录家里的 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 中查看状态和容量:
bash123zpool status zpool list zfs list
3.2 创建数据集
我目前把应用、文档、备份文件和媒体下载分开保存,应用下面再按服务划分。下面将名称和路径统一换成示例:
text12345678910pool/ ├── 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 文件资源管理器中输入:
text1\\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 换成管理地址:
bash1234sudo 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 文件。文件内容是一行,替换下面的密码占位符:
text1qnap-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 客户端执行下面的命令,按提示输入模块密码:
bash1rsync --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 配置写任务和恢复操作。
系列阅读
参考
支付宝
微信