在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提供的幫助,可以進行其他操作了。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM