Updated: 2020-03-13.
The following is the PowerShell and sometimes Command based steps we use to set up our ASHCI-K47 cluster nodes.
Note that some steps are optional depending on the environment the node is going in to.
# Set the Console Title $host.UI.RawUI.WindowTitle = "Kepler-47B Node 1 Setup Shell" $host.UI.RawUI.WindowTitle = "Kepler-47B Node 2 Setup Shell" # Variables - These need to be copy and pasted in after a reboot! $Kepler47BNode1 = "Kepler-47B-01" $Kepler47BNode2 = "Kepler-47B-02" $S2DClusterName = "2018-05-01 Kepler-47B S2D" $DomainName = "DOMAIN.COM" $DomainAdminName = "DOMAIN\Admin" $OUPath = "OU=2018-02-08 Kepler-47A Cluster,OU=S2D-Clusters,OU=Main-Office,DC=DC=DOMAIN,DC=Com" # BIOS REV: gwmi win32_ComputerSystem | Select Manufacturer,Model Get-WmiObject win32_bios # BIOS Name Settings Import the .Reg # SERVER NAME Rename-Computer -NewName $Kepler47BNode1 -Restart Rename-Computer -NewName $Kepler47BNode2 -Restart # Check Server Name HostName # JOIN DOMAIN Add-Computer -Domain $DomainName -Credential $DomainAdminName -OUPath $OUPath -Restart # DRIVERS - Need Intel and Mellanox at the minimum gwmi Win32_SystemDriver | select name,@{n="version";e={(gi $_.pathname).VersionInfo.FileVersion}} gwmi Win32_PnPSignedDriver | select devicename,driverversion Get-WmiObject Win32_PNPEntity | Where Status -ne "OK" | Select Name,Status Get-WmiObject Win32_PNPEntity | Where Status -ne "OK" | FL # POWER OPTION - Set MAX POWERCFG.EXE /S SCHEME_MIN # Configure Active memory dump Set-ItemProperty –Path HKLM:\System\CurrentControlSet\Control\CrashControl –Name CrashDumpEnabled –value 1 Set-ItemProperty –Path HKLM:\System\CurrentControlSet\Control\CrashControl –Name FilterPages –value 1 # Check Active Memory Dump Get-ItemProperty –Path HKLM:\System\CurrentControlSet\Control\CrashControl –Name CrashDumpEnabled Get-ItemProperty –Path HKLM:\System\CurrentControlSet\Control\CrashControl –Name FilterPages # Set it back to Automatic memory dump (default) Set-ItemProperty –Path HKLM:\System\CurrentControlSet\Control\CrashControl –Name CrashDumpEnabled –value 7 Remove-ItemProperty –Path HKLM:\System\CurrentControlSet\Control\CrashControl –Name FilterPages –value 1 # INSTALL WINDOWS FEATURES Install-WindowsFeature Hyper-V,Data-Center-Bridging,Failover-Clustering,RSAT-Clustering-Powershell,Hyper-V-PowerShell,Storage-Replica -IncludeAllSubFeature -IncludeManagementTools -Source D:\Sources\SXS -Restart # Without Storage Replica Install-WindowsFeature Hyper-V,Data-Center-Bridging,Failover-Clustering,RSAT-Clustering-Powershell,Hyper-V-PowerShell -IncludeAllSubFeature -IncludeManagementTools -Source D:\Sources\SXS -Restart # Verify Features Get-WindowsFeature | where {$_.installed -eq $true} | select DisplayName, Name, Installed # ENABLE Enhanced Session Mode Set-VMhost -EnableEnhancedSessionMode $TRUE # NETWORKING netsh advfirewall firewall add rule name="ICMP Allow incoming V4 echo request" protocol=icmpv4:8,any dir=in action=allow # NETWORKING SETUP - ADAPTER NAME Get-NetAdapter | Sort MacAddress | Select Name,InterfaceDescription,MacAddress,LinkSpeed Get-NetAdapter | Sort MacAddress | Select Name,InterfaceDescription,MacAddress Get-NetAdapter |? Name -NotLike vEthernet* |? InterfaceDescription -Like Intel*tion | Rename-NetAdapter -NewName SvSwith-01 Get-NetAdapter |? Name -NotLike vEthernet* |? InterfaceDescription -Like Intel*LM | Rename-NetAdapter -NewName SvSwith-02 # NODE 1 and 2 Get-Netadapter |? Name -Like Ethernet* |? InterfaceDescription -like Mellanox*#2 | Rename-NetAdapter -NewName EW-LM-101 Get-Netadapter |? Name -Like Ethernet* |? InterfaceDescription -like Mellanox*Adapter | Rename-NetAdapter -NewName EW-LM-102 # NODE 2 if the above is reversed Get-Netadapter |? Name -Like Ethernet* |? InterfaceDescription -like Mellanox*Adapter | Rename-NetAdapter -NewName EW-LM-101 Get-Netadapter |? Name -Like Ethernet* |? InterfaceDescription -like Mellanox*#2 | Rename-NetAdapter -NewName EW-LM-102 # NETWORKING SETUP - VLAN Set-NetAdapter -Name EW-LM-101 -VlanID 101 -Confirm:$False Set-NetAdapter -Name EW-LM-102 -VlanID 102 -Confirm:$False Get-NetAdapterAdvancedProperty |? DisplayName -Like VLAN* | Select Name,DisplayName,DisplayValue # NETWORKING SETUP - JUMBO FRAMES Get-NetAdapterAdvancedProperty -Name EW-LM* -RegistryKeyword "*jumbopacket" | Set-NetAdapterAdvancedProperty -RegistryValue 9014 Get-NetAdapterAdvancedProperty -Name * -RegistryKeyword "*jumbopacket" | Sort Name # RDMA Get-NetAdapter *EW-LM* | Enable-NetAdapterRDMA Get-NetAdapterRDMA # TEAMING and IP ADDRESS ASSIGNMENT Set-DNSClient -InterfaceAlias EW* -RegisterThisConnectionsAddress $False New-NetLbfoTeam -Name SvSwitch -TeamMembers SVS* -Confirm:$False New-VMSwitch -Name vSwitch -NetAdapterName SvSwitch -AllowManagementOS 1 New-NetIPAddress -InterfaceAlias "vEthernet (Management-0)" -IPAddress 10.10.0.5 -PrefixLength 24 -Type Unicast | Out-Null Set-DnsClientServerAddress -InterfaceAlias "vEthernet (Management-0)" -ServerAddresses 10.10.0.20 | Out-Null New-NetIPAddress -InterfaceAlias "vEthernet (Cluster-100)" -IPAddress 10.10.100.5 -PrefixLength 24 -Type Unicast | Out-Null # NODE 1 East-West and Live Migration Subnets New-NetIPAddress -InterfaceAlias "EW-LM-101" -IPAddress 10.101.100.10 -PrefixLength 24 -Type Unicast | Out-Null New-NetIPAddress -InterfaceAlias "EW-LM-102" -IPAddress 10.102.100.10 -PrefixLength 24 -Type Unicast | Out-Null # NODE 2 East-West and Live Migration Subnets New-NetIPAddress -InterfaceAlias "EW-LM-101" -IPAddress 10.101.100.20 -PrefixLength 24 -Type Unicast | Out-Null New-NetIPAddress -InterfaceAlias "EW-LM-102" -IPAddress 10.102.100.20 -PrefixLength 24 -Type Unicast | Out-Null # REMOVE If Necessary Remove-NetIPAddress -InterfaceAlias "EW-LM-101" -IPAddress 10.101.100.100 -PrefixLength 24 -Type Unicast -Confirm:$False | Out-Null Remove-NetIPAddress -InterfaceAlias "EW-LM-102" -IPAddress 10.102.100.100 -PrefixLength 24 -Type Unicast -Confirm:$False | Out-Null Get-NetIPAddress |? AddressFamily -Like IPv4 |? InterfaceAlias -NotLike "lo*" | FT IPAddress,InterfaceAlias Get-NetIPAddress |? AddressFamily -Like IPv4 | FT IPAddress,InterfaceAlias # TEST Jumbo Frames # NODE1 ping 10.101.100.20 -l 9014 ping 10.102.100.20 -l 9014 # NODE2 ping 10.101.100.10 -l 9014 ping 10.102.100.10 -l 9014 # TEST and CLUSTER Test-Cluster $Kepler47BNode1,$Kepler47BNode2 -Include "Storage Spaces Direct",Inventory,Network,"System Configuration" New-Cluster 180315-S2DCL -Node $Kepler47BNode1,$Kepler47BNode2 -NoStorage # Disable NETBIOS Get-ClusterResource “Cluster IP address” -Cluster 180315-S2DCL | Set-ClusterParameter EnableNetBIOS 0 # NetBIOS over TCP/IP controls for vNics Get Code: $vNic = Get-NetAdapter -CimSession $wc -name "vEthernet (Storage1)","vEthernet (Storage2)","vEthernet (Mgmt)" $wmiNicList = $vNic | % { $thisnic = $_; Get-WmiObject -class win32_networkadapterconfiguration -ComputerName $thisNic.pscomputerName | where {$_.Description -eq $thisnic.InterfaceDescription} } $wmiNicList | sort PsComputerName, Description | select PSComputerName, Description, tcpIpNetbiosoptions # CLEAN NODE DISKS ****DANGER DESTRUCTIVE**** # Used when we have had a Storage Spaces Direct cluster set up previously icm (Get-Cluster -Name $S2DClusterName | Get-ClusterNode) { Update-StorageProviderCache Get-StoragePool |? IsPrimordial -eq $false | Set-StoragePool -IsReadOnly:$false -ErrorAction SilentlyContinue Get-StoragePool |? IsPrimordial -eq $false | Get-VirtualDisk | Remove-VirtualDisk -Confirm:$false -ErrorAction SilentlyContinue Get-PhysicalDisk | Reset-PhysicalDisk -ErrorAction SilentlyContinue Get-Disk |? Number -ne $null |? IsBoot -ne $true |? IsSystem -ne $true |? PartitionStyle -ne RAW |% { $_ | Set-Disk -isoffline:$false $_ | Set-Disk -isreadonly:$false $_ | Clear-Disk -RemoveData -RemoveOEM -Confirm:$false $_ | Set-Disk -isreadonly:$true $_ | Set-Disk -isoffline:$true } Get-Disk |? Number -ne $null |? IsBoot -ne $true |? IsSystem -ne $true |? PartitionStyle -eq RAW | Group -NoElement -Property FriendlyName } | Sort -Property PsComputerName,Count # CHECK DISKS Get-PhysicalDisk | FT FriendlyName,CanPool,MediaType # Cluster Quorum - Azure CW Set-ClusterQuorum -CloudWitness -AccountName AzureCloudWitnessAA01 -AccessKey 00gaB00ga # CLUSTER NETWORK # NODE1 Get-ClusterNetwork (Get-ClusterNetwork -Name "Cluster Network 1").Name="EW-LM-102" (Get-ClusterNetwork -Name "Cluster Network 2").Name="EW-LM-101" (Get-ClusterNetwork -Name "Cluster Network 3").Name="SvSwitch" (Get-ClusterNetwork | where-object {$_.Address -eq "10.101.100.10"}).Name = "EW-LM-101" (Get-ClusterNetwork | where-object {$_.Address -eq "10.102.100.10"}).Name = "EW-LM-102" # NODE FAIRNESS (Get-Cluster).AutoBalancerMode = 2 (Get-Cluster).AutoBalancerLevel = 2 # Stand up the S2D CLUSTER with several variations Enable-ClusterS2D -Confirm:$False Enable-ClusterS2D -PoolFriendlyName 'S2D' -CollectPerformanceHistory $True Enable-ClusterStorageSpacesDirect # STORAGE POOL CSV SETUP FOR PRODUCTION New-Volume -StoragePoolFriendlyName "S2D*" -FriendlyName "CSV-01-Guest-OS" -FileSystem CSVFS_ReFS -Size 900GB Rename-Item -Path C:\ClusterStorage\volume1\ -NewName "CSV-01-Guest-OS" New-Volume -StoragePoolFriendlyName "S2D*" -FriendlyName "CSV-02-Guest-OS" -FileSystem CSVFS_ReFS -Size 900GB Rename-Item -Path C:\ClusterStorage\volume1\ -NewName "CSV-02-Guest-OS" New-Volume -StoragePoolFriendlyName "S2D*" -FriendlyName "CSV-03-Guest-Data" -FileSystem CSVFS_ReFS -Size 5TB Rename-Item -Path C:\ClusterStorage\volume1\ -NewName "CSV-03-Guest-Data" New-Volume -StoragePoolFriendlyName "S2D*" -FriendlyName "CSV-04-Guest-Data" -FileSystem CSVFS_ReFS -Size 5TB Rename-Item -Path C:\ClusterStorage\volume1\ -NewName "CSV-04-Guest-Data" # Set VM Configuration paths Set-VMHOST –computername $Kepler47BNode1 –virtualharddiskpath 'C:\ClusterStorage\CSV-01-Guest-OS' Set-VMHOST –computername $Kepler47BNode1 –virtualmachinepath 'C:\ClusterStorage\CSV-03-Guest-Data' Set-VMHOST –computername $Kepler47BNode2 –virtualharddiskpath 'C:\ClusterStorage\CSV-02-Guest-OS' Set-VMHOST –computername $Kepler47BNode2 –virtualmachinepath 'C:\ClusterStorage\CSV-04-Guest-Data' # KCD Kerberos Constrained Delegation $Domain = "DOMAIN.COM" $HyvHost = "$Kepler47BNode1" Get-ADComputer $Kepler47BNode2 | Set-ADObject -Add @{"msDS-AllowedToDelegateTo"="Microsoft Virtual System Migration Service/$HyvHost.$Domain", "cifs/$HyvHost.$Domain","Microsoft Virtual System Migration Service/$HyvHost", "cifs/$HyvHost"} Get-ADComputer S2D-DC01 | Set-ADObject -Add @{"msDS-AllowedToDelegateTo"="Microsoft Virtual System Migration Service/$HyvHost.$Domain", "cifs/$HyvHost.$Domain","Microsoft Virtual System Migration Service/$HyvHost", "cifs/$HyvHost"} Get-ADComputer S2D-DC02 | Set-ADObject -Add @{"msDS-AllowedToDelegateTo"="Microsoft Virtual System Migration Service/$HyvHost.$Domain", "cifs/$HyvHost.$Domain","Microsoft Virtual System Migration Service/$HyvHost", "cifs/$HyvHost"} $HyvHost = "$Kepler47BNode2" Get-ADComputer $Kepler47BNode1 | Set-ADObject -Add @{"msDS-AllowedToDelegateTo"="Microsoft Virtual System Migration Service/$HyvHost.$Domain", "cifs/$HyvHost.$Domain","Microsoft Virtual System Migration Service/$HyvHost", "cifs/$HyvHost"} Get-ADComputer S2D-DC01 | Set-ADObject -Add @{"msDS-AllowedToDelegateTo"="Microsoft Virtual System Migration Service/$HyvHost.$Domain", "cifs/$HyvHost.$Domain","Microsoft Virtual System Migration Service/$HyvHost", "cifs/$HyvHost"} Get-ADComputer S2D-DC02 | Set-ADObject -Add @{"msDS-AllowedToDelegateTo"="Microsoft Virtual System Migration Service/$HyvHost.$Domain", "cifs/$HyvHost.$Domain","Microsoft Virtual System Migration Service/$HyvHost", "cifs/$HyvHost"} # LIVE MIGRATION SETUP Enable-VMMigration –Computername $Kepler47BNode1, $Kepler47BNode2 Set-VMHost -MaximumVirtualMachineMigrations 4 –MaximumStorageMigrations 4 –VirtualMachineMigrationPerformanceOption SMB -ComputerName $Kepler47BNode1,$Kepler47BNode2 Set-VMHost –Computername $Kepler47BNode1, $Kepler47BNode2 –VirtualMachineMigrationAuthenticationType Kerberos Get-ClusterResource | Get-ClusterParameter