TrueNAS

安装过程 - 安装前必看

将TrueNAS的镜像上传到local(pve)存储上,然后配置相关虚拟机设置,直接开机安装,先不用管机械硬盘,一会儿再设置。

硬盘给8G就够了,不用给多;CPU给两个核即可;内存得8G起步,即8192MB;网络默认。

汉化在左侧的System->General,还得选择对应的时区才行,参考一下直通SATA控制器直通一下SATA控制器后,接下来给TrueNAS添加SATA控制器直通启动即可。

完成后打个快照,随后添加一块8G的SSD磁盘,作为系统数据集,否则TrueNAS会默认以第一个建立的池为系统数据集,导致大量读写,影响磁盘速度寿命。

清理NFS3 无效会话

由于NFSv3是无状态的,因此只要客户端连接后,TrueNAS就会记录该客户端的所有的信息,在PVE中,可能随时创建并销毁虚拟机的情况下,这里的NFS Session就会显得特别多,需要手动删除。

从源码中看TrueNAS Scale的数据位于/var/db/system,而NFSv3的记录是在nfs/rmtab中,所以完整路径就是:/var/db/system/nfs/rmtab.

直接编辑删除不必要的即可,全删也可以,在客户端连接时会自动再次记录。

如果支持最好使用NFSv4,尽量避免使用NFSv3.

NFSv4挂载

系统 - 服务中,编辑NFS共享,确保同时启用了NFSv3和NFSv4,域名可配可不配,取消勾选Kerberos认证选项:

800

配置完成后,挂载即可;挂载过程可见配置NFSv4挂载

ZFS加密数据集

加密数据集只需要在默认的基础上取消无加密即可,注意一定要使用密码,不要使用生成密钥:

600

使用生成密钥虽然也能加密数据集,但是不支持主动锁定和解锁。

使用密码可以主动解锁和锁定:

600

ZFS快照任务

注意划分的数据集就是一个挂载点,每个挂载点之间是相互独立的,如果懒可以在顶级的存储池设置快照任务,但是务必勾选递归,否则相当于一直在进行空快照任务:

600

最好还是对应每个数据集进行手动设置快照任务。

600

快照任务设定在每日22点对数据集进行快照。

建议勾选允许创建空快照,这样即使数据集在没有发生变更的时候也可以拍快照;方便按照时间段进行数据恢复回滚。

ZFS快照恢复

注意不是回滚,回滚简言之就是一键恢复支某个时间节点的数据集状态了,该操作没什么好记录的;这里的恢复是指,如果误删除某些文件需要恢复,但是又不想将整个数据集完整克隆出来时进行的操作。

在快照的具体页面里,TrueNAS不提供浏览快照文件的选项:

800

所选择的操作只有上面的克隆到新数据集回滚删除三个选项,如果我们只想恢复一个文件,使用UI显然是比较麻烦的。

最好的解决办法是通过.zfs文件系统的快照挂载点(只读)去恢复,例如我这里的Personal Data/Work的快照,则进入数据集的挂载点/mnt/Personal Data/Work,然后再进入.zfs

800

如图,这样就可以进入到某一次快照的具体文件系统了,然后找到误删除的文件,拷贝出来即可。

新版S.M.A.R.T服务唤醒休眠磁盘Bug解决

这个问题暂时不知道在哪个版本后出现的,不过在目前使用的版本确实有这个问题;具体表现为磁盘被三十分钟唤醒一次,根据/var/log/syslog可以发现实际是被smartd服务唤醒的,主要操作是获取温度。

深入源代码查看:

def get_smartd_config(disk):
    args = shlex.join(disk["smartctl_args"])
 
    critical = disk['smart_critical'] if disk['disk_critical'] is None else disk['disk_critical']
    difference = disk['smart_difference'] if disk['disk_difference'] is None else disk['disk_difference']
    informational = disk['smart_informational'] if disk['disk_informational'] is None else disk['disk_informational']
    config = f"{args} -n {disk['smart_powermode']} -W {difference}," \
             f"{informational},{critical}"
 
    config += " -m root -M exec /usr/local/libexec/smart_alert.py"
 
    if disk.get('smarttest_type'):
        config += f"\\\n-s {disk['smarttest_type']}/" + get_smartd_schedule(disk) + "\\\n"
 
    return config

这里发现取了smart_powermode的值,这个实际上是S.M.A.R.T服务设置里的Power Mode,从这里可以知道,这里实际上组装了smartctl的参数,-n就是Power Mode,查看具体的参数说明:

  -n MODE[,STATUS[,STATUS2]], --nocheck=MODE[,STATUS[,STATUS2]] (ATA, SCSI)
         No check if: never, sleep, standby, idle (see man page)

说的很明白了,这里的-n是在某种情况下不进行SMART检查,也就是说,将这里从Never设置Standby,那么磁盘休眠时就不会触发SMART检查了。

修改后再次查看日志,可以看到:

Jan 11 23:21:25 truenas smartd[2661]: Device: /dev/sdc [SAT], is in STANDBY mode, suspending checks

磁盘位于休眠状态,停止检查,说明这个解决方案是正确的。

在Windows 11中挂载SMB失败

用户名的问题,新版Win11不能直接输入用户名,用机器名\用户这样的用户名就可以了:

400

注意这里的NetBIOS Name是TRUENAS,那么机器名就是TRUENAS,用TRUENAS\evalexp登录即可。

无法使用apt

执行下面的命令后即可安装:

sudo install-dev-tools

注意:可能造成系统不稳定,除开安装qemu-guest-agent,不应该使用这个安装任何软件。这本身是通过打开开发者模式进行的,对于NAS的稳定性会造成一定影响。

清理数据集

注意如果没有按照规定安装系统,此时会出现一个问题——系统使用了机械磁盘作为数据存储位置也就是在根数据集下会有.system的数据集。

在UI中无法看到这个数据集的,需要自行删除。

譬如Personal Data/.system数据集,这个数据集即便迁移了也还会留在磁盘上,为了不膈应自己,决定将其删除:

sudo su root # 切换root权限
zfs list 
# 输出
NAME                                                                USED  AVAIL  REFER  MOUNTPOINT
Personal Data/.system                                              9.07M   718G   696K  legacy
Personal Data/.system/configs-ae32c386e13840b2bf9c0083275e7941       96K   718G    96K  legacy
Personal Data/.system/cores                                          96K  1024M    96K  legacy
Personal Data/.system/netdata-ae32c386e13840b2bf9c0083275e7941     7.89M   718G  7.89M  legacy
Personal Data/.system/nfs                                           128K   718G   128K  legacy
Personal Data/.system/samba4                                        192K   718G   192K  legacy

可以看到这里的.system下有非常多的数据集,接下来删除.system数据集,递归删除子集:

zfs destroy -r "Personal Data/.system"

此时再列列表,应该就看不到这个数据集了。

FnOS服务备份

在FnOS中的服务,考虑到对机械硬盘的频繁唤醒,将服务都架设到了FnOS的固态上,数据自然也都存在了FnOS的固态上了。

然而有些数据还是比较宝贵,还是及时备份会比较好。

添加SSH连接

首先导出FnOS的SSH Key和密钥,然后在TrueNAS中添加它:

进入用户凭据备份凭据SSH密钥对,将私钥粘贴进去:

300

注意公钥可填可不填,公钥可以从私钥自动生成。

进入用户凭据备份凭据SSH连接,新建一个连接:

400

注意这里填完信息后,点一下发现远程主机密钥,否则可能由于没有接受远程主机密钥导致失败。

单类型数据备份

单个Docker容器且数据以持久化到当前目录。

以Gitea为例子,进入数据保护同步任务,添加一个任务:

600

模式选择ssh,使用钥匙串,选择刚刚新建的连接,然后填入路径,通过拉取同步即可。

Gitea是sqlite3数据库,一起被备份了

其他的服务均可类似备份。

多类型数据备份

以Navidrome为例子,首先Navidrome的音乐被归类为Media,备份至Big Storage的Media Dataset,而Docker配置则应该备份至Personal Data的个人数据集中。

需要创建两个任务,第一个备份媒体文件:

600

第二个备份docker配置文件:

600

注意这里需要剔除掉媒体资源,也就Music文件夹,所以需要在附加参数中添加:--exclude "Music"

Nextcloud数据备份

由于Nextcloud提供WebDav协议的支持,所以同步起来非常方便。

进入用户凭据备份凭据云凭据,添加一个WebDav,类型选择Nextcloud:

500

注意地址后加:/remote.php/dav/files/USERNAME/;验证成功后即可。

回到数据保护,添加一个云同步任务:

500

模式选择同步、方向拉取;填好基础信息,然后看下面的高级:

300

勾选遵循符号连接、传输改为高带宽;后脚本填入:

#!/bin/sh
 
chown -R evalexp:evalexp "/mnt/Personal Data/Evalexp/Backup/TrueNAS Auto Backup/Nextcloud(Only File)"

注意OCIS要替换为chown -R evalexp:evalexp "/mnt/Personal Data/Evalexp/Backup/TrueNAS Auto Backup/OCIS(Only Files)"

之所以需要这个后脚本,是因为云同步任务不像同步任务一样可以选择本地用户,权限问题需要自行处理。

完成后点击立即开始即可开始从Nextcloud拉取文件同步了。

切换为OCIS的话,需遵从OCIS的webdav连接地址;当然也可以使用/dav/files/USERNAME/来进行同步,不过这样性能会稍微弱一丢丢,因为需要将username映射到Dav Space的UUID上,有额外的数据库查询浪费。