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