zoukankan      html  css  js  c++  java
  • 在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提供的帮助,可以进行其他操作了。

     
  • 相关阅读:
    Java多线程问题
    pattern-matching as an expression without a prior match -scala
    从Zero到Hero,OpenAI重磅发布深度强化学习资源
    What-does-git-remote-and-origin-mean
    flink source code
    如何生成ExecutionGraph及物理执行图
    rocketmq 源码
    Flink source task 源码分析
    flink 获取上传的Jar源码
    fileupload
  • 原文地址:https://www.cnblogs.com/JamesLi/p/11399054.html
Copyright © 2011-2022 走看看