Convertire una macchina virtuale Azure da controller SCSI a NVMe
Qualche giorno fa ho pubblicato l’articolo Abilitare Native NVMe in Windows Server 2025, nel quale abbiamo visto come il nuovo stack Native NVMe permetta a Windows Server 2025 di comunicare con i dispositivi NVMe senza utilizzare il tradizionale livello di traduzione basato sui comandi SCSI.
Dopo aver letto l’articolo, un corsista mi ha chiesto se fosse possibile utilizzare NVMe anche all’interno delle macchine virtuali e ottenere gli stessi vantaggi negli ambienti virtualizzati. La risposta dipende naturalmente dal virtualizzatore e dal tipo di controller esposto alla macchina virtuale. Nel caso di Microsoft Azure, alcune delle VM di nuova generazione utilizzano un controller NVMe grazie ad Azure Boost.
Avevo già affrontato l’argomento nell’articolo Azure VM serie 6 e Azure Boost: meno overhead, più prestazioni, nel quale abbiamo visto come Azure Boost sposti parte delle operazioni di rete, storage e virtualizzazione su hardware dedicato.
Tra le novità più interessanti di diverse VM serie v6 compatibili con Azure Boost troviamo l’utilizzo dell’interfaccia NVMe per l’accesso ai dischi.
Approfondendo l’argomento, ho trovato la procedura ufficiale Microsoft che permette di convertire una macchina virtuale Azure da SCSI a NVMe. Ho quindi deciso di provarla in laboratorio e di documentare tutti i passaggi necessari.
In questa guida vedremo come convertire una VM Azure che utilizza un controller SCSI in una VM dotata di controller NVMe, effettuando contemporaneamente il ridimensionamento verso una SKU compatibile. Vedremo inoltre come gestire il disco temporaneo, preparare il sistema operativo, eseguire lo script ufficiale di conversione e verificare che la migrazione sia stata completata correttamente.
È importante chiarire fin da subito che la procedura non sostituisce e non converte i Managed Disk. Modifica invece il controller attraverso il quale il sistema operativo accede ai dischi e, tramite il parametro FixOperatingSystemSettings, alcune impostazioni necessarie per avviare Windows con NVMe. Questa conversione non abilita automaticamente Native NVMe in Windows Server 2025, che riguarda invece lo stack di archiviazione interno del sistema operativo.
Scenario di partenza
Per effettuare la prova ho utilizzato una macchina virtuale Azure denominata TEST001, configurata con la dimensione Standard_D4s_v3. Si tratta di una VM appartenente a una generazione precedente rispetto alle nuove serie v6 e che espone i dischi al sistema operativo attraverso controller SCSI.
Prima di iniziare la conversione potete verificare il tipo di controller direttamente all’interno del sistema operativo. Aprite Gestione dispositivi ed espandete la sezione Controller di archiviazione. Nella configurazione iniziale della VM sono presenti due Microsoft Hyper-V SCSI Controller.
Potete ottenere un’ulteriore conferma aprendo Gestione attività, selezionando la scheda Prestazioni e facendo clic sui dischi disponibili. Nel mio caso, sia il disco di sistema C: sia il disco temporaneo D: vengono mostrati come HDD (SAS). Questa indicazione descrive il modo in cui Windows vede i dischi virtuali e non la tecnologia fisica utilizzata dall’infrastruttura di storage Azure.
L’obiettivo della prova è ridimensionare la VM come Standard_E4s_v6 e sostituire il controller SCSI con un controller NVMe, senza reinstallare il sistema operativo o sostituire il Managed Disk.

Figura 1: Configurazione iniziale della VM TEST001 con controller Microsoft Hyper-V SCSI e dischi esposti al sistema operativo tramite interfaccia SAS
Registrazione della funzionalità VMTempDiskResizePreview
La VM Standard_D4s_v3 dispone di un disco temporaneo locale, generalmente utilizzato per il file di paging di Windows o per lo swap di Linux. Questo disco risiede sul server fisico che ospita la VM, non è un Managed Disk e non deve contenere dati persistenti.
La VM di destinazione Standard_E4s_v6 non dispone dello stesso tipo di disco temporaneo. Per consentire il ridimensionamento tra SKU con caratteristiche differenti è quindi necessario registrare la funzionalità VMTempDiskResizePreview, attualmente in preview.
Aprite Azure Cloud Shell, selezionate PowerShell ed eseguite:
|
1 2 |
Register-AzProviderFeature -FeatureName VMTempDiskResizePreview -ProviderNamespace Microsoft.Compute |
Al termine del comando controllate il valore della proprietà RegistrationState. Quando viene visualizzato lo stato Registered, la funzionalità è disponibile nella sottoscrizione e potete procedere con i passaggi successivi.
Se lo stato non cambia immediatamente, attendete circa 10 minuti, come indicato nella documentazione Microsoft, e verificate nuovamente la registrazione prima di eseguire lo script di conversione.

Figura 2: Registrazione della funzionalità VMTempDiskResizePreview per il ridimensionamento di una VM dotata di disco temporaneo locale
Prerequisiti
Prima di procedere verificate che la SKU di destinazione supporti NVMe e sia disponibile nella regione e nella zona della VM. Assicuratevi inoltre che il vostro account disponga delle autorizzazioni necessarie e che Azure VM Agent sia funzionante, perché il parametro FixOperatingSystemSettings utilizza Azure Run Command.
Download dello script di conversione
La conversione viene eseguita tramite lo script PowerShell Azure-NVMe-Conversion.ps1, pubblicato da Microsoft nel repository SAP on Azure Scripts and Utilities.
Dalla sessione di Azure Cloud Shell eseguite il seguente comando:
|
1 2 |
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/Azure/SAP-on-Azure-Scripts-and-Utilities/refs/heads/main/Azure-NVMe-Utils/Azure-NVMe-Conversion.ps1" -OutFile ".\Azure-NVMe-Conversion.ps1" |
Il comando scarica lo script nella directory corrente di Cloud Shell. Se non vengono restituiti errori, potete procedere con la conversione.
Esecuzione dello script di conversione
Eseguite lo script mentre la macchina virtuale è accesa. Il parametro FixOperatingSystemSettings utilizzaAzure Run Command per verificare la configurazione del sistema operativo e impostare il driver StorNVMe per l’avvio. Per completare questa operazione, Azure VM Agent deve essere disponibile e funzionante.
Non dovete arrestare manualmente la VM: dopo aver completato i controlli, lo script provvede automaticamente ad arrestarla e deallocarla.
Attenzione: la conversione comporta un periodo di indisponibilità. Prima di procedere pianificate il fermo della VM e verificate di disporre di un backup recente e di una procedura di ripristino testata.
La sintassi generale del comando è la seguente:
|
1 2 |
.\Azure-NVMe-Conversion.ps1 -ResourceGroupName <your-RG> -VMName <your-VMname> -NewControllerType <NVMe/SCSI> -VMSize <new-VM-SKU> -FixOperatingSystemSettings -WriteLogfile -StartVM |
Sostituite i valori racchiusi tra parentesi angolari con quelli del vostro ambiente:
- ResourceGroupName: Resource Group che contiene la VM.
- VMName: nome della macchina virtuale.
- NewControllerType: controller di destinazione, NVMe oppure SCSI.
- VMSize: nuova SKU compatibile con il controller scelto.
Nel mio laboratorio ho utilizzato il seguente comando:
|
1 2 |
.\Azure-NVMe-Conversion.ps1 -ResourceGroupName Laboratorio -VMName TEST001 -NewControllerType NVMe -VMSize Standard_E4s_v6 -FixOperatingSystemSettings -WriteLogfile -StartVM |
Il comando converte la VM TEST001, contenuta nel Resource Group Laboratorio, verso la dimensione Standard_E4s_v6 e imposta il controller NVMe. Lo script prepara Windows, genera un file di log e riavvia automaticamente la VM al termine.
Attenzione: lasciate la VM accesa quando avviate lo script. Se utilizzate FixOperatingSystemSettings, lo script deve poter comunicare con il sistema operativo tramite Azure Run Command.

Figura 3: Esecuzione dello script di conversione della VM TEST001 da Standard_D4s_v3 con controller SCSI a Standard_E4s_v6 con controller NVMe
Verifica del controller tramite Azure PowerShell
Dopo il riavvio della VM verificate che Azure abbia impostato correttamente il nuovo controller.
Da Azure Cloud Shell recuperate la configurazione della macchina virtuale:
|
1 2 |
$vm = Get-AzVM -ResourceGroupName Laboratorio -VMName TEST001 |
Visualizzate quindi il tipo di controller configurato:
|
1 2 |
$vm.StorageProfile.DiskControllerType |
Se la conversione è stata completata correttamente, il comando restituisce NVMe

Figura 4: Verifica tramite Azure PowerShell del controller NVMe configurato sulla VM TEST001
Verifica del controller all’interno di Windows
Nel comando di conversione ho utilizzato il parametro StartVM, che richiede allo script di riaccendere automaticamente la macchina virtuale al termine delle modifiche.
Al termine della conversione lo script ha riacceso automaticamente la VM grazie al parametro StartVM. Non appena Windows è tornato disponibile, mi sono collegato tramite Desktop remoto e ho effettuato le verifiche mostrate nella figura sotto.
In Gestione dispositivi, espandendo la sezione Controller di archiviazione, nel mio laboratorio è presente ASAP NVMe Express Controller. In altre configurazioni Windows potrebbe visualizzare un nome differente, ad esempio Standard NVM Express Controller.In Gestione attività, nella scheda Prestazioni, il disco di sistema C: viene invece riconosciuto come SSD (NVMe) e identificato come Virtual Disk NVME Premium.
Attenzione: la VM Standard_E4s_v6 non dispone di un disco temporaneo locale. Nel mio laboratorio il file di paging, precedentemente presente sul disco temporaneo D:, è stato quindi collocato sul disco di sistema C:.

Figura 5: Verifica tramite Desktop remoto del controller NVMe e del disco di sistema dopo la conversione
Quando ripristinare il controller SCSI
La conversione può essere annullata se la VM non si avvia correttamente, se Windows non riconosce i dischi oppure se applicazioni, driver o strumenti di monitoraggio non risultano compatibili con il controller NVMe.
Il rollback può essere utile anche quando la nuova SKU non soddisfa le vostre esigenze, ad esempio perché manca il disco temporaneo locale, cambiano le prestazioni oppure aumenta il costo della VM.
Al termine della conversione lo script mostra il comando necessario per ripristinare la configurazione precedente. Nel mio laboratorio è il seguente:
|
1 2 |
.\Azure-NVMe-Conversion.ps1 -ResourceGroupName Laboratorio -VMName TEST001 -NewControllerType SCSI -VMSize Standard_D4s_v3 -StartVM |
Il comando ripristina la dimensione Standard_D4s_v3, reimposta il controller SCSI e riaccende automaticamente la VM.
Nota: conservate il comando di rollback e il file di log generato durante la conversione.
Conclusioni
La procedura permette di convertire una VM Azure da un controller SCSI a un controller NVMe senza reinstallare il sistema operativo e senza sostituire o migrare i Managed Disk. Lo script modifica comunque alcune impostazioni del sistema operativo necessarie per l’avvio tramite NVMe.
È importante non confondere questa procedura con l’abilitazione di Native NVMe in Windows Server 2025. In questo caso modificate il controller virtuale esposto da Azure alla VM, mentre Native NVMe riguarda il nuovo stack di archiviazione interno al sistema operativo.
La prova dimostra quindi che anche un virtualizzatore può presentare dispositivi NVMe al sistema operativo guest, a condizione che l’infrastruttura e la dimensione della VM lo supportino. In Azure questa possibilità è disponibile sulle VM compatibili con Azure Boost, incluse diverse SKU di nuova generazione.