Nutanix AHV and Citrix MCS: Adding a persistent disk via Powershell
4 min read
Archive notice (October 2026): This post is from 2019 and stays online for reference. The script uses the legacy NutanixCmdletsPSSnapin, which only runs in Windows PowerShell 5.1, and the legacy Prism APIs behind these cmdlets are deprecated starting with the AOS and Prism Central release planned for Q4 2026. Don’t run it against a current cluster. For new automation, use the Nutanix v4 API or the v4 PowerShell modules such as Nutanix.Vmm (PowerShell 7). The v2 of this post adds an in-guest script that brings the new disk online. For the current view on MCS storage on AHV, read Citrix MCSIO on Nutanix AHV: A Solution to a Problem That Doesn’t Exist.

Yet another powershell blog, this one is about adding a persistent disk via powershell on an AHV hosted non-persistent VM created with Citrix MCS. The use case here would be persistent write cache for App-V cache, AV definitions, log files etc.
Here’s another blogpost about writing scripts, just to make sure; the last few scripts can be found here:
- Creating a VM including a vGPU profile on AHV with Powershell
- Making sure your Citrix Desktops are utilized with Powershell v2
- Nutanix AHV: Creating a new VM using PowerShell
One of the comments I hear from time to time on using MCS vs PVS is the option to have a writeable volume added to the Target VM for things like AV definitions, logfiles and App-V or UEM caches. Albeit fully supported by Citrix there’s no UI workflow in Studio to add this persistent disk using Citrix MCS. This means you’ll have to assign that secondary disk using other means, in my world this typically means scripting.
Using Nutanix ACLI this should be pretty straightforward and my options are outlined by -tab-:
vm.disk_create KBTestVM91 bus= Device bus cdrom= Indicates if the disk is a CDROM drive clone_from_adsf_file= Path to an ADSF file clone_from_image= An image name/UUID clone_from_vmdisk= A vmdisk UUID clone_min_size= Minimum size of the resulting clone (only applies to cloned disks) container= Container (only applies to newly-created disks) create_size= Size of new disk device_uuid= Device UUID empty= Whether the disk is empty (only applies to CDROMs) index= Device index on bus scsi_passthru= Passthrough disk?
A simple onliner could be used to add a 10Gb disk to this VM:
vm.disk_create KBTestVM91 bus=scsi container=VDI create_size=10G
Although this is a good start it doesn’t allow us for bulk changing VMs and it doesn’t allow a wildcard for the VM name so back to posh to loop through the VMs and add a disk based on a wildcard:
# kees@nutanix.com
# @kbaggerman on Twitter
# https://blog.myvirtualvision.com
# Created on March 4, 2019
# Setting parameters for the connection
[CmdletBinding(SupportsShouldProcess = $False, ConfirmImpact = "None") ]
Param(
# Nutanix cluster IP address
[Parameter(Mandatory = $true)]
[Alias('IP')] [string] $nxIP,
# Nutanix cluster username
[Parameter(Mandatory = $true)]
[Alias('User')] [string] $nxUser,
# Nutanix cluster password
[Parameter(Mandatory = $true)]
[Alias('Password')] [System.Security.SecureString] $nxPassword
)
# Adding PS cmdlets
$loadedsnapins=(Get-PSSnapin -Registered | Select-Object name).name
if(!($loadedsnapins.Contains("NutanixCmdletsPSSnapin"))){
Add-PSSnapin -Name NutanixCmdletsPSSnapin
}
if ($null -eq (Get-PSSnapin -Name NutanixCmdletsPSSnapin -ErrorAction SilentlyContinue))
{
write-log -message "Nutanix CMDlets are not loaded, aborting the script"
break
}
Function write-log {
<#
.Synopsis
Write logs for debugging purposes
.Description
This function writes logs based on the message including a time stamp for debugging purposes.
#>
param (
$message,
$sev = "INFO"
)
if ($sev -eq "INFO"){
write-host "$(get-date -format "hh:mm:ss") | INFO | $message"
} elseif ($sev -eq "WARN"){
write-host "$(get-date -format "hh:mm:ss") | WARN | $message"
} elseif ($sev -eq "ERROR"){
write-host "$(get-date -format "hh:mm:ss") | ERROR | $message"
} elseif ($sev -eq "CHAPTER"){
write-host "`n`n### $message`n`n"
}
}
# Connecting to the Nutanix Cluster
$nxServerObj = Connect-NTNXCluster -Server $nxIP -UserName $nxUser -Password $nxPassword -AcceptInvalidSSLCerts
if ($null -eq (get-ntnxclusterinfo))
{
write-log -message "Cluster connection isn't available, abborting the script"
break
}
## VM Creation
# Setting Variables
$VMPrefix = Read-Host -Prompt 'Input your VM Prefix including the wildcard (*)'
# Searching for the VM defined
write-log -message "Searching for VMs with the prefix $VMPrefix"
$vminfo = Get-NTNXVM | Where-Object {$_.vmName -like $VMPrefix}
# Looping thru all VMs starting with the prefix and adding a disk
Foreach ($vm in $vminfo) {
Try
{
$vmId = ($vm.vmid.split(":"))[2]
write-log -message "VM found matching the naming: $($vm.vmName) and VM ID $($vmID)"
## Disk Creation
Try
{
# Setting a SCSI disk of 12400 MB (about 12 GB) on Container ID (get-ntnxcontainer -> ContainerId)
$diskCreateSpec = New-NTNXObject -Name VmDiskSpecCreateDTO
$diskcreatespec.containerid = 1265
$diskcreatespec.sizeMb = 12400
# Creating the Disk
$vmDisk = New-NTNXObject –Name VMDiskDTO
$vmDisk.vmDiskCreate = $diskCreateSpec
# Adding the Disk to the VM
Add-NTNXVMDisk -Vmid $vmId -Disks $vmDisk | out-null
write-log -message "Adding a 2nd disk to $($vm.vmName)"
}
Catch
{
write-log -message "Failed to add a 2nd disk to $vm.vmName"
}
}
Catch
{
write-log -message "Could not find a VM with the name $($vm.vmName)"
}
}
Disconnect-NTNXCluster *
write-log -message "Disconnecting from the cluster"
This resulted in the following output when running it against my AHV cluster:

Kees Baggerman
Latest posts by Kees Baggerman (see all)
- The Cloud Desktop CPU Lottery, AMD Edition: Which Zen Are You Actually Running On? - October 23, 2026
- Citrix MCSIO on Nutanix AHV: A Solution to a Problem That Doesn’t Exist - June 10, 2026
- The Cloud Desktop CPU Lottery: What Are You Actually Running On? - June 2, 2026
- Your Cloud Desktop Is Running on Yesterday’s Silicon - May 21, 2026
- When the Orchard Ships Production Software: AI-Augmented Development in the Real World - May 17, 2026


One Comment