NVMe over TCP

NVMe over TCP 为 initiator 和 target 提供网络附加的 NVMe 存储访问,具备可配置的 IP 地址、端口、密码以及基于主机的访问控制。示例演示了如何从 RouterOS 客户端向服务器挂载磁盘,包括 Linux 客户端的设置步骤。

NVMe over TCP

信息

此功能需要 Storage 软件包。 nvme-tcp 允许在 initiator 侧通过网络访问存储,将其作为 NVMe 块设备使用。在 target 侧,该设备可以是 hdd/ssd/nvme,甚至可以是 raid 阵列。

属性

属性说明
nvme-tcp-addressNVMe over TCP target 的 IP 地址。(主机设备 IP)
nvme-tcp-export在主机设备上禁用/启用 NVMe over TCP
nvme-tcp-host-name此属性指定 NVMe over TCP initiator 的主机名。它可用于识别和认证目的
nvme-tcp-name此属性指定 NVMe over TCP target 的名称或用于引用的连接名称(必须与主机 slot 名称相同)
nvme-tcp-password s**ensitive此属性用于指定认证 NVMe over TCP 连接的密码,确保访问安全。
nvme-tcp-port此属性指定 NVMe over TCP target 用于监听来自 initiator 的传入连接的网络端口。NVMe over TCP 流量的默认端口为 4420。
nvme-tcp-server-allow-host-name此属性指定 NVMe over TCP 服务器是否允许来自特定主机名的连接,提供了一种基于主机的访问控制机制。
nvme-tcp-server-password sensitive此属性指定 NVMe over TCP 服务器的密码,用于认证连接到 target 的 initiator。
nvme-tcp-server-port此属性指定 NVMe over TCP 服务器用于接受来自 initiator 的连接的网络端口。

示例

挂载磁盘

在本示例中,一台 RouterOS 设备用作存储服务器(Host),另一台 RouterOS 设备需要通过挂载网络存储设备(Client)。

  1. 在 Host 上使用以下命令:

    /disk/set disk1 nvme-tcp-export=yes nvme-tcp-port=4420
    
  2. 在 Client 上使用以下命令:

    /disk/add type=nvme-tcp nvme-tcp-address=192.168.1.1 nvme-tcp-name=disk1
    
  3. 你的 Client 现在将看到一个实际上是使用 NVMe over TCP 通过网络挂载的磁盘。

Linux 客户端

使用以下命令在 Linux Client 上设置 NVMe over TCP。

  1. 加载内核模块。

    modprobe nvme_tcp
    
  2. 发现现有的 NVMe over TCP 挂载。

    nvme discover -t tcp -a 192.168.1.1 -s 4420
    
    #OUTPUT:
    Discovery Log Number of Records 1, Generation counter 2
    =====Discovery Log Entry 0======
    trtype:  tcp
    adrfam:  ipv4
    subtype: nvme subsystem
    treq:    not specified, sq flow control disable supported
    portid:  4420
    trsvcid: 4420
    subnqn:  disk1
    traddr:  10.155.166.7
    sectype: none
    
  3. 连接到 NVMe over TCP 挂载。

    nvme connect -t tcp -a 192.168.1.1 -s 4420 -n disk1
    
  4. 现在块设备应该可用了。

    ls /dev/nvme*
    
    
    #OUTPUT:
    /dev/nvme0  /dev/nvme0n1  /dev/nvme-fabrics
    
  5. 现在你可以像使用 Linux Client 上任何其它块设备一样使用已挂载的块设备。

如果你想断开已挂载的块设备:

nvme disconnect -d /dev/nvme0

将文件挂载为块设备

在本示例中,一台 RouterOS 设备用作存储服务器(Host),另一台 RouterOS 设备需要通过挂载网络存储设备(Client)。

警告

当你不想把整块磁盘分配给 Client,而只想把磁盘大小的一部分提供给 Client 时,这种设置很有用。挂载文件而非磁盘,其性能会低于使用 NVMe over TCP 挂载磁盘(或分区)。

  1. 在 Host 上使用以下命令创建一个将用作块设备的文件:

    /disk/add type=file file-path=disk1/BIGFILE.img file-size=10G slot=blockdevice1
    /disk/set blockdevice1 nvme-tcp-export=yes 
    
  2. 在 Client 上使用以下命令将该文件挂载为块设备:

    /disk/nvme-discover 192.168.1.1
    /disk/add nvme-tcp-address=192.168.1.1 nvme-tcp-name=blockdevice1 type=nvme-tcp
    /disk/format blockdevice1 file-system=ext4
    
  3. 你的 Client 现在将看到一块名为 blockdevice1 的新磁盘,尽管在 Server 上该存储设备实际上是一个文件。

提示

如果你想在 Linux Client 上挂载该块设备,请查看 Linux 客户端 部分。

挂载 RAID 阵列

在本示例中,一台 RouterOS 设备用作存储服务器(Host),另一台 RouterOS 设备需要通过挂载网络存储设备(Client),同时还提供数据冗余。

  1. 在 Host 上设置一个 RAID,例如:

    /disk/add raid-device-count=8 raid-type=6 slot=RAID6_array type=raid
    /disk/set disk1 raid-master=RAID6_array raid-role=0
    /disk/set disk2 raid-master=RAID6_array raid-role=1
    /disk/set disk3 raid-master=RAID6_array raid-role=2 
    /disk/set disk4 raid-master=RAID6_array raid-role=3
    /disk/set disk5 raid-master=RAID6_array raid-role=4
    /disk/set disk6 raid-master=RAID6_array raid-role=5
    /disk/set disk7 raid-master=RAID6_array raid-role=6 
    /disk/set disk8 raid-master=RAID6_array raid-role=7
    /disk/set RAID6_array nvme-tcp-export=yes
    
  2. 在 Client 上使用以下命令:

    /disk/add type=nvme-tcp nvme-tcp-address=192.168.1.1 nvme-tcp-name=RAID6_array
    
  3. 你的 Client 现在将看到一块磁盘,但它实际上是一个高冗余的 RAID 阵列。

提示

如果你想在 Linux Client 上挂载该块设备,请查看 Linux 客户端 部分。

危险

不要将来自不同 RouterOS 设备的多块磁盘挂载到 Linux Client 上,并将它们组成软件 RAID 配置(例如 mdadm)。虽然这种配置确实提供了一定的冗余,但你可以预期会出现异常延迟问题甚至超时。建议在你的 RouterOS 上创建 RAID 阵列,并将该 RAID 阵列作为块设备导出给你的 Linux Client。