TrueNAS SCALE NVMe of (nvmetcli)教程
🧇

TrueNAS SCALE NVMe of (nvmetcli)教程

 

前言

TrueNAS SCALE作为一个存储系统,在NVMe SSD价格越来越香,其实一直缺少高性能的共享存储方式。
对于自带的NFS来说,开启RDMA非常简单只需要给出rdma端口以及加载模块,配置十分简单。SMB direct的话SCALE的内核不支持,所以想要改起来就非常麻烦。
块存储在2025年只有ISCSI对于高负载的应用来说,显得就不够了,无论是tcp还是rdma的NVMeOF在各种方面都优于ISCSI,而且能显著降低CPU的利用率。
其实SCALE的企业版已经支持了NVMeOF
notion image
来源:
所以配置NVMeOf迫在眉睫(不是。

入门(

对于TrueNAS SCALE,因为更新会丢失命令行所有的内容,所以使用nvmetcli 保存配置文件,在更新后只需要加载python环境,pip安装依赖,执行nvmetcli restore config.json 即可恢复nvmeof。

具体操作

配置环境

其实已经有项目写好了脚本,我们就不重复造轮子,简单论述使用方法
 
#切换root su - root #输入密码 curl -o /mnt/池名字/你放脚本/数据集的名字/scale-nvmet-start.sh https://raw.githubusercontent.com/democratic-csi/democratic-csi/refs/heads/master/contrib/scale-nvmet-start.sh
作为例子我这里的脚本放在CPool/myscripts ,后面都要替换我这里的路径
#切换root su - root #输入密码 curl -o /mnt/CPool/myscripts/scale-nvmet-start.sh https://raw.githubusercontent.com/democratic-csi/democratic-csi/refs/heads/master/contrib/scale-nvmet-start.sh
然后给予执行权限
chmod +x /mnt/CPool/myscripts/scale-nvmet-start.sh
需要注意的是这个脚本默认安装最新版本的依赖configshell_fb ,这会导致报错,需要指定版本1.1.30
也就是修改这个脚本pip install configshell_fbpip install configshell_fb==1.1.30
然后执行脚本
bash /mnt/CPool/myscripts/scale-nvmet-start.sh
如果你网络没问题,那么这个脚本会帮你完成一切的配置
 

nvmetctl配置NVMeOF

执行下面的命令进入nvmetcli命令行,注意替换CPool/myscripts
/mnt/CPool/myscripts/nvmet-venv/bin/python /root/.local/bin/nvmetcli
首先要配置一个subsystemsnamespaces
subsystems/ create nqn=你爱叫什么叫什么 #然后爱叫,我这里叫testof #创建namespaces subsystems/testof/namespaces create nsid=1
然后你可以输入ls查看现在的配置
/> ls o- / ......................................................................................................................... [...] o- hosts ................................................................................................................... [...] o- ports ................................................................................................................... [...] o- subsystems .............................................................................................................. [...] o- testof .............................................................. [version=1.3, allow_any=0, serial=2cb2b6bc4b46653b7680] o- allowed_hosts ....................................................................................................... [...] o- namespaces .......................................................................................................... [...] o- 1 ........................................... [path=(null), uuid=d88dc614-c22d-4942-8a97-5108f210aa1f, grpid=1, disabled]
这里就要修改这个namespaces的path到你的zvol路径,我这里在创建了一个在 ttt池config数据集下的叫nvme-zvol的zvol,那么路径就是固定的/dev/zvol+前面的那些,如下
/subsystems/testof/namespaces/1 set device path=/dev/zvol/ttt/config/nvme-zvol #同时enable这个namespaces /subsystems/testof/namespaces/1 enable #给testof这个subsystems配置允许任何链接用于测试 /subsystems/testof/ set attr allow_any_host=1
到这里目标配置完毕了。
还要配置一下本机port
#创建一个port /ports create portid=1 #配置addr和param,替换下面ip到你的本机ip /ports/1/ set addr adrfam=ipv4 traddr=192.168.2.140 trtype=rdma trsvcid=4420 /ports/1/ set param inline_data_size=4096 #启动subsystem,没有任何报错就是成功了。如果有报错,看内核日志能看到详细错误 /ports/1/subsystems create testof
最后ls一下
/> ls o- / .................................................................................... [...] o- hosts .............................................................................. [...] o- ports .............................................................................. [...] | o- 1 ............... [trtype=rdma, traddr=192.168.2.140, trsvcid=4420, inline_data_size=4096] | o- ana_groups ..................................................................... [...] | | o- 1 ................................................................ [state=optimized] | o- referrals ...................................................................... [...] | o- subsystems ..................................................................... [...] | o- testof .................................................................. [...] o- subsystems ......................................................................... [...] o- testof .................... [version=1.3, allow_any=1, serial=2cb2b6bc4b46653b7680] o- allowed_hosts .................................................................. [...] o- namespaces ..................................................................... [...] o- 1 [path=/dev/zvol/ttt/config/nvme-zvol, uuid=d88dc614-c22d-4942-8a97-5108f210aa1f, grpid=1, enabled]
看一下所有的配置,其实直接按照这个配置去配就行了。
我们最后需要保存一下配置为nvmet-config-loaded.json ,记住一定是这个,因为脚本会自动加载这个命名的配置,并且放在脚本的同目录
saveconfig nvmet-config-loaded.json
然后加载配置,此时就创建完成了
/mnt/CPool/myscripts/nvmet-venv/bin/python /root/.local/bin/nvmetcli restore nvmet-config-loaded.json
 

加入自启动

一定要把下面命令加入开机启动,这样就能自动安装环境并且加载配置
bash /mnt/CPool/myscripts/scale-nvmet-start.sh
 

测试机器

这里就简述了,根据你自己环境
配置环境
apt update && apt -y install nvme-cli #tcp modprobe nvme_tcp && echo "nvme_tcp" >> /etc/modules-load.d/nvme_tcp.conf #rmda modprobe nvme_rdma && echo "nvme_rdma" >> /etc/modules-load.d/nvme_tcp.conf
查找
nvme discover -t rdma -a 192.168.2.140 -s 4420
链接
nvme connect -t rdma -n 刚才那个爱叫什么叫什么的 -a 192.168.2.140 -s 4420
查看
nvme list #能看到一个model是linux的硬盘,就是nvmeof挂载的了 Node Generic SN Model Namespace Usage Format FW Rev --------------------- --------------------- -------------------- ---------------------------------------- --------- -------------------------- ---------------- -------- /dev/nvme4n1 /dev/ng4n1 9c5bb3bf618c2999ef73 Linux 1 53.69 GB / 53.69 GB 512 B + 0 B 6.6.44-p
断开链接
nvme disconnect -n 刚才那个爱叫什么叫什么的
 
参考: