Truenas AIO 配置小记

提要

情况说明:

  • 双网口,带ECC,IPMI机器
  • 底层系统是TrueNAS-SCALE-23.10.1(核心用途是NAS,优先保障数据)
  • 需要OpenWRT虚拟机软路由(由于CPU虚拟化的缘故没能实现WIFI)
  • 防止数据带电跳变损坏
  • 音视频图片管理查看
  • 挂载下载
  • 需要本地机器环境私有远程访问(手机,平板,电脑,NAS等,不暴露公网但能远程访问)

硬件选配,组装,测试

要求:双网口(至少千兆);支持虚拟化;有ECC(长期不断电防止内存跳变);硬盘RAID5(防止数据跳变,添加数据冗余);SATA口充足;无解码需求;有IPMI远程管理;主板尺寸,功耗,价格尽可能低

配置单(均为二手)

配置 型号
CPU Intel® Octa Core Avoton C2750 Processor
主板 Asrock C2750D4I
内存 Samsung M391B1G73EB0-YK0 - 1600MT/s UDIMM 8G X4
显卡 ASPEED Graphic
硬盘 HC510 10T X3
ZhiTai SATA 500G
WD NGFF 500G

调整主板跳线

通电,BIOS,BMC,IPMI重置,更新最新固件,调整模式为UEFI+AHCI,去除PXE启动,跳过BMC自检等待,关闭开机LOGO(便于查看自检码),关闭板载阵列卡启动检查,开启SATA热插拔,开启IPMI远程串口调试

TrueNas

基础配置

安装

官网下载Truenas Scale镜像

下载链接:https://download.sys.truenas.net/TrueNAS-SCALE-Cobia/23.10.1/TrueNAS-SCALE-23.10.1.iso

检验文件SHA256后,放入已经安装了Ventoy的启动U盘,在NAS BIOS调整启动顺序,使得Truenas在UEFI安装即可

基础配置

使用Web UI配置管理员密码(如果无法访问Web UI,需要先在终端使用指令设置网络)

调整本地化设置

检查SATA口硬盘链接状态,开启SMART LONG检测任务

检查硬件状态(内存容量,ECC等)

网络配置

默认情况下,enp7s0是wan端,开启DHCP,enp8s0不使用,不设置即可。

但是由于有软路由需求,需要让TrueNAS变为lan端客户机,单网口处理不了,需要桥接,所以分别给wan端和lan端配置桥接,在桥接上分别设置IP。其中由于测试,wan端是192.168.1.0/24网段,lan端为了防止冲突,选择B类中的127.16.0.0/24(子网掩码24够用),其中192.168.1.1和172.16.0.1分别是wan端网关和OpenWRT地址,故设置如图:

其中br0(OpenWRT-WAN)是enp7s0的桥接,br1(OpenWRT-LAN)是enp8s0的桥接,br1可以开启DHCP,但为了固定IP采用的静态地址。

网关为了方便调试,先设置为192.168.1.1,后续调整OpenWRT完成后可以更改为172.16.0.1

主机名自便,域名为了方便可以自己取一个一级域名如:“SSS”

如果后续docker应用的拉取,或者系统更新有问题,自己有代理服务器的也可以手动添加一下HTTP代理

题外话:Truenas竟然能直接在Web端配置IPMI的网络设置

阵列配置

注意,系统盘无法作为可使用盘加入阵列,加入阵列前需要做Smart测试,视情况测试,如是快递运输等,需要选择运输测试

此次配置采用3个HC510组Raid5(RaidZ1),做数据储存和应用数据储存(确保文件数据不会自行跳变)

单500G SSD组条带,做应用程序和配置储存

Kubernetes配置

网络状况没有问题的情况下,开启应用,选择SSD作为存储池,初始化后即可

选择Discover Apps选择自己想要使用的App,此处先选用syncthing,photoprism,flame,webdav,具体配置如下

syncthing

基础配置(使用逻辑)

由于数据存放电脑上存在数据跳变(7*24通电的情况下,确实会遇到文件损坏,镜像文件校验失败或是音视频文件突然失效,显示格式损坏的问题。发生频率很少,但确实有),在有RAID5和ECC校验的NAS上几乎可以避免这种事情的发生,所以关键数据均需要以NAS作为标称

其中NAS只是关键文件的备份,不是用于给主机瘦身,不能将所有文件都放在NAS上而本地不留存,故需要在写文件时往NAS写,读文件时从本地读的功能,而且需要自动保持单方向同步(即NAS文件变动,本地自动更改,本地文件变动,远端不变动)。

在此之上,需要能支持手机访问(只拉取),电脑访问,而且需要授权,故采用Syncthing作为服务端。

在Truenas中配置容器Synthing,由于存储位置并不是在SSD上,需要手动添加一个存储位置指针,在Extra Host Path Volumes中添加自己的HDD阵列存储路径到你指定的Mount Path in Pod

比如将/mnt/HC510/MAIN目录挂载到容器内的/mnt/MAIN,这样syncthing就可以在/mnt/MAIN访问到HDD了

除此之外,整个系统是类似单用户多应用,故应用操作采用app用户身份,方便管理权限

服务器端

设置设备名,编辑文件夹默认值,将文件夹路径设置为/mnt/MAIN,版本控制关闭(已采用TrueNas快照,不需要版本管理),文件夹接受类型改为只发送,开启忽略文件权限(已有自定义ACL)

客户端

设置设备名,编辑文件夹默认值,版本控制关闭,文件夹类型改为仅接收,开启忽略文件权限

数据集权限配置(Linux POSIX ACL)

由于需要保证数据集能被单用户使用,不被其他用户使用,单同时需要app和系统用户(syncthing同步)使用,故修改对应数据集(/mnt/HC510/MAIN)的ACL权限如图

其中 kt属于kt,users,apps,CPPPB组,app属于apps,kt,CPPPB组

注意,数据集访问权限和SMB访问的控制权限不等同,smb权限的ACL对kt单用户给全权限即可,kt可以通过smb访问到app用户创建的文件和文件夹

photoprism 配置

基础配置(存储管理)

photoprism作为图片管理和自动分类,但并不能在应用中手动指定存放路径,所以不是通过Extra Host Path Volumes修改,而是将对应图片的父文件夹设置为Custom Host Path for Photo Prism Original Storage Volume

开启Enable Custom Host Path for Photo Prism Original Storage Volume后填入对应图片文件夹路径,比如/mnt/HC510/MAIN/IMAGE,注意权限问题,需要可读权限,并且不会影响Syncthing工作

flame 配置

安装后安装配置文件配置即可,如果想要整合,需要把TrueNAS的443和80改为其他端口,将80分配给flame

OpenWRT

虚拟化配置

首先确保CPU支持虚拟化,如果支持可以通过Truenas开启虚拟机

构建openwrt的方法,首先需要下载对应固件

OpenWRT download
firmware-selector

在固件选择页面(firmware-selector)选择Generic x86/64型号,下载COMBINED-EFI(EXT4)映像openwrt-23.05.2-x86-64-generic-ext4-combined-efi.img.gz

解压获得对应img文件openwrt-23.05.2-x86-64-generic-ext4-combined-efi.img,通过任何方便的方法弄到NAS上去(SMB,U盘,SCP或者直接在NAS上用wget下载),再准备一个linux的启动镜像(常规的均可,只是用来调整openwrt的根目录存储逻辑大小),此处采用ubuntu-21.04-live-server-amd64.iso

首先先添加Zvol给OpenWRT,在sSSD数据集添加OpenWRT zvol,此处分配了10G

将对应镜像写入zvol盘,在命令行执行

1
dd if=~/openwrt-23.05.2-x86-64-generic-ext4-combined-efi.img of=/dev/zvol/sSSD/OpenWRT

在Truenas中添加虚拟机,linux客机操作系统,名称OpenWRT,本地时钟,启动为UEFI,启用显示,虚拟处理器1,核心数2,线程4,CPU为宿主透传(Host Passthrough)模式,内存大小2GiB,zvol选择已有的OpenWRT

配置外接设备

双网卡NIC,添加一个CDROM指向ubuntu镜像,优先CDROM启动

空间拓展

默认Openwrt根目录的物理大小和逻辑大小也就100MB左右,需要调整,在OpenWRT中可以调整物理大小,但是逻辑问题不好修复,直接从外部修改就好修改的很多,所以找任意一个linux安装镜像进入维修模式(命令行)

1
2
3
4
5
6
parted #分区
print # 查看硬盘大小 Disk /dev/sda:10.7GB 查看100M左右的ext2根目录分区id,不是grub分区,不是boot分区
resizepart 2 #调整大小为10.7GB
quit #调整后退出即可
e2fsck -f /dev/sda2
resize2fs /dev/sda2

调整后关机即可(poweroff指令),删除CDROM设备,启动设备

OpenWRT 配置

启动OpenWRT后按回车即可进入命令行界面

初始状态为192.168.1.1的路由,自行调整wan口(192.168.1.90)和lan口(172.16.0.1)就可以从172段访问到OpenWRT的luci web ui了,如果系统从192段也访问得到UI,自行调整防火墙,或者添加防火墙端口映射等

opkg调整镜像源,此处使用清华源,具体替换方法可以参考镜像源说明

命令参考

1
2
3
cp /etc/opkg/distfeeds.conf /etc/opkg/distfeeds.conf.bak
sed -i 's_downloads.openwrt.org_mirrors.tuna.tsinghua.edu.cn/openwrt_' /etc/opkg/distfeeds.conf
opkg update

进入WEB UI进行个人所需设置即可,注意检查存储空间使用,查看是否调整成功

OpenVPN配置

为了能远程访问到路由中的NAS机器和其他PC(远程桌面)等,需要构建私有内网VPN网络

OpenVPN服务器配置

安装

具体各种需求的配置流程可以在网上查询到,本次以一个阿里云的debian 11服务器作为示例,个人所用命令与对应解释如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

su -- # 进入超管shell,执行此环境执行命令前请弄清楚含义
apt update && apt upgrade # 更新镜像和资源
apt install openvpn # 安装openvpn,参考debian的官方文档
cd /etc/openvpn && openvpn --genkey secret static.key

# S+C端的tls-auth的服务器静态key - /etc/openvpn/static.key

make-cadir /etc/openvpn/easy-rsa # 创建ca证书分发文件夹
cd /etc/openvpn/easy-rsa
./easyrsa init-pki # 初始化

# init-pki complete; you may now create a CA or requests.
# Your newly created PKI dir is: /etc/openvpn/easy-rsa/pki

./easyrsa build-ca # 构建ca证书,请牢记密码,后续签发客户端证书需要CA pass phrase

# CA pass phrase
# Your new CA certificate file for publishing is at:
# /etc/openvpn/easy-rsa/pki/ca.crt
# /etc/openvpn/easy-rsa/pki/private/ca.key

./easyrsa build-server-full server nopass # 构建服务器证书,nopass为无密码,如需要PEM pass密码请剔除nopass参数,后续启动服务都需要输入此密码

# PEM pass
# /etc/openvpn/easy-rsa/pki/issued/server.crt - cert
# /etc/openvpn/easy-rsa/pki/private/server.key - key

# 生成 DIFFIE-HELLMAN 参数,密钥交换用dh文件
./easyrsa gen-dh

# /etc/openvpn/easy-rsa/pki/dh.pem

mv /etc/openvpn/static.key /etc/openvpn/server/ta.key # 移动并重命名文件,方便服务器端使用

然后填写服务器配置文件/etc/openvpn/server.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
port 1194
proto udp
dev tun

ca /etc/openvpn/easy-rsa/pki/ca.crt
cert /etc/openvpn/easy-rsa/pki/issued/server.crt
key /etc/openvpn/easy-rsa/pki/private/server.key # keep secret
dh /etc/openvpn/easy-rsa/pki/dh.pem

topology subnet

client-config-dir /etc/openvpn/ccd # 告知服务器路由子网段
ifconfig-pool-persist /etc/openvpn/ipp.txt

server 10.9.8.0 255.255.255.0 # internal tun0 connection IP

push "route 172.16.0.0 255.255.255.0" # 推送给客户端路由
route 172.16.0.0 255.255.255.0 # 添加本地路由

user nobody
group nogroup

keepalive 10 120

tls-auth /etc/openvpn/server/ta.key 0
auth-nocache

cipher AES-256-CBC
data-ciphers AES-256-CBC

persist-key
persist-tun

status /var/log/openvpn/openvpn-status.log

verb 3 # verbose mode

client-to-client
explicit-exit-notify 1

在’/etc/openvpn/ccd/你分发给openwrt的证书名’文件中写入路由信息

1
iroute 172.16.0.0 255.255.255.0

配置好了以后重启服务即可

1
2
3
systemctl restart openvpn # 将所有openvpn的服务都重启
systemctl status openvpn@server.service # 查看系统服务状态
# 查看到状态active (running)即可

OpenVPN客户端配置

为了方便生成而避免每次手动合成,个人写的脚本和模板如下

模板:example.ovpn,请将其中的123.456.789.012改为自己的公网服务器IP地址,1194是默认端口,放在~/目录即可,即/root/example.ovpn

1
2
3
4
5
6
7
8
9
10
11
12
13
14
client
dev tun
proto udp
remote 123.456.789.012 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
auth-nocache
cipher AES-256-CBC
data-ciphers AES-256-CBC
mute-replay-warnings
verb 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 给客户端创建文件,需要example.ovpn文件
# ./easyrsa build-client-full clientname nopass # 无密码验证
# ./easyrsa build-client-full clientname # 有PEM密码验证
# =>
# /etc/openvpn/easy-rsa/pki/issued/clientname.crt
# /etc/openvpn/easy-rsa/pki/private/clientname.key

genclientovpn() # 生成并合并,生成ovpn文件,root用户在/etc/openvpn/easy-rsa/目录执行
{
mkdir -p ${1} 2>/dev/null
./easyrsa build-client-full ${2} nopass # 无密码验证,需要输入RA证书的密码
mkdir ${1}/${2} 2>/dev/null

cat ~/example.ovpn > ${1}/${2}/${2}.ovpn

echo '<tls-auth>' >> ${1}/${2}/${2}.ovpn
cat /etc/openvpn/server/ta.key >> ${1}/${2}/${2}.ovpn
echo '</tls-auth>' >> ${1}/${2}/${2}.ovpn
echo 'key-direction 1' >> ${1}/${2}/${2}.ovpn

echo '<ca>' >> ${1}/${2}/${2}.ovpn
cat /etc/openvpn/easy-rsa/pki/ca.crt >> ${1}/${2}/${2}.ovpn
echo '</ca>' >> ${1}/${2}/${2}.ovpn

echo '<cert>' >> ${1}/${2}/${2}.ovpn
cat /etc/openvpn/easy-rsa/pki/issued/${2}.crt >> ${1}/${2}/${2}.ovpn
echo '</cert>' >> ${1}/${2}/${2}.ovpn

echo '<key>' >> ${1}/${2}/${2}.ovpn
cat /etc/openvpn/easy-rsa/pki/private/${2}.key >> ${1}/${2}/${2}.ovpn
echo '</key>' >> ${1}/${2}/${2}.ovpn

chmod 755 ${1}/${2}/${2}.ovpn # 方便SCP下载 不安全,下载后确保删除
}
genclientovpn savepath clientname #执行此命令即可在savepath中保存clientname的ovpn文件,确保位置能被scp用户读取

# 从服务器下载这些文件到客户端后删除此文件夹对应的ovpn文件
rm -rf savepath # 一定需要执行

下载客户端OpenVPN客户端后导入,理论来说即可正常使用

OpenVPN & OpenWRT 配置

在openwrt上安装openvpn-ssl和对应的luci界面,刷新即可查看到VPN选项卡

直接手动选择ovpn配置文件上传,勾上启用后启动,等待10s左右应该就可以看到实例运行

相应的会在网络-接口中看到tun设备

生成一个属于openwrt的配置文件

将此设备添加到接口,方便后续防火墙和路由转发设置,设置静态地址即可,服务端开启了设备ip保存

相应,也可以在命令行或web端测试OpenVPN端ping

远端设备开启OpenVPN前后访问内网OpenWRT的状态如下

小结

虽然思路挺简单,但是实际配置过程并不是怎么愉快,许许多多方面都有问题,最大的方面是计算机网络,ChatGPT的建议也大多都有误,不是配置版本对不上,就是拿通解当特解,最后被逼无奈在各个地方tcpdump-ping-保存-下载-分析-调整配置,一遍又一遍重复这个操作,不断调整,碰壁不少才弄成的,有时候自己知道的太少,觉得计算机网络不像科学,更像是个玄学。XD

如有其他需求如ADblock,plex等可以自行添加调整

参考网站链接

无前后顺序