在linux系统中配置NVMe over TCP

1. 准备环境

1.1 准备linux系统

要求的linux系统可以是运行在物理机上,也可以是虚拟机上;

建议有个linux系统,一个做host,一个做target,如果资源紧张也可以把host和target运行在一个linux系统里;

要求linux系统的内核版本为linux-4.1之后的版本,早期版本不支持NVMe over TCP;作者实验时使用了linux-5.0.7内核版本和linux-5.2.9内核版本。

为host主机端准备NQN相关名称(连接target时使用):

注意设置主机的NQN,可以手动指定,也可以命令产生(nvme gen-hostnqn命令产生也可以)。

示例如下截图:

nvme gen-hostnqn命令

注意:截图中手动指定的主机nqn格式和nvme  gen-hostnqn生成的格式不同,两种格式任选一种都是可以。

1.2 准备硬盘

如果使用的是物理机,则需要准备一个或多个硬盘资源,如果使用的是虚拟机,则可以多添加几块盘;

对硬盘类型无要求,只要能够被linux系统所识别的,任何类型接口的硬盘都可以。

1.3 系统运行检查

登陆linux系统后,做如下检查:

  • 在target环境上,使用lsmod |grep nvme命令,查看nvmet内核模块和nvmet_tcp内核模块确保都已经被正常加载;
  • 在target环境上,使用ls /sys/kernel/config/命令确保此目录中已经有了nvmet目录;
  • 在host环境上,使用lsmod |grep nvme命令,查看nvme内核模块、nvme_core内核模块和nvme-fabrics内核模块,确保都已经被正常加载;
  • 在host环境上,区别已经安装了可执行的nvme命令,可以使用nvme -h查看帮助。

作者实验时在一个虚拟机上既做host也做target。

查看目录,示例如下:

其他提示:

1)如果lsmod |grep nvme无内容,但已经有了/sys/kernel/config/nvmet/目录,可能是此功能没有按内核模块编译,而是直接编译进了Image镜像里运行了,直接使用即可。

2)如果内核模块和目录二者都没有,可以尝试执行modprobe nvme和modprobe nvmet-tcp命令,如果成功,说明系统中有编译好的nvme.ko相关内核模块了,执行完命令后使用即可。

3)如果2)尝试的命令失败,用find命令也找不到相关的nvme内核模块,那么就自己下载kernel代码编译吧。

2. 在target环境上创建NVM subsystem

进入/sys/kernel/config/nvmet/subsystems目录执行mkdir nqn.2014-08.org.nvmexpress.mytest命令

注意:nqn.2014-08.org.nvmexpress.mytest是新建NVM subsystem随便写的NQN名字,但实际应用时需要按规范定义。

3. 设置NVM subsystem允许访问的主机

进入/sys/kernel/config/nvmet/subsystems/nqn.2014-08.org.nvmexpress.mytest目录中操作。

本示例中,echo 1 > attr_allow_any_host 设置了允许所有主机访问:

4. 申请NSID

/sys/kernel/config/nvmet/subsystems/nqn.2014-08.org.nvmexpress.mytest/namespaces目录中操作。

直接使用准备申请的NSID作为目录名创建目录即可。

5. 向NSID上挂载存储设备

/sys/kernel/config/nvmet/subsystems/nqn.2014-08.org.nvmexpress.mytest/namespaces/1/目录中操作

在上一步以NSID为目录名创建目录中,能够看到device_path,这里就是用此路径让NSID关联上存储媒介。

echo /dev/sda2 > device_path

然后

echo 1 > enable

注意:例子中/dev/sda2是一个示例,请根据自己环境准备的块设备名来执行此命令。

6. 创建NVMe over TCP的Transport层

进入/sys/kernel/config/nvmet/ports目录进行操作。

mkdir 1234

进入/sys/kernel/config/nvmet/ports/1234/目录,此目录自动包含了如下内容

开始设置这些属性:

echo tcp > addr_trtype
echo ipv4 > addr_adrfam
echo 127.0.0.1 > addr_traddr
echo 4420 > addr_trsvcid
设置tcp链路相关的参数。
注意:由于实验时host和target使用了同一个linux系统,所以tcp服务地址使用了127.0.0.1,帧听端口号为4420。

7. 让Transport与NVM subsystem建立关联

进入/sys/kernel/config/nvmet/ports/1234/subsystems目录进行操作。
使用ln -s 把刚才创建的NVM subsystem在此目录中建立一个软连接。

注意:例子中软连接的名字tcpsubsys,实际是对应的前边创建的NVM subsystem。

如果都执行成功,此时使用netstat -ltnp命令就可以看到4420端口正在运行着帧听服务。

8. 使用host主机进行Discovery

在host端执行命令:

nvme discover -t tcp -a 127.0.0.1 -s 4420

9. 连接

在host主机端执行命令

nvme connect -t tcp -a 127.0.0.1 -s 4420 -n nqn.2014-08.org.nvmexpress.mytest

连接成功后,执行nvme list就能看到NVMe over TCP相关的盘。

10. 关闭连接

11. 其他操作

请参照nvme -h提供的帮助,可以进行其他操作了。

注意:

创建/sys/kernel/config/nvmet/ports/?/时,不能使用相同IP地址和端口号(IP和端口号同时相同)重复创建,否则启动侦听(即执行ln -s)时报错 Address already in use。

多个NVM subsystem使用同一个网络地址时,/sys/kernel/config/nvmet/subsystems中的多个subsystem在同一个/sys/kernel/config/nvmet/ports/?/下创建软连接即可。

12. 卸载

注意:
反向操作时,请使用 rmdir 命令删除,使用rm -rf删除会报错。
如果rmdir仍然有告警考虑添加类似 --ignore-fail-on-non-empty这种参数。
软连接使用rm -rf删除。
 
posted @ 2019-08-26 16:22  JamesLi_1119401255  阅读(8063)  评论(2编辑  收藏  举报