Channing He
Channing He
Articles14
Tags8
Categories0
TrueNAS SCALE NVMe of (nvmetcli)教程

TrueNAS SCALE NVMe of (nvmetcli)教程

更新

2025.05.29 NVME-OF将在25.10 官方支持

视频教程

https://www.bilibili.com/video/BV1AgrYY6EYn

前言

TrueNAS SCALE作为一个存储系统,在NVMe SSD价格越来越香,其实一直缺少高性能的共享存储方式。

对于自带的NFS来说,开启RDMA非常简单只需要给出rdma端口以及加载模块,配置十分简单。SMB direct的话SCALE的内核不支持,所以想要改起来就非常麻烦。

块存储在2025年只有ISCSI对于高负载的应用来说,显得就不够了,无论是tcp还是rdma的NVMeOF在各种方面都优于ISCSI,而且能显著降低CPU的利用率。

其实SCALE的企业版已经支持了NVMeOF

image.png

来源:https://www.starwindsoftware.com/blog/iscsi-vs-nvme-of-performance-comparison/

以及其他的一些对比:https://kb.blockbridge.com/technote/proxmox-iscsi-vs-nvmetcp/#

所以配置NVMeOf迫在眉睫(不是。

入门(

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

具体操作

配置环境

其实已经有项目写好了脚本,我们就不重复造轮子,简单论述使用方法

https://github.com/democratic-csi/democratic-csi/blob/master/contrib/scale-nvmet-start.sh

1
2
3
4
#切换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 ,后面都要替换我这里的路径

1
2
3
4
#切换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

然后给予执行权限

1
chmod +x /mnt/CPool/myscripts/scale-nvmet-start.sh

需要注意的是这个脚本默认安装最新版本的依赖~~configshell_fb~~ ,这会导致报错,需要指定版本1.1.30

也就是修改这个脚本~~pip install configshell_fb~~ ~~pip install configshell_fb==1.1.30~~

然后执行脚本

忽略上面的话,提交修复的PR以及合并,默认就是安装这个版本的了。

1
bash /mnt/CPool/myscripts/scale-nvmet-start.sh

如果你网络没问题,那么这个脚本会帮你完成一切的配置

nvmetctl配置NVMeOF

执行下面的命令进入nvmetcli命令行,注意替换CPool/myscripts

1
/mnt/CPool/myscripts/nvmet-venv/bin/python /root/.local/bin/nvmetcli

首先要配置一个**subsystems 和** namespaces

1
2
3
4
subsystems/ create nqn=你爱叫什么叫什么
#然后爱叫,我这里叫testof
#创建namespaces
subsystems/testof/namespaces create nsid=1

然后你可以输入ls查看现在的配置

1
2
3
4
5
6
7
8
9
/> 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**+前面的那些,如下

1
2
3
4
5
/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

1
2
3
4
5
6
7
#创建一个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一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/> 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 ,记住一定是这个,因为脚本会自动加载这个命名的配置,并且放在脚本的同目录

1
saveconfig nvmet-config-loaded.json

然后加载配置,此时就创建完成了

1
/mnt/CPool/myscripts/nvmet-venv/bin/python /root/.local/bin/nvmetcli restore nvmet-config-loaded.json

加入自启动

一定要把下面命令加入开机启动,这样就能自动安装环境并且加载配置

1
bash /mnt/CPool/myscripts/scale-nvmet-start.sh

测试机器

这里就简述了,根据你自己环境

配置环境

1
2
3
4
5
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

查找

1
nvme discover -t rdma -a 192.168.2.140 -s 4420

链接

1
nvme connect -t rdma -n 刚才那个爱叫什么叫什么的 -a 192.168.2.140 -s 4420

查看

1
2
3
4
5
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

断开链接

1
nvme disconnect -n 刚才那个爱叫什么叫什么的

参考:

https://www.intel.com/content/dam/support/us/en/documents/network-and-i-o/fabric-products/Config_NVMe_on_Intel_OPA_AN_J78967_v3_0.pdf

https://www.reddit.com/r/truenas/comments/1fh3rfl/an_idiots_walkthrough_to_setting_up_nvmeofroce/

https://linbit.com/blog/configuring-highly-available-nvme-of-attached-storage-in-proxmox-ve/

https://kb.blockbridge.com/technote/proxmox-iscsi-vs-nvmetcp/#

Author:Channing He
Link:https://homelabproject.cc/TrueNAS/TrueNAS%20SCALE%20NVMe%20of%20(nvmetcli)%E6%95%99%E7%A8%8B/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可