在linux系统中配置NVMe over TCP 1. 准备环境 2. 在target环境上创建NVM subsystem 3. 设置NVM subsystem允许访问的主机 4. 申请NSID 5. 向NSID上挂载存储设备 6. 创建NVMe over TCP的Transport层 7. 让Transport与NVM subsystem建立关联 8. 使用host主机进行Discovery 9. 连接 10. 关闭连接 11. 其他操作

在linux系统中配置NVMe over TCP
1. 准备环境
2. 在target环境上创建NVM subsystem
3. 设置NVM subsystem允许访问的主机
4. 申请NSID
5. 向NSID上挂载存储设备
6. 创建NVMe over TCP的Transport层
7. 让Transport与NVM subsystem建立关联
8. 使用host主机进行Discovery
9. 连接
10. 关闭连接
11. 其他操作

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命令产生也可以)。

示例如下截图:

在linux系统中配置NVMe over TCP
1. 准备环境
2. 在target环境上创建NVM subsystem
3. 设置NVM subsystem允许访问的主机
4. 申请NSID
5. 向NSID上挂载存储设备
6. 创建NVMe over TCP的Transport层
7. 让Transport与NVM subsystem建立关联
8. 使用host主机进行Discovery
9. 连接
10. 关闭连接
11. 其他操作

nvme gen-hostnqn命令

在linux系统中配置NVMe over TCP
1. 准备环境
2. 在target环境上创建NVM subsystem
3. 设置NVM subsystem允许访问的主机
4. 申请NSID
5. 向NSID上挂载存储设备
6. 创建NVMe over TCP的Transport层
7. 让Transport与NVM subsystem建立关联
8. 使用host主机进行Discovery
9. 连接
10. 关闭连接
11. 其他操作

注意:截图中手动指定的主机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。

查看目录,示例如下:

在linux系统中配置NVMe over TCP
1. 准备环境
2. 在target环境上创建NVM subsystem
3. 设置NVM subsystem允许访问的主机
4. 申请NSID
5. 向NSID上挂载存储设备
6. 创建NVMe over TCP的Transport层
7. 让Transport与NVM subsystem建立关联
8. 使用host主机进行Discovery
9. 连接
10. 关闭连接
11. 其他操作

其他提示:

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名字,但实际应用时需要按规范定义。

在linux系统中配置NVMe over TCP
1. 准备环境
2. 在target环境上创建NVM subsystem
3. 设置NVM subsystem允许访问的主机
4. 申请NSID
5. 向NSID上挂载存储设备
6. 创建NVMe over TCP的Transport层
7. 让Transport与NVM subsystem建立关联
8. 使用host主机进行Discovery
9. 连接
10. 关闭连接
11. 其他操作

在linux系统中配置NVMe over TCP
1. 准备环境
2. 在target环境上创建NVM subsystem
3. 设置NVM subsystem允许访问的主机
4. 申请NSID
5. 向NSID上挂载存储设备
6. 创建NVMe over TCP的Transport层
7. 让Transport与NVM subsystem建立关联
8. 使用host主机进行Discovery
9. 连接
10. 关闭连接
11. 其他操作

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

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

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

在linux系统中配置NVMe over TCP
1. 准备环境
2. 在target环境上创建NVM subsystem
3. 设置NVM subsystem允许访问的主机
4. 申请NSID
5. 向NSID上挂载存储设备
6. 创建NVMe over TCP的Transport层
7. 让Transport与NVM subsystem建立关联
8. 使用host主机进行Discovery
9. 连接
10. 关闭连接
11. 其他操作

4. 申请NSID

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

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

在linux系统中配置NVMe over TCP
1. 准备环境
2. 在target环境上创建NVM subsystem
3. 设置NVM subsystem允许访问的主机
4. 申请NSID
5. 向NSID上挂载存储设备
6. 创建NVMe over TCP的Transport层
7. 让Transport与NVM subsystem建立关联
8. 使用host主机进行Discovery
9. 连接
10. 关闭连接
11. 其他操作

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/目录,此目录自动包含了如下内容

在linux系统中配置NVMe over TCP
1. 准备环境
2. 在target环境上创建NVM subsystem
3. 设置NVM subsystem允许访问的主机
4. 申请NSID
5. 向NSID上挂载存储设备
6. 创建NVMe over TCP的Transport层
7. 让Transport与NVM subsystem建立关联
8. 使用host主机进行Discovery
9. 连接
10. 关闭连接
11. 其他操作

开始设置这些属性:

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在此目录中建立一个软连接。
在linux系统中配置NVMe over TCP
1. 准备环境
2. 在target环境上创建NVM subsystem
3. 设置NVM subsystem允许访问的主机
4. 申请NSID
5. 向NSID上挂载存储设备
6. 创建NVMe over TCP的Transport层
7. 让Transport与NVM subsystem建立关联
8. 使用host主机进行Discovery
9. 连接
10. 关闭连接
11. 其他操作

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

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

8. 使用host主机进行Discovery

在host端执行命令:

nvme discover -t tcp -a 127.0.0.1 -s 4420

在linux系统中配置NVMe over TCP
1. 准备环境
2. 在target环境上创建NVM subsystem
3. 设置NVM subsystem允许访问的主机
4. 申请NSID
5. 向NSID上挂载存储设备
6. 创建NVMe over TCP的Transport层
7. 让Transport与NVM subsystem建立关联
8. 使用host主机进行Discovery
9. 连接
10. 关闭连接
11. 其他操作

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相关的盘。

在linux系统中配置NVMe over TCP
1. 准备环境
2. 在target环境上创建NVM subsystem
3. 设置NVM subsystem允许访问的主机
4. 申请NSID
5. 向NSID上挂载存储设备
6. 创建NVMe over TCP的Transport层
7. 让Transport与NVM subsystem建立关联
8. 使用host主机进行Discovery
9. 连接
10. 关闭连接
11. 其他操作

10. 关闭连接

在linux系统中配置NVMe over TCP
1. 准备环境
2. 在target环境上创建NVM subsystem
3. 设置NVM subsystem允许访问的主机
4. 申请NSID
5. 向NSID上挂载存储设备
6. 创建NVMe over TCP的Transport层
7. 让Transport与NVM subsystem建立关联
8. 使用host主机进行Discovery
9. 连接
10. 关闭连接
11. 其他操作

11. 其他操作

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