Interactive cheat sheet · Dell Metro-based NDM (5977/5978 → PowerMax)
One diagram, held fixed while you step through the three jobs an NDM migration actually is. Thick grey lines are cable — the port is physically in the fabric. Thin coloured lines are zones — blue between the two arrays’ RF ports, violet from a host HBA to an array’s FA ports. A grey line with no colour on it is plugged in but not zoned, which is the single most common reason symdm create fails. Animated lines are data moving. Commands for each step sit in the right-hand column; the full command reference is below the diagram.
NDM session state
—
—
Host paths to the datastore
—
—
How you back out
—
—
NDM itself is the automated part. The two zoning jobs in front of it are where the outages come from — and both of them must be finished before the first symdm create, because create reads the fabric to build the target’s masking view.
| Job | What it is | How often | Skip it and… |
|---|---|---|---|
| A Array to array | RF (SRDF) ports on both arrays zoned to each other — at least two links across at least two directors, in both fabrics. | Once per array pair | symdm environment -setup fails, or you build the session on a single link and one director reboot stalls the migration. |
| B Host to array | Every host HBA that sees the source is also zoned to the target array’s FA ports, single-initiator, added as new zones. | Once per host, per fabric | symdm create builds the target initiator group from login history. A host that never logged into the target FA ports is missing from the masking view — and misses the cutover. |
| C Migrate | create → rescan → cutover → commit, driven per storage group from SYMCLI or Unisphere. | Per storage group, repeated | Nothing — this is the safe part. The risk here is doing several at once before the zoning step is boring. |
The discipline matters more than the syntax: back the config up before you touch it, add zones rather than editing existing ones so rollback survives, and look at what a zone serves before you remove it. Removing source-array zones is post-commit cleanup, never a pre-step.
| Command | What it does | Notes |
|---|---|---|
configupload | Saves the switch config, zoning included, off-box. | First command of every zoning session. Do both fabrics. |
switchshow | Port-by-port state: online, speed, the WWPN logged in. | Proves the cable and the SFP, not the zone. |
nsshow / nscamshow | Name-server view of who is logged into the fabric. | Where you confirm an RF or FA port actually logged in before zoning it. |
cfgshow / zoneshow | Shows the defined and effective configs and their zones. | Run it before touching a zone: see every member it serves. |
alicreate "a_esx01_hba1","10:00:..:3a:c1" | Names a WWPN so zones read like inventory, not hex. | Convention is load-bearing — scripts and audits parse these names. |
zonecreate "z_esx01_c1__pmax_1d4","a_esx01_hba1; a_pmax_1d4; a_pmax_2d4" | One initiator, the target FA ports it needs. | Single-initiator zoning. Name by the last six of the WWPN. |
cfgadd "PROD_CFG","z_esx01_c1__pmax_1d4" | Adds the new zone to the active config. | safe Additive. Rollback is the old config, still intact. |
cfgsave then cfgenable "PROD_CFG" | Persists, then activates. | Activating the wrong config name is the classic fabric outage. Read it twice. |
cfgremove / zonedelete | Removes a zone or a member. | blast radius A shared zone can carry hosts you did not come here for. Only after commit, only what you added or verified. |
Everything is driven per storage group. -sid may be either array once the session exists; -src_sid / -tgt_sid are used for environment-level operations.
| Command | Does | When |
|---|---|---|
symdm environment -src_sid <src> -tgt_sid <tgt> -validate | Pre-checks the pair: SRDF connectivity, code levels, director and port counts. | The real gate at the end of job A. |
symdm environment -src_sid <src> -tgt_sid <tgt> -setup | Builds the NDM environment between the two arrays. | Once per array pair. |
symdm -environment list | Lists environments and their state. | Any time. |
symdm create -src_sid <src> -tgt_sid <tgt> -sg <SG> -tgt_srp <SRP> -tgt_pg <PG> -validate | Dry run of the create. | Always, first. |
symdm create -src_sid <src> -tgt_sid <tgt> -sg <SG> -tgt_srp <SRP> -tgt_pg <PG> | Creates the session: duplicate devices on the target with the source’s WWNs, a same-named SG, an initiator group from login history, a port group, a masking view. | Start of every storage group. |
symdm -sid <sid> -sg <SG> list -v -pairs_info -detail | Session state and per-pair copy progress. | The monitoring command. Live in it. |
symdm -sid <sid> -sg <SG> cutover | Flips which array serves the host. Identity is unchanged, so the host sees a path change. | Only once every host has rescanned and sees target paths. |
symdm -sid <sid> -sg <SG> commit | Ends the session, releases the source devices. | one-way After this there is no revert to the source. |
symdm -sid <sid> -sg <SG> cancel | Cancels a session before commit. | Pre-cutover back-out. |
symdm -sid <sid> -sg <SG> cancel -revert | Cancels after cutover and puts the source back in front. | Only when every host has realised the cutover first — see the gotchas. |
symdm -sid <sid> -sg <SG> recover | Resumes a failed create, commit or cancel once the cause is fixed. | Your first move after any *FAILED state. |
symdm environment -src_sid <src> -tgt_sid <tgt> -remove | Tears the environment down. | After the last storage group commits. |
symcfg list -sid <sid> -ra all · symcfg list -sid <sid> -fa all -port | Lists RDF directors and FA directors/ports. | Job A and job B, picking ports. |
symaccess -sid <sid> list logins -dirport <dir>:<port> | Shows which initiator WWPNs have logged into that FA port. | The proof that job B worked — and what create reads. |
| State | Means | Your move |
|---|---|---|
Created | Target devices exist with the source’s identity; masking view built; replication establishing. | Rescan every host. |
CutoverReady | The session is ready for the flip. | Confirm all hosts see target paths, then cutover. |
Migrating | Cutover done; the target is serving; data still settling. | Watch, do not rescan paths away. |
CutoverSync | Fully synchronised. | commit. |
CutoverNoSync / CutoverSyncing | Synchronisation stopped, or still running. | Resume or wait — do not commit from here. |
CREATEFAILED · CancelFailed | The operation stopped part-way. | Fix the cause, then recover. |
CutoverInProg · CommitInProg | Transitional, with a progress level. | Wait it out. |
| Check | Requirement |
|---|---|
| Code levels | Metro-based NDM: source on 5977/5978, target PowerMax. Pass-through NDM covers a 5876 source. Interfamily 5977→5977 and 5978→5978 need Solutions Enabler 9.1+; a V3→V4 move needs a 10.x instance to drive it. |
| SRDF links | At least two, across at least two directors on each array, RF ports zoned to each other. |
| Distance | Arrays within synchronous / metro distance of each other. |
| Devices | Open systems (FBA). Source devices must not already be R2. |
| Target storage group | A storage group of the same name must not already exist on the target — NDM creates it. |
| Management | A Solutions Enabler / Unisphere host with gatekeepers that can see at least one of the arrays. |
| VMware | consistent_lun enabled on the source-array initiator group before the migration starts. |
| Host zoning | Every migrating host zoned to the target array before the first create. |
| Trap | What happens | Do instead |
|---|---|---|
| fabric Editing a shared zone | A zone you assumed served one host serves a dozen. Edit it live and every member loses paths at once. | Read zoneshow first. Create new zones and cfgadd them; leave the old ones alone until after commit. |
| fabric Activating the wrong config | The fabric loads a config that predates half your zones. Every path that was added since disappears. | configupload first; check the active config name in cfgshow before cfgenable. |
| fabric Removing source zones early | You cut the source paths before commit and lose the ability to revert cleanly. | Source-zone removal is the last step, after commit. |
| host A rescan that removes source paths | Post-cutover, a rescan that permanently drops the now-inactive source paths kills a clean cancel -revert — for every concurrent session on that host. | Rescan to discover, not to prune. Clean paths up after commit. |
| host Two NDM changes in quick succession | Cutover followed immediately by cancel -revert, before every host realised the first, can get a write rejected by both arrays and devices marked PDL. | Confirm every host has realised the cutover before issuing anything else. |
| host Dead paths after a cancel | Create → discover → cancel → create leaves stale paths the host still thinks are registered; Windows guests have shown NTFS event 57 and unexpected cluster failovers. | Clean up dead paths on every node after a cancel, before recreating. |
array Forgetting consistent_lun | LUN addressing is inconsistent across paths for ESXi. | Set it on the source initiator group before the migration. |
| process Parallelising early | Three sessions in flight, one unproven zoning method, one blast radius. | One storage group end to end. Validate fully. Then scale when the fabric step is boring. |
| Command | Does |
|---|---|
esxcli storage core adapter list | The HBAs and their WWPNs — the initiators you will zone. |
esxcli storage core adapter rescan --all | Discovers the new target paths after create. Run on every node in the cluster. |
esxcli storage core path list -d naa.<id> | Shows every path to the device and which array each runs to — how you prove the host sees both. |
esxcli storage vmfs extent list | Confirms the datastore is still on the same device identity. |
esxcli storage vmfs snapshot list | Should be empty. Anything here means ESXi thinks it found a copy — the failure mode NDM exists to avoid. |