2+ identical Windows Server 2012 R2 hosts with hardware virtualization + latest BIOS/firmware
Joined to the same AD domain, healthy DNS, accurate time (NTP)
Shared storage reachable by all hosts (iSCSI, Fibre Channel, or SMB 3.0 for Hyper-V)
At least 3 networks (recommended):
Management (host/cluster/AD)
Live Migration (and/or SMB Direct if you have RDMA)
Storage (iSCSI/SMB3) — never route this over the mgmt network
Service/RunAs account for VMM with local admin on hosts and AD rights for cluster object creation (details below)
1) Active Directory prep (cluster object permissions)
Failover clustering creates a Cluster Name Object (CNO) in AD.
Put your Hyper-V hosts into an OU.
Either:
Pre-stage the CNO (create a disabled computer object “HVCLU01”), and grant the host computer objects “Full Control” on it, or
Grant the hosts (or the VMM RunAs account) Create Computer Objects on that OU.
This avoids classic “logon type” / “cannot create computer object” errors during cluster creation.
Run these on each node (elevated PowerShell):
# Hyper-V, Failover Clustering, MPIO, and tools
Install-WindowsFeature Hyper-V, Failover-Clustering, Multipath-IO -IncludeManagementTools
# Optional: enable MPIO for iSCSI
mpclaim.exe -r -i -a "VEN_MSFT&PROD_iSCSI" # adjust to your array’s Vendor/Product as needed
# (If you’ll use SMB Direct/RDMA)
Enable-NetAdapterRDMA -Name "NIC-LM","NIC-Storage"
# Create a NIC Team (LBFO) for Management/VM traffic (optional, example)
New-NetLbfoTeam -Name "Team0" -TeamMembers "NIC1","NIC2" -TeamingMode SwitchIndependent -LoadBalancingAlgorithm Dynamic
# Create a Hyper-V vSwitch on the team
New-VMSwitch -Name "vSwitch-Prod" -NetAdapterName "Team0" -AllowManagementOS $true
Network tips (2012 R2):
Keep Live Migration on its own high-bandwidth network (enable Compression or SMB LM later).
Use Jumbo frames consistently on storage/LM if your network supports it.
If using SMB 3.0 storage or SMB-based Live Migration, enable RDMA (RoCE/iWARP) where possible.
On each host:
# Start iSCSI service
Set-Service MSiSCSI -StartupType Automatic
Start-Service MSiSCSI
# Discover & connect targets
New-IscsiTargetPortal -TargetPortalAddress "10.10.40.10"
Get-IscsiTarget | Connect-IscsiTarget -IsPersistent $true -IsMultipathEnabled $true
Bring new LUNs online, initialize GPT, create volumes (NTFS for CSV on 2012 R2), no drive letters needed (Cluster will re-present as C:\ClusterStorage\...).
Don’t put anything on them yet; clustering will convert to CSVFS layer.
For SMB 3.0 (Scale-Out File Server): present a continuously available SMB share from SOFS to all Hyper-V hosts; CSV step is not used in that model.
# Optional: set default VM paths now or let VMM control later
Set-VMHost -VirtualMachinePath "D:\VMs" -VirtualHardDiskPath "D:\VMs\VHDs"
On one host (or any admin workstation with the tools):
# Validation (must be clean)
Test-Cluster -Node HVHOST01,HVHOST02 -Include "Inventory","Network","Storage"
# Create the cluster (without grabbing storage yet)
New-Cluster -Name "HVCLU01" -Node HVHOST01,HVHOST02 -StaticAddress 10.10.10.50 -NoStorage
# Optional: set quorum to a file share witness or disk witness
Set-ClusterQuorum -FileShareWitness "\\fileserver\witness$"
Add disks into the cluster, then convert to CSV:
# See available cluster disks
Get-ClusterAvailableDisk | Add-ClusterDisk
# Convert selected disks to CSV (repeat per disk)
Add-ClusterSharedVolume -Name "Cluster Disk 1"
You’ll see them under C:\ClusterStorage\Volume1, Volume2, etc.
Mark cluster networks for their intended roles:
# List cluster networks
Get-ClusterNetwork | ft Name, Address, Role
# Example: Storage network = ClusterOnly, LM network = ClusterAndClient
(Get-ClusterNetwork "StorageNet").Role = 1 # ClusterOnly
(Get-ClusterNetwork "LiveMigrationNet").Role = 3 # ClusterAndClient
# Live Migration: prefer LM network, enable compression (2012 R2 feature)
(Get-VMHost).VirtualMachineMigrationPerformanceOption = "Compression"
Set-VMHost -VirtualMachineMigrationEnabled $true -VirtualMachineMigrationAuthenticationType CredSSP -VirtualMachineMigrationMaximum 4
# Make sure LM network metrics prefer the LM VLAN/subnet
Set-ClusterNetwork -Name "LiveMigrationNet" -Metric 100
Set-ClusterNetwork -Name "ManagementNet" -Metric 1000
On one host:
# Quick test VM on CSV
New-VM -Name "TestVM01" -MemoryStartupBytes 2GB -Generation 2 -Path "C:\ClusterStorage\Volume1\VMs" -SwitchName "vSwitch-Prod"
New-VHD -Path "C:\ClusterStorage\Volume1\VMs\TestVM01\TestVM01.vhdx" -SizeBytes 60GB -Dynamic
Add-VMHardDiskDrive -VMName "TestVM01" -Path "C:\ClusterStorage\Volume1\VMs\TestVM01\TestVM01.vhdx"
Start-VM TestVM01
Move-ClusterVirtualMachineRole -Name "TestVM01" -Node HVHOST02 # Live migrate test
Install VMM 2012 R2 + latest Update Rollup, SQL instance, and VMM Library.
Create a Run As Account (e.g., VMM-SVC) that is:
Local admin on hosts
Has AD rights to create the cluster CNO (or you pre-staged the CNO)
Add your hosts:
Fabric ➜ Servers ➜ Add Resources ➜ Hyper-V Hosts and Clusters ➜ Add by Windows Server Computers in a trusted AD domain ➜ choose RunAs.
(Optional but strongly recommended) Model networking in VMM:
Logical Network(s) (e.g., Prod, LiveMigration, Storage)
IP Pools for each as needed
Port Classifications (e.g., “Host Mgmt”, “VM Prod”)
Uplink Port Profiles and a Logical Switch (SR-IOV, RSS, etc. per your NICs)
Apply the Logical Switch to each host’s NIC team
Storage integration (optional):
Add your storage provider (SMI-S, SMB SOFS) to VMM (Fabric ➜ Storage).
Classify storage (e.g., Gold/Silver) and assign LUNs to the cluster via VMM.
Create (or import) the cluster in VMM:
If the cluster already exists, VMM will discover it when you add both hosts in the same Host Group.
Or use Create Host Cluster wizard in VMM to build it end-to-end.
Place VMs via VMM onto CSV paths under C:\ClusterStorage\….
Use Availability Sets for anti-affinity, and set Preferred Owners/VM priority if needed.
CSV on NTFS for 2012 R2 (ReFS v1 back then lacked needed Hyper-V features).
One CSV per tenant/tier is common; don’t overload a single CSV.
ODX, UNMAP, and MPIO: enable where supported by your array.
Keep host pagefile and temp files off CSV.
Antivirus: exclude C:\ClusterStorage, VM process/hypervisor files (per MS AV guidance).
Use Cluster-Aware Updating (CAU) or VMM Servicing to live-migrate VMs and patch nodes one at a time.
In VMM: Drain a host (maintenance mode), patch, reboot, return to service.
VMM + SCOM (optional) for performance/health.
Backup: VSS-aware Hyper-V solution targeting host-level backups, not in-guest only.
Make sure backup vendors support CSV redirection during snapshot operations on 2012 R2.
Cluster creation fails with computer object/CNO errors
→ Pre-stage the CNO disabled, or grant Create Computer Objects on the hosts’ OU to the hosts or VMM RunAs.
Logon failure / “allow log on locally” type issues for service accounts
→ The VMM RunAs account needs to be local admin on hosts; ensure domain policy isn’t blocking interactive/remote logon required by agents.
Disks won’t release / stuck as “clustered” after a failed attempt
→ Use Get-ClusterResource/Remove-ClusterResource or Clear-ClusterDiskReservation on each node; worst case, offline LUN to all nodes then re-present cleanly.
Live Migration slow
→ Switch to Compression or SMB-based LM and ensure a dedicated high-bandwidth network; verify Jumbo/RDMA end-to-end.
# On each host
Install-WindowsFeature Hyper-V, Failover-Clustering, Multipath-IO -IncludeManagementTools
New-NetLbfoTeam -Name Team0 -TeamMembers NIC1,NIC2 -TeamingMode SwitchIndependent -LoadBalancingAlgorithm Dynamic
New-VMSwitch -Name vSwitch-Prod -NetAdapterName Team0 -AllowManagementOS $true
# iSCSI (each host)
Set-Service MSiSCSI -StartupType Automatic; Start-Service MSiSCSI
New-IscsiTargetPortal -TargetPortalAddress 10.10.40.10
Get-IscsiTarget | Connect-IscsiTarget -IsPersistent $true -IsMultipathEnabled $true
# Create the cluster (one time)
Test-Cluster -Node HVHOST01,HVHOST02 -Include "Inventory","Network","Storage"
New-Cluster -Name HVCLU01 -Node HVHOST01,HVHOST02 -StaticAddress 10.10.10.50 -NoStorage
Set-ClusterQuorum -FileShareWitness \\fileserver\witness$
# Add disks & convert to CSV
Get-ClusterAvailableDisk | Add-ClusterDisk
Add-ClusterSharedVolume -Name "Cluster Disk 1"
# Live Migration tuning
(Get-VMHost).VirtualMachineMigrationPerformanceOption = "Compression"
Set-VMHost -VirtualMachineMigrationEnabled $true -VirtualMachineMigrationAuthentic