1. 准备环境
1.1 准备linux系统
要求的linux系统可以是运行在物理机上,也可以是虚拟机上;
建议有个linux系统,一个做host,一个做target,如果资源紧张也可以把host和target运行在一个linux系统里;
要求linux系统的内核版本为linux-4.1之后的版本,早期版本不支持NVMe over TCP;作者实验时用的是linux-5.0.7版本。
为host主机端准备NQN相关名称(连接target时使用):
注意设置主机的NQN,可以手动指定,也可以命令产生(nvme gen-hostnqn命令产生也可以。要求编译nvme命令时定义LIBUUID才能使用此命令)。
示例如下截图:
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内核模块,确保都已经被正常加载;
- 在host环境上,区别已经安装了可执行的nvme命令,可以使用nvme -h查看帮助。
作者实验时使用了一个虚拟机,既做host也做target,模块加载示例如下:
查看目录示例如下:
2. 在target环境上创建NVM subsys
进入/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 ipv4 > addr_adrfam
echo 4420 > addr_trsvcid
7. 让Transport与NVM subsystem建立关联
注意:例子中软连接的名字tcpsubsys,实际是对应的前边创建的NVM subsystem。
如果都执行成功,此时使用netstat -ltnp命令就可以看到4420端口正在运行着帧听服务。
8. 使用host主机进行Discovery
在host端执行命令:
nvme discover -t tcp -a 127.0.0.1 -s 4420 -q nqn.xxx......
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. 其他操作
请参照nvme -h提供的帮助,可以进行其他操作了。