Admin CLI Workflow to Connect NVMe-oF Enclosures
Connect an NVMe-oF enclosure to a DSX node by using the Admin CLI on the Anvil, the Hammerspace metadata and management node.
-
Find the name of the DSX node that will own the enclosure:
Command:
node-listIn the output, the DSX nodes show
Product node type: DSX. -
Read the DSX node’s host NQN, and add it to the array’s host access configuration so that the array presents the intended namespaces to that node. The host NQN identifies the DSX node to the array. It is not a password.
Command:
node-list --name <dsx-node-name>The host NQN is on the line
NVMe-oF host NQN:. In the Management GUI, it is the Host NQN field on the NVMe-oF Config tab that opens when you edit the DSX node on the Storage Systems tab of the Infrastructure page.Expected output (trimmed):
Name: dsx.example.com Type: Product Product node type: DSX Internal ID: 1073741832 ID: 4cdae232-a7de-501a-ad2a-1e90457a0f98 HW state: OK Node state: MANAGED Node mode: ONLINE Management IP: 192.0.2.21/20 SW version: 5.2.14-1266 S3 auth signing type: Default Vendor: VMware, Inc. Product name: VMware Virtual Platform Serial number: 8d8c7b0f9c31 Firmware version: None NVMe-oF host NQN: nqn.2014-08.org.nvmexpress:uuid:63422d42-6bd4-a136-5617-8d8c7b0f9c31 Created: 2026-09-27 23:23:16 UTC Modified: 2026-09-27 23:42:38 UTC Components: Type: Hdd ID: 5f2e0a0f-323c-4172-82cc-7ecb0d592698 Name: /dev/sdc State: OK <Additional output removed for brevity> -
Add the enclosure to the DSX node, with the array’s discovery address as the target. To connect all of the subsystems that the DSX node discovers at the same time, add
--connect-all:Command:
nvmeof-config --enclosure-add --dsx-name <dsx-node-name> --target <target-address> --connect-allGive every address that the array presents the subsystems on, by repeating
--targetfor each one, when you add the enclosure. Each address becomes a path to each subsystem found there, and multipathing is enabled when a subsystem has more than one. An address that you add to the enclosure later is not connected to subsystems that are already connected; see NVMe-oF Limitations and Operating Guidance. A target is identified by its address; giving the same address again with a different port does not add a target.You can use
--dsx-id <dsx-node-id>instead of--dsx-name. Leave out--connect-allto add the enclosure without connecting anything yet. The command discovers and connects before it returns, which can take a few minutes; its output shows every subsystem found, withState: CONNECTEDon each address that was connected.Expected output (two subsystems, two targets, trimmed):
Type: Nvme-of Enclosure ID: b157dd67-abf8-4327-97ba-b51ac236fc5a Name: dsx.example.com::nvmeof-b157dd67-abf8-4327-97ba-b51ac236fc5a Node: dsx.example.com Node host NQN: nqn.2014-08.org.nvmexpress:uuid:63422d42-6bd4-a136-5617-8d8c7b0f9c31 NVMe-oF config: Queue depth: 64 IO queue pairs: 64 I/O policy: QUEUE_DEPTH Transport: TCP Target port: 8009 Controller loss timeout: -1 Discovery targets: Address: 192.0.2.31 Port: 8009 Transport: TCP Address: 192.0.2.32 Port: 8009 Transport: TCP Subsystems: Type: Nvme-of Subsystem ID: 40b94f39-4bb2-5fd5-a353-f3afaac1d095 Subsystem NQN: nqn.2026-09.com.example:docs-subsys2 Namespaces: [Namespace ID: 1, Size: 4.2GB, Sector size: 4096, Model: Docs Lab NVMe Target, Serial: DOCSLAB00000002, Namespace unique ID: bef19a80-60dd-b2bd-30a3-4965b79d3e20, Connected: true] [Namespace ID: 2, Size: 4.2GB, Sector size: 4096, Model: Docs Lab NVMe Target, Serial: DOCSLAB00000002, Namespace unique ID: bef19a80-60dd-b2bd-30a3-4965b79d3e20-2, Connected: true] Transport addresses: [Address: 192.0.2.32, Port: 8009, Transport: TCP, State: CONNECTED] [Address: 192.0.2.31, Port: 8009, Transport: TCP, State: CONNECTED] Type: Nvme-of Subsystem ID: 8e1b8ba6-a027-5539-98e9-0bcee62a28c5 Subsystem NQN: nqn.2026-09.com.example:docs-subsys1 Namespaces: [Namespace ID: 1, Size: 4.2GB, Sector size: 4096, Model: Docs Lab NVMe Target, Serial: DOCSLAB00000001, Namespace unique ID: c9eedb06-110b-552b-beaa-1cd7e38ae394, Connected: true] [Namespace ID: 2, Size: 4.2GB, Sector size: 4096, Model: Docs Lab NVMe Target, Serial: DOCSLAB00000001, Namespace unique ID: c9eedb06-110b-552b-beaa-1cd7e38ae394-2, Connected: true] Transport addresses: [Address: 192.0.2.32, Port: 8009, Transport: TCP, State: CONNECTED] [Address: 192.0.2.31, Port: 8009, Transport: TCP, State: CONNECTED]On builds earlier than 5.2.12-P3,
--connect-allgiven together with--targetconnects nothing. On those builds, add the enclosure first, and then connect the subsystems as a separate command (step 5). -
Find the enclosure’s name. An enclosure added from the Admin CLI is named after the DSX node, followed by
::nvmeof-and a unique ID. This is so even if you give--enclosure-namewith--enclosure-add: the name you give is ignored.Command:
nvmeof-config --listExpected output:
total 1 Type: Nvme-of Enclosure ID: b157dd67-abf8-4327-97ba-b51ac236fc5a Name: dsx.example.com::nvmeof-b157dd67-abf8-4327-97ba-b51ac236fc5a Node: dsx.example.com Node host NQN: nqn.2014-08.org.nvmexpress:uuid:63422d42-6bd4-a136-5617-8d8c7b0f9c31 -
If you did not use
--connect-all, connect the subsystems you want:Command:
nvmeof-config --enclosure-name <enclosure-name> --connect-nqn <subsystem-nqn>Connecting a subsystem that the DSX node did not discover succeeds but connects nothing.
Run this command after the enclosure has been added. If you give
--connect-nqnwith--enclosure-addinstead, and another enclosure on the DSX node already uses the same target address, the subsystem is discovered but not connected (State: DISCOVERED); run this command to connect it. -
Find the device path of each connected namespace. The DSX node’s drive list shows every connected namespace as an Nvme-of Drive with its device path.
Command:
drive-list --node-name <dsx-node-name>Expected output (trimmed to the NVMe-oF drives):
total 10 Type: Hdd ID: 5f2e0a0f-323c-4172-82cc-7ecb0d592698 Name: /dev/sdc State: OK Type: Hdd ID: 87de74f9-d96f-4c6d-8c2b-f0e520872076 Name: /dev/dm-1 State: OK Type: Hdd ID: 90b0f905-07f6-4469-9d16-9b4df73994d4 Name: /dev/dm-2 State: OK Type: Hdd ID: 960b144f-33ac-4c82-8336-f038d47f5c01 Name: /dev/dm-0 State: OK Type: Hdd ID: e17fa6e5-abb1-4d8a-a831-44f6951f60b9 Name: /dev/sdb State: OK Type: Hdd ID: e553917a-c252-4b26-a910-785dc31c1015 Name: /dev/sda State: OK Type: Nvme-of Drive ID: 29f32ef8-896b-5689-9b17-96a6bcbf0e2a Name: /dev/nvme0n1 State: OK Capacity: 4.2GB Serial number: 29f32ef8-896b-5689-9b17-96a6bcbf0e2a Type: Nvme-of Drive ID: 4412c29a-ffd7-5961-a4c0-61a8b509e0c5 Name: /dev/nvme2n1 State: OK Capacity: 4.2GB Serial number: 4412c29a-ffd7-5961-a4c0-61a8b509e0c5 Type: Nvme-of Drive ID: 863571b4-59f2-5e51-9e30-4c2534ee9981 Name: /dev/nvme2n2 State: OK Capacity: 4.2GB Serial number: 863571b4-59f2-5e51-9e30-4c2534ee9981 Type: Nvme-of Drive ID: 88073fd2-9dcf-5fab-952a-08abbabcab63 Name: /dev/nvme0n2 State: OK Capacity: 4.2GB Serial number: 88073fd2-9dcf-5fab-952a-08abbabcab63Read the device path right before you use it. Device paths such as
/dev/nvme0n1are assigned by the DSX node’s kernel and can change when a subsystem is disconnected and reconnected. -
Create a logical volume on a namespace, and then add it to Hammerspace as a storage volume. The logical volume’s name is in the output of the first command.
Command:
logical-volume-create --node-name <dsx-node-name> --device-path <device-path>Expected output:
Type: Logical Volume ID: eea406dd-ddb8-4416-886f-61f6ebcf09ce Name: /hsvol2 Exported path: /hsvol2 Addresses: [IP: 192.0.2.21/20, Port: 3049, NetId: tcp, NodeNum: 0] Node: dsx.example.com Usage: DS Reserved: false Filesystem type: XFS Capacity: [Total: 4.2GB] Hardware: [Type: Nvme-of Drive, ID: 29f32ef8-896b-5689-9b17-96a6bcbf0e2a, Name: /dev/nvme0n1, State: OK]volume-add --node-name <dsx-node-name> --logical-volume-name <logical-volume-name> --name <volume-name>The Management GUI does both in one flow; see Adding an NVMe-oF Enclosure and Subsystems.
-
To remove the namespaces of a disconnected or removed subsystem from the DSX node’s inventory, refresh the node:
Command:
node-refresh --name <dsx-node-name> --reconcile-components