出于对数据保护的执念,我对 TrueNAS 中的数据采取了加盐加密云备份 + 移动硬盘冷备的措施。
一方面多地存储更安全,不可能我的硬盘、我的移动硬盘和云厂商的硬盘三者同时崩溃;
另一方面也最大限度的在不把 TrueNAS 暴露到公网的情况下,在外出时便捷的获取数据。经历过公司群晖仅暴露一个非常罕见的端口就被暴力攻击的事件以后,我是不敢把自己的 NAS 暴露出去的。我可以通过云服务商下载数据,然后解密;也可以直接在外出时带上我的移动硬盘。
而为了最大限度保持数据的兼容性,保证在任何电脑都可以读取,移动硬盘的文件格式我选择了 NTFS,既可以支持 TrueNAS、Winodws,也可以支持 MacOS(需软件)。当然最好的方式还是 exfat,MacOS 无需软件也可以支持,不过目前尚未找到 TrueNAS 支持 exfat 的方案。
下面是正文。
一、挂载 NTFS 移动硬盘
1. 第一次挂载前,需开启 fuse:
系统、微调、添加以下两项:
变量:fuse_load
值:YES
类型:LOADER
变量:fuse_enable
值:YES
类型:rc.conf
然后在命令行(或 SSH)中运行:
kldload fuse
2. 挂载 NTFS 硬盘:
首先在存储、磁盘中确认哪个是你的硬盘,一般可通过大小、型号(点击右侧列,勾选型号)来辨认,此外 TrueNAS 内部的硬盘名称一般是 ada 开头,你刚刚插入的硬盘一般也会是最后一个。比如我挂了一块希捷的 4T 硬盘,那么很明显是最后这个:
记住硬盘名称后,在命令行或 SSH 中运行:
# 请注意以下硬盘号、路径修改为你自己的设置 ls /dev/da1* # 查看硬盘分区 gpart show /dev/da1* # 查看各分区大小,确定要挂载的分区是哪个 mkdir /mnt/exhdd # 创建你要挂载到的目录 ntfs-3g /dev/da1p1 /mnt/exhdd
因为我们需要向移动硬盘复制数据,所以我直接挂载了读写格式,如果你只是想读取文件,可以加上 -o -ro 参数。
关于 ntfs-3g 命令的其他参数,可以运行 man ntfs-3g 来获取说明书。
注:因为我习惯插入硬盘后手动挂载,如果你想要进一步做到开机自动挂载(即 TrueNAS 重启后,可以自动挂载),可参考这篇文章:http://baodad.blogspot.com/2016/05/freenas-mount-and-share-ntfs-partition.html
二、复制数据 & 设置自动复制任务
复制数据建议使用 rsync 代替 cp 命令。rsync 提供了非常丰富的参数指令,详见 http://www.ruanyifeng.com/blog/2020/08/rsync.html。
这里我们采取最简单的 -a 递归指令(复制文件以及所有子文件夹的文件),以及 --exclude 排除指令。此外由于 Unix 系统的 cron 计划任务是没有执行结果的(出错时可查看 cron 日志或 mail 中的信息),因此我习惯把命令执行的结果通过 >> 指令输出到指定日志中,我建立了一个存放各个程序日志的数据集,这个看个人喜好。
如果你都能接受以上喜好,可以查看下文,直接复制我的命令。如果你不能接受,请自行修改命令。
1. 模拟复制数据,确保配置正确
# 如果没有需要排除的文件夹,可以直接删去 exclude 参数 # -n 参数用于模拟运行,并不会实际操作 # -v 参数用于列出所有将会被传输的文件,配合 -n 参数模拟运行,查看是否配置正确 rsync -a --exclude={'你要排除的文件或文件夹1', 'xxx2', 'xxx3'} /mnt/media/data /mnt/exhdd/data >> /mnt/media/logs/rsyncdata.log # 请确保目的路径、日志存储的路径已建立。如未建立,运行: mkdir -p /mnt/exhdd/data mkdir -p /mnt/media/logs
其中,第一个路径是源路径,第二个路径是目的路径。执行完毕后,查阅日志文件,查看列出的将会被传输的文件是否与你的预期相符。如果文件太多不方便查看,也可以直接拉到日志的最后,查看总大小,然后对比你源路径本身想要传输的总大小。确认一致就没有问题。比如:
注:如果你不需要计划任务,只需要执行一次复制,那么接下来,重复执行上方命令,并删去 -n、-v 参数即可,对你来说本文到此结束。
2. 设置计划任务
在设置计划任务之前,最好先手动执行一次 “去掉参数 -n、-v” 的命令,这是因为带上 -v 参数,会生成一份取决于你的文件数量的文件,这个日志通常来说会非常大,比如我有一万多份文件,则生成了一份 4.3MB 的文件。但 rsync 实际上每次只会传输和记录差异文件。所以,我们第一次执行用手动来做,并去掉 -v 参数,计划任务则带上-v 参数,这样以后每次自动执行,都只会记录新增的文件。即可以查看到详细日志,又可以避免日志过大。
rsync -a --exclude={'你要排除的文件或文件夹1', 'xxx2', 'xxx3'} /mnt/media/data /mnt/exhdd/data >> /mnt/media/logs/rsyncdata.log
手动执行完毕后,我们来设置计划任务:
我设置的计划是每天凌晨 3 点复制一次。如果你的文件更新的更频繁、对文件版本有更高要求,可以自行修改计划时间,比如更改为每小时运行。
我们的计划任务是基于 cron 运行的,关于 cron 的用法,可参考 https://www.cainiao.io/archives/505 这篇文章来操作。
【注1】TrueNAS 的计划任务和 crontab 中的文件不同。不建议在 TrueNAS 上使用命令行设置计划任务。
【注2】有一个坑请注意,TureNAS 计划任务中的命令,会把引号去除,导致实际命令执行有误。比如 --exclude 参数中,大括号内引号若被去除,则指定路径不会被排除。因此不能再使用大括号的方式来排除,只能一个个添加 --exclude。
打开 任务、计划任务、添加:
描述:自行添加,可以不填。建议填写为你能看懂的文字,便于日后管理。
命令:即上方模拟运行的命令中,删去 -v、-n 参数:
rsync -av --exclude 你要排除的文件或文件夹1 --exclude xxx2 --exclude xxx3 /mnt/media/data /mnt/exhdd/data >> /mnt/media/logs/rsyncdata.log
用户身份:root (如果你需要其他用户,那么可能需要修改权限,详见参考资料)
计划:Custom,然后按下图设置。你也可以稍微研究下这个界面,其实非常简单,可以很从容的设定自己想要的执行计划:
之后,取消勾选隐藏标准输出、隐藏标准错误,勾选已启用,点击保存即可。
3. 移除硬盘
需要移除掉硬盘,带出门的时候,运行以下命令之后拔掉即可:
umount /mnt/media/exhdd # 替换为你之前挂载的路径
参考资料
- http://www.ruanyifeng.com/blog/2020/08/rsync.html
- http://kflu.github.io/2018/02/03/2018-02-03-freebsd-ntfs/
- http://baodad.blogspot.com/2016/05/freenas-mount-and-share-ntfs-partition.html