Determine current cluster architecture (ESA or OSA)
# From ESXi Shell on any cluster host:
esxcli vsan cluster get
# Look for "vSAN ESA Enabled: true" or "vSAN ESA Enabled: false"
# Check storage pool (ESA) vs. disk groups (OSA):
esxcli vsan storage list
# ESA: Shows "Storage Pool" entries
# OSA: Shows "Disk Group" entries with Cache Tier and Capacity Tier
# In vSphere Client:
# Cluster > Configure > vSAN > Disk Management
# ESA shows "Storage Pool" with all NVMe in flat list
# OSA shows "Disk Groups" with Cache + Capacity hierarchy
Verify NVMe devices meet ESA requirements
# List all NVMe devices:
esxcli nvme device list
# Check device model against vSAN HCL:
esxcli nvme device get -A <vmhbaX>
# Note: Model Number, Firmware Revision, Capacity
# Verify NVMe driver version:
esxcli software vib list | grep -i nvme
# ESA minimum requirements:
# - All storage devices must be NVMe (no SAS/SATA)
# - Minimum 4 NVMe devices per host (2 minimum for testing only)
# - ESXi 8.0+ with vSAN 8 license
# - Devices must be on the vSAN ESA HCL (separate from OSA HCL)
vmkernel.log: "NVMe device naa.xxx has been marked as permanently failed"Identify the failed device
# List storage pool devices and their health:
esxcli vsan storage list
# Look for device with Status: "Error" or "Permanent Loss"
# Note the device NAA ID and slot location
# Get detailed NVMe device info:
esxcli nvme device list
# Cross-reference the failed NAA with physical slot number
# Check SMART health data (if device still responds):
esxcli nvme device log smart get -A <vmhbaX>
# Look for: Percentage Used, Available Spare, Media Errors
Monitor automatic resync progress
# Check resync status:
esxcli vsan health cluster list | grep -i "resync"
# In vSphere Client:
# Cluster > Monitor > vSAN > Resyncing Objects
# Shows: Objects to sync, Bytes remaining, ETA
# Monitor resync impact on performance:
# Cluster > Monitor > vSAN > Performance > Cluster
# Watch "Resync Read Latency" and "Resync Write Latency"
# The resync rate can be tuned (but usually not needed for ESA):
# vSphere Client > Cluster > Configure > vSAN > Services
# "Resync throttle" — default is balanced
Remove the failed device from the storage pool
# In vSphere Client:
# Host > Configure > vSAN > Disk Management
# Select the failed device (red icon)
# Click "Remove" — choose "Evacuate data" if any components remain
# From ESXi Shell (if UI is not available):
esxcli vsan storage remove -d naa.xxxxxxxxxxxxxxxxxxxx
# Confirm removal:
esxcli vsan storage list
# The failed device should no longer appear
Install replacement NVMe and add to storage pool
# Hot-plug the new NVMe device (if server supports hot-plug)
# Or schedule a brief host maintenance for cold-swap
# Verify new device is visible:
esxcli nvme device list
# Confirm new NAA ID appears
# Add to storage pool:
# vSphere Client > Host > Configure > vSAN > Disk Management
# Click "Claim Unused Disks" — select the new NVMe — click "Create"
# From ESXi Shell:
esxcli vsan storage add -d naa.xxxxxxxxxxxxxxxxxxxx
# Verify the device is now in the pool:
esxcli vsan storage list | grep -A3 "naa.xxxxxxxxxxxxxxxxxxxx"
Validate ESA hardware readiness on new hosts
# On each new ESA host:
# Verify ESXi 8.0 U1+:
vmware -vl
# Confirm all NVMe devices are visible:
esxcli nvme device list
# Check device count (minimum 4):
esxcli nvme device list | grep -c "vmhba"
# Verify devices are on ESA HCL:
esxcli nvme device get -A <vmhbaX>
# Note Model Number — cross-check against:
# https://www.vmware.com/resources/compatibility (select vSAN ESA)
Build the ESA cluster
# In vSphere Client:
# Right-click Datacenter > New Cluster
# Enable vSAN — select "Express Storage Architecture (ESA)"
# Add the new ESXi 8.0 hosts to this cluster
# Claim NVMe devices into the storage pool:
# Cluster > Configure > vSAN > Disk Management > Claim Disks
# Verify ESA is active:
esxcli vsan cluster get
# Confirm: "vSAN ESA Enabled: true"
# Verify storage pool:
esxcli vsan storage list
# All NVMe devices should appear under "Storage Pool"
Migrate VMs from OSA cluster to ESA cluster
# In vSphere Client:
# Right-click VM on OSA cluster > Migrate
# Select "Change both compute resource and storage"
# Target: ESA cluster + ESA vSAN datastore
# Network: map source port groups to destination port groups
# Storage Policy: Select ESA-compatible policy (RAID-5/6 recommended)
# For bulk migration, use vSphere Client multi-select:
# Select multiple VMs > Right-click > Migrate
# Up to 8 concurrent vMotions per host (default)
# Monitor migration progress:
# vSphere Client > Tasks & Events
# Watch for any failures — common issues:
# - Insufficient bandwidth (saturated vMotion vmk)
# - Storage policy incompatibility
# - EVC mode mismatch between clusters
Post-migration validation on ESA cluster
# Verify all VMs are running on ESA datastore:
# Cluster > VMs tab — confirm all VMs show ESA vSAN datastore
# Run vSAN health check:
esxcli vsan health cluster list
# Verify storage policies are applied:
# VM > Configure > Policies > check assigned policy matches ESA-recommended
# Validate inline dedup/compression is active:
# Cluster > Monitor > vSAN > Capacity
# "Deduplication and Compression" should show savings ratio
# Confirm native snapshots work (ESA-specific):
# VM > Snapshots > Take Snapshot
# Verify snapshot is created instantly (ESA native, not legacy redo-log)
Create an ESA-optimized storage policy
# In vSphere Client:
# Menu > Policies and Profiles > VM Storage Policies
# Click "Create" > Name: "ESA-RAID5-Standard"
# Rules:
# vSAN > Storage Type: vSAN ESA
# Failures to Tolerate (FTT): 1
# Failure Tolerance Method (FTM): RAID-5 (Erasure Coding)
# Storage Tier: All Flash (auto for ESA)
# Advanced (optional):
# Object Space Reservation: 0% (thin provision, recommended)
# IOPS limit: No limit (unless multi-tenant)
# Disable object checksum: No (keep enabled)
Create a high-resilience policy for critical VMs
# For mission-critical VMs, use RAID-6 (FTT=2):
# Policies and Profiles > Create:
# Name: "ESA-RAID6-Critical"
# FTT: 2
# FTM: RAID-6 (Erasure Coding)
# Capacity impact:
# RAID-5 (FTT=1): 100GB VM uses ~133GB raw (1.33x)
# RAID-6 (FTT=2): 100GB VM uses ~150GB raw (1.5x)
# RAID-1 (FTT=1): 100GB VM uses ~200GB raw (2x) — mirroring
# ESA recommendation: Use RAID-5 as default, RAID-6 for critical only
# RAID-1 mirroring is still available but rarely needed in ESA
Apply policies and verify compliance
# Assign policy to VM:
# VM > Configure > Policies > Edit VM Storage Policies
# Select "ESA-RAID5-Standard" for all VM disks
# Click OK — vSAN will reconfigure object layout
# Verify policy compliance:
# VM > Monitor > Policies
# Status should show "Compliant" (green)
# If "Non-compliant" — check:
# 1. Enough hosts to satisfy FTT (3 for RAID-5, 4 for RAID-6)
# 2. Enough capacity in the storage pool
# 3. No host in maintenance mode reducing available fault domains
# From ESXi Shell:
esxcli vsan debug object health summary get
# Shows count of compliant vs non-compliant objects
Verify native snapshot support for the VM
# Check VM hardware version:
# vSphere Client > VM > Summary
# "VM Hardware: Version vmx-20" or higher is required
# If older version:
# VM > Actions > Compatibility > Upgrade VM Compatibility
# Select "ESXi 8.0 and later" (vmx-20 or vmx-21)
# Note: VM must be powered off for hardware upgrade
# Verify the VM is on an ESA-compliant storage policy:
# VM > Configure > Policies
# Policy must specify "vSAN ESA" storage type
Check for legacy snapshots inherited from OSA migration
# In vSphere Client:
# VM > Snapshots > Manage Snapshots
# If you see delta disks (legacy format), they must be consolidated first:
# VM > Snapshots > Consolidate
# This converts legacy redo-log snapshots to ESA native format
# If consolidation hangs, check:
# 1. Sufficient capacity on ESA datastore
# 2. VM I/O is not preventing quiesce
# 3. No locks on the VMDK files
# Monitor progress:
# vSphere Client > VM > Tasks > "Consolidate virtual machine disk files"
Troubleshoot snapshot deletion that is stuck
# Check if a snapshot delete task is running:
# vSphere Client > VM > Tasks & Events
# Look for "Remove Snapshot" or "Consolidate" task
# If stuck, check for file locks on the host where VM runs:
# SSH to ESXi host:
vmkvsitools lsof | grep <vm-name>
# Check vSAN object health for the VM's namespace:
esxcli vsan debug object list | grep -i "<vm-name>"
# If the task has been running for 24+ hours with no progress:
# 1. Power off the VM gracefully (guest OS shutdown)
# 2. Retry snapshot consolidation while VM is off
# 3. Power VM back on after consolidation completes
# Verify all snapshots are cleared:
# VM > Snapshots > Manage Snapshots — should show "You are here" only
Configure backup software for ESA native snapshots
# ESA native snapshots require updated backup agents:
# - Veeam: v12.1+ with vSAN 8 ESA awareness
# - Commvault: v2024+ with VADP 8.0 support
# - Dell Avamar/NetWorker: Latest version with ESA support
# Verify backup integration:
# 1. Test a single VM backup + restore on ESA
# 2. Confirm backup uses native snapshot (not legacy):
# - During backup, check VM > Snapshots
# - Native snapshots do NOT create delta VMDK files
# - They appear as lightweight block-level refs
# In vSphere Client:
# VM > Monitor > Events
# During backup, look for "Create snapshot" event
# Type should indicate "vSAN native snapshot"
Check dedup/compression savings ratio
# In vSphere Client:
# Cluster > Monitor > vSAN > Capacity
# Look for "Deduplication and Compression Overview":
# - Before Dedup/Compression: XXX TB
# - After Dedup/Compression: YYY TB
# - Savings Ratio: X.Xx
# From ESXi Shell:
esxcli vsan debug resync summary get
# Shows "Data Movement" which reflects deduplicated writes
# Per-host breakdown:
# Cluster > Monitor > vSAN > Capacity > "Dedup and Compression" column
# Shows savings per host — helpful to identify imbalanced data
Understand capacity reporting with dedup
# IMPORTANT: ESA capacity numbers can be confusing
# Key terms:
# "Used" — raw bytes consumed on NVMe after dedup/compress
# "Logical Used" — what VMs think they're using (before dedup)
# "Savings" — difference between Logical Used and Used
# In vSphere Client:
# Cluster > Monitor > vSAN > Capacity
# "Capacity Overview" shows:
# Total Raw Capacity → Usable Capacity → Used → Free
# Usable = Raw minus overhead (metadata, checksums, slack)
# For accurate VM-level capacity:
# VM > Summary > Storage
# "Provisioned" = VMDK file size
# "Used" = actual space on ESA datastore (after dedup/compress)
Maximize dedup/compression efficiency
# Workload tips for better dedup ratios:
# 1. Use thin-provisioned VMDKs (default in ESA)
# VM > Edit Settings > Hard Disk > Type: "Thin Provision"
#
# 2. Zero-fill free space inside guest OS:
# Windows: sdelete -z C:\
# Linux: cat /dev/zero > /tmp/zero.fill; rm -f /tmp/zero.fill
# This allows ESA to dedup zero blocks efficiently
#
# 3. Use the same OS template for VDI/similar VMs
# ESA dedup will identify common OS blocks across VMs
#
# 4. Avoid pre-encrypted data at the guest level
# Guest-level encryption (BitLocker/LUKS) prevents dedup
# Use vSAN encryption instead (encrypts after dedup)
# Monitor dedup efficiency over time:
# Cluster > Monitor > vSAN > Capacity
# Track the savings ratio weekly — it should stabilize after initial data load
Check current balance state
# In vSphere Client:
# Cluster > Monitor > vSAN > Capacity
# Review "Host Capacity Usage" — look for outliers
# Cluster > Monitor > vSAN > Health
# Expand "Data" section > "Disk balance"
# Shows: Variance %, Most used host, Least used host
# From ESXi Shell:
esxcli vsan health cluster list | grep -i "balance"
# Get per-device usage:
esxcli vsan storage list
# Compare "Used Capacity" across all devices on all hosts
Trigger manual rebalance if automatic has not kicked in
# vSAN automatically rebalances when variance exceeds 30%
# To trigger a proactive rebalance:
# In vSphere Client:
# Cluster > Monitor > vSAN > Health
# Click on "Disk balance" health check
# Click "Rebalance Disks" button
# This starts a background proactive rebalance operation
# Data moves from over-utilized hosts to under-utilized hosts
# Monitor rebalance progress:
# Cluster > Monitor > vSAN > Resyncing Objects
# Rebalance operations appear as "Rebalance" type resyncs
Address root cause — heterogeneous device configuration
# If hosts have different NVMe counts/sizes, consider:
# 1. Add NVMe devices to under-provisioned hosts to match capacity
# 2. Replace smaller NVMe with larger ones during maintenance windows
# Check per-host device count and sizes:
# For each host:
esxcli nvme device list
esxcli vsan storage list | grep "Capacity"
# Ideal ESA config: ALL hosts have identical NVMe device count and size
# Example: 4 hosts × 6 × 3.84TB NVMe each = 92.16TB raw per host
# If adding a new device to an existing host:
# Host > Configure > vSAN > Disk Management > Claim Unused Disks
# vSAN will gradually place new object components on the fresh device
Check current NVMe firmware versions
# On each ESXi host:
esxcli nvme device list
# Note: Firmware Revision for each device
# Or from vSphere Client:
# Host > Configure > vSAN > Disk Management
# Each NVMe device shows firmware version
# Check vLCM compliance:
# Cluster > Updates > Image > Check Compliance
# Firmware tab shows which hosts need updates
Validate vSAN health before starting
# ALL of these must be green before proceeding:
esxcli vsan health cluster list
# In vSphere Client:
# Cluster > Monitor > vSAN > Health
# Critical checks:
# - "Cluster health — All hosts contributing to cluster"
# - "Data — vSAN object health"
# - "Network — All hosts have unicast connectivity"
# Verify no active resyncs:
# Cluster > Monitor > vSAN > Resyncing Objects
# Must show 0 resyncing objects
# Check capacity headroom for maintenance mode evacuation:
# Cluster > Monitor > vSAN > Capacity
# Free space must accommodate one host's worth of data
Initiate rolling remediation via vLCM
# In vSphere Client:
# Cluster > Updates > Image > Remediate
# Select all non-compliant hosts
# Settings:
# - Maintenance Mode: "Ensure data accessibility" (recommended for vSAN)
# - Rolling: Yes (one host at a time — sequential)
# - Retry on failure: Yes (1 retry)
# vLCM will for each host:
# 1. Migrate VMs off (DRS)
# 2. Enter maintenance mode (vSAN data migration)
# 3. Apply firmware update
# 4. Reboot host
# 5. Exit maintenance mode
# 6. Wait for vSAN resync to complete
# 7. Move to next host
# Monitor progress:
# Cluster > Updates > Image > "Remediation" tab
# Shows per-host status and current phase
Post-update validation
# After all hosts are remediated:
# Verify firmware updated:
esxcli nvme device list
# Compare Firmware Revision with target version
# Run full vSAN health check:
esxcli vsan health cluster list
# Verify all objects are healthy:
esxcli vsan debug object health summary get
# Check NVMe device health (SMART data):
esxcli nvme device log smart get -A <vmhbaX>
# Confirm no new errors post-update
# Verify cluster compliance:
# Cluster > Updates > Image > Check Compliance
# All hosts should show "Compliant"
vmkernel.log: "LSOM2: metadata corruption detected on device naa.xxx"Assess the scope of the failure
# Check which objects are affected:
esxcli vsan debug object health summary get
# Note count of: Inaccessible, Reduced Availability, Absent
# Check which device(s) have metadata errors:
esxcli vsan storage list
# Look for devices with "Health: Error" or "Metadata Error"
# Check vmkernel log for LSOM2 errors:
grep -i "LSOM2\|lsom2\|metadata corruption" /var/log/vmkernel.log | tail -50
# Check if vSAN daemon is running:
/etc/init.d/vsand status
# If "not running" — it may be crash-looping
Isolate the affected device — do NOT reboot yet
# If a single NVMe device has metadata corruption:
# Remove it from the storage pool to stop further damage:
esxcli vsan storage remove -d naa.xxxxxxxxxxxxxxxxxxxx
# This will mark all components on this device as "Absent"
# vSAN will begin rebuilding those components from replicas on other hosts
# Verify the rebuild starts:
# vSphere Client > Cluster > Monitor > vSAN > Resyncing Objects
# Objects should begin rebuilding automatically
# If vsand is crash-looping, try restarting it after removing the bad device:
/etc/init.d/vsand restart
# If vsand still won't start, the host may need a reboot:
# Only reboot AFTER verifying vSAN cluster has quorum without this host
Check for ESXi patches that address LSOM2 bugs
# Check current ESXi build:
vmware -vl
# Review VMware/Broadcom patch advisories:
# https://support.broadcom.com > VMware vSAN
# Search for "LSOM2" or "metadata corruption" in known issues
# Common fixes:
# ESXi 8.0 U2a: Fixed LSOM2 crash with specific NVMe controller models
# ESXi 8.0 U3: Fixed metadata corruption during power-loss recovery
# Check your specific build against the release notes
# If a patch is available:
# Plan to update the ESXi host via vLCM after the immediate crisis is resolved
# Do NOT apply patches during an active outage — stabilize first
Replace the failed device and restore full health
# After the corrupted device is removed and resync completes:
# 1. Replace the physical NVMe device (hot-swap or cold-swap)
# 2. Verify new device is visible:
esxcli nvme device list
# 3. Check new device firmware matches the validated version:
esxcli nvme device get -A <vmhbaX>
# 4. Add new device to storage pool:
esxcli vsan storage add -d naa.xxxxxxxxxxxxxxxxxxxx
# 5. Run full health check:
esxcli vsan health cluster list
# 6. Verify all objects are healthy (no absent/degraded):
esxcli vsan debug object health summary get
# Expected: Healthy = 100%, all other counts = 0
# 7. Apply ESXi patch if one is available for the LSOM2 bug
Monitor cluster-wide performance via vSphere Client
# In vSphere Client:
# Cluster > Monitor > vSAN > Performance
# Key metrics to watch:
# - IOPS: Read/Write operations per second (cluster and per-host)
# - Throughput: MB/s read and write
# - Latency: Average read/write latency (target: <500μs for ESA)
# - Congestion: Should be 0 — any value >0 indicates backpressure
# - Outstanding I/O: Queue depth to vSAN — high values indicate saturation
# Per-VM performance:
# VM > Monitor > Performance > Advanced > Virtual Disk
# Select: Read Latency, Write Latency, IOPS, Throughput
# Enable vSAN Performance Service (if not already):
# Cluster > Configure > vSAN > Services > Performance Service > Enable
Check per-device NVMe performance from ESXi Shell
# Real-time NVMe device stats:
esxcli nvme device log smart get -A <vmhbaX>
# Key metrics:
# Data Units Read / Written — lifetime I/O volume
# Host Read/Write Commands — lifetime command count
# Temperature — must be below thermal throttle threshold
# vSAN per-device I/O stats:
esxcli vsan storage list
# Shows: Read Cache Hit Rate (ESA: N/A — no cache tier)
# Shows: Write Buffer Fill % (ESA: handled by LSOM2 log buffer)
# Monitor device queue depth:
esxtop
# Press 'd' for disk view
# Look at QUED (queue depth) and DAVG (device average latency)
# ESA NVMe DAVG should be <200μs for healthy devices
Tune vSAN performance parameters
# ESA generally requires LESS tuning than OSA, but key knobs:
# 1. Resync throttle — balance between resync speed and VM I/O:
# Cluster > Configure > vSAN > Services
# Resync throttle: Low / Medium / High
# Use "Low" during business hours, "High" during maintenance windows
# 2. Verify NVMe queue depth is not artificially limited:
esxcli system settings advanced list -o /Disk/QFullSampleSize
esxcli system settings advanced list -o /Disk/QFullThreshold
# Default values are usually correct for NVMe — do not change unless advised
# 3. Check vSAN network adapter ring buffer size:
esxcli network nic ring current get -n vmnic0
# For 25GbE+: RX should be 4096, TX should be 4096
# If lower, increase:
esxcli network nic ring current set -n vmnic0 -r 4096 -t 4096
# 4. Verify Jumbo Frames are enabled on vSAN vmk:
vmkping -I vmk1 -d -s 8972 <other-host-vSAN-IP>
# If fails: MTU not set to 9000 on all components (vmk, VDS, physical switch)
Baseline performance testing (non-production only)
# Use VMware's built-in vSAN HCL Benchmark tool (Proactive Tests):
# In vSphere Client:
# Cluster > Monitor > vSAN > Health
# "Performance Tests" section > Run Proactive Tests
# Proactive tests measure:
# - Sequential Read/Write throughput per host
# - Random Read/Write IOPS per host
# - Latency under load
# IMPORTANT: Run proactive tests ONLY during maintenance windows
# They generate significant I/O load
# Expected ESA baselines (4 NVMe per host):
# Sequential Read: 3-6 GB/s per host
# Sequential Write: 2-4 GB/s per host
# Random 4K Read IOPS: 200K-400K per host
# Random 4K Write IOPS: 100K-200K per host
# Average Latency: 100-300μs
# If results are significantly below these, investigate:
# - NVMe firmware version (check for known performance bugs)
# - Network MTU / bandwidth
# - Host CPU utilization (LSOM2 is CPU-intensive)
esxcli vsan debug object list shows owner on failed hostIdentify objects with unreachable owners
# From a healthy ESXi host:
esxcli vsan debug object health summary
# Look for "Objects with unreachable owner" count
# Detailed list:
esxcli vsan debug object list | grep -A5 "DOM Owner"
# Cross-reference owner UUID with host UUIDs:
esxcli vsan cluster get
Wait for automatic DOM re-election (preferred)
# vSAN automatically re-elects DOM owners when a host becomes unreachable
# Default timeout: 60 seconds for absent components, up to 140 seconds total
# Monitor progress:
watch -n 5 'esxcli vsan debug object health summary'
# Objects should transition from "unreachable owner" back to "Healthy"
# VMs will auto-resume I/O after re-election completes
If re-election is stuck — force repair
# From RVC on vCenter:
vsan.obj_status_report /dc/computers/cluster-name --filter-incomplete
# Identify stuck objects
# Force object repair (re-creates missing components):
# vSphere Client → Cluster → Monitor → vSAN → Resyncing Objects
# If no resync is happening for stuck objects, restart CLOMD on the
# host that should be the new owner:
/etc/init.d/clomd restart
vsan.dom.owner.forceWarmCache advanced setting. In vSAN 8, DOM ownership tracking is improved for faster failover.