Guest post: eseguire l’emulatore di Windows 10 Mobile all’interno di una virtual machine con Hyper-V

Questo post è stato scritto da Matteo Pagani, Windows AppConsult Engineer in Microsoft

Se seguite lo sviluppo di applicazioni per Windows Phone sin dai tempi della versione 7.0, ricorderete che l’avvento di Windows Phone 8.0 aveva segnato una novità piuttosto importante per quanto riguarda i tool di sviluppo: l’emulatore che, in passato, sfruttava un’architettura di virtualizzazione ad hoc, era stato migrato ad Hyper-V, il sistema di virtualizzazione di Microsoft. Ciò era stato reso possibile dal fatto che Hyper-V era stato integrato per la prima volta in un’edizione consumer di Windows (Windows 8) mentre, prima di allora, era una caratteristica esclusiva delle edizioni server di Windows.

Questo cambiamento ha portato ad una serie di vantaggi molto importanti, come una migliore integrazione con l’hardware del computer e la possibilità di sfruttarne le sue periferiche (touch screen, microfono, ecc.) all’interno dell’emulatore, così che lo sviluppatore possa usarlo come strumento quotidiano per il testing e delegare i test su un telefono reale solo per alcuni scenari particolari, come l’integrazione con dispositivi Bluetooth.

C’è però uno svantaggio: essendo l’emulatore, a tutti gli effetti, una virtual machine basata su Hyper-V, questo non è in grado di girare all’interno di un ambiente virtuale. Di conseguenza, per poterlo sfruttare è obbligatorio utilizzare una copia di Windows 10 installata, come si dice in gergo, “sul ferro”, ovvero fisicamente sul computer. Ci sono molti motivi per cui potreste avere la necessità di sfruttare una macchina virtuale: ad esempio, potreste voler tenere l’ambiente di sviluppo per applicazioni Windows Store separato da quello principale, nel quale invece avete la necessità di utilizzare altri ambienti di sviluppo o versioni di Visual Studio più vecchie. Nel mio caso, mi sono trovato in questa situazione in fase di preparazione di un laboratorio per TechReady, la conferenza interna di aggiornamento su temi tecnici per i dipendenti Microsoft che si tiene due volte l’anno a Seattle. Tale laboratorio girerà all’interno di un ambiente virtuale, che sarà replicato su numerosi computer a cui avranno accesso i partecipanti. Dato che il tema del laboratorio è lo sviluppo di applicazioni per la Universal Windows Platform, è importante per me dare la possibilità ai partecipanti di provare l’applicazione anche sull’emulatore mobile.

Fortunatamente, per risolvere questo problema ci viene in aiuto una funzionalità che è stata introdotta nel November Update di Windows 10 e nella Technical Preview 4 di Windows Server 2016: la nested virtualization. Come si può evincere dal nome stesso, questa funzionalità permette di creare ambienti virtuali all’interno di altri ambienti virtuali (ogni riferimento al film Inception è puramente casuale Smile)

hypervnesting

L’immagine qui sopra vi mostra un PC Windows 10, all’interno del quale è attiva una virtual machine con un’altra installazione di Windows 10 che, a sua volta, sta eseguendo un’altra virtual machine sempre con Windows 10. Dato che l’emulatore Windows Phone / Windows 10 Mobile non è altro che una virtual machine basata su Hyper-V, vi sarà semplice capire come la nested virtualization sia la soluzione al problema che mi sono trovato ad affrontare nella preparazione del laboratorio.

Ecco i passi da eseguire per raggiungere questo scopo:

  1. Innanzitutto dovete dotarvi di un PC con Windows 10 November Update (nella build 10240, ovvero la prima release di Windows 10, questa funzionalità non era presente) o successivo. Per averne la conferma, aprite un qualsiasi prompt dei comandi: in alto dovreste trovare la dicitura Microsoft Windows [Version 10.0.10586] . Ricordate, inoltre, che Hyper-V richiede la versione Pro o Enterprise di Windows 10 a 64 bit. Se, invece, state configurando un server, vi servirà almeno la versione Technical Preview 4 di Windows Server 2016. La versione più recente disponibile è la Tecnical Preview 5. Nota bene: deve trattarsi di una macchina on-premise, ovvero su cui è fisicamente installato Windows 10 o Windows Server. Le macchine virtuali presenti su Azure non supportano la nested virtualization: anche se installaste una versione di Windows che la supporta, dietro le quinte Azure gestisce comunque le virtual machine con Windows Server 2012, che non supporta tale funzionalità .

  2. Assicuratevi che, indipendentemente dalla versione di Windows che stiate utilizzando, Hyper-V sia correttamente installato. Lo trovate all’interno delle funzionalità di Windows: fate clic con il tasto destro sul menu Start, scegliete Programs and features e cliccate su Turn Windows features on or off.hyperv

     

  3. A questo punto, dalla console di gestione di Hyper-V (Hyper-V Manager, la trovate con una semplice ricerca nel menu Start) create una nuova virtual machine e procedete a configurarla come fareste normalmente, definendone dimensione, quantità di memoria RAM assegnata, ecc. E’ la virtual machine in cui andrete ad installare tutti i tool di sviluppo, quindi scegliete la versione di Windows più adatta in base alle vostre esigenze. Nel mio caso, ho creato una macchina virtuale con Windows 10 November Update e, successivamente, ho installato Visual Studio 2015 Enterprise. Nota bene: assicuratevi solamente, anche in questo caso, di installare una versione di Windows Pro o Enterprise a 64 bit. Dato che l’emulatore è una virtual machine Hyper-V, i requisiti sono gli stessi.

  4. Al termine dell’installazione del sistema operativo, fate clic con il tasto destro sul menu Start nella virtual machine e scegliete Program and features, Turn Windows features on or off. Vi accorgerete di come, nella sezione dedicata ad Hyper-V, sarete in grado di installare solamente i tool di gestione ma non la componente platform. Questo perchè Windows si lamenterà che la vostra macchina virtuale non supporta lo SLAT, ovvero le estensioni della CPU che consentono di sfruttare la virtualizzazione.

  5. A questo punto entra in gioco la nested virtualization, che al momento è possibile abilitare solamente tramite una serie di script Powershell. Fortunatamente Microsoft ha messo a disposizione uno script che esegue in automatico tutti i comandi necessari. Spegnete la virtual machine appena creata, cercate Powershell nel menu Start e lanciatelo.

  6. Ora eseguite il seguente comando:

     Invoke-WebRequest https://raw.githubusercontent.com/Microsoft/Virtualization-Documentation/master/hyperv-tools/Nested/Enable-NestedVm.ps1 -OutFile ~/Enable-NestedVm.ps1 
    ~/Enable-NestedVm.ps1 -VmName "DemoVM"
    

    Ricordatevi di sostituire il valore del parametro VmName con il nome della virtual machine che avete creato al punto 3.

  7. Il comando vi chiederà conferma prima di eseguire una serie di operazioni. Sono tutte obbligatorie (quindi rispondete sempre Y), tranne quella relativa all’impostazione di 4 GB di RAM nella configurazione della VM: è un valore caldamente consigliato affinchè la nested virtualization funzioni bene, ma non è obbligatorio.

  8. A questo punto, sempre nell’Hyper-V Manager, accedete alle impostazioni della macchina virtuale e assicuratevi che, alla voce CPU, siano assegnati almeno 2 core virtuali al processore. Senza questa modifica, l’emulatore di Windows Phone / Windows 10 Mobile non sarà in grado di partire correttamente.Processors

     

  9. Ora riavviate la virtual machine e tornate nella schermata di configurazione delle funzionalità di Windows: se avete svolto tutto correttamente, ora anche la voce Hyper-V Platform sarà selezionabile. Abilitate l’intera sezione dedicata ad Hyper-V e premete Ok: Windows procederà ad installare Hyper-V nel sistema. Saranno richiesti alcuni riavvi, perciò confermate quando Windows ve lo chiede.

  10. Ora il gioco è fatto: procedete ad installare Visual Studio 2015 e assicuratevi di includere i tool di sviluppo per 8.1 / 10 e gli emulatori. Al termine, provate a creare un progetto di tipo Universal Windows di prova e a farne il deploy sull’emulatore. Se tutto è andato a buon fine, la vostra virtual machine con Windows 10 lancerà al suo interno un’altra virtual machine con l’emulatore e avrete la possibilità di testare e debuggare la vostra applicazioni per la Universal Windows Platform.

Emulator

 

In conclusione

Tramite la funzionalità nested virtualization, aggiunta nel November Update di Windows 10 o nella Technical Preview 4 di Windows Server 2016, avete la possibilità di creare virtual machine nidificate basate su Hyper-V. Questa funzionalità torna molto utile per gli sviluppatori di Windows Store app, dato che permette di lanciare l’emulatore mobile all’interno di una virtual machine.

E’ importante, però, ricordare alcuni accorgimenti:

  1. Questa funzionalità non è supportata dalle virtual machine su Azure. Dovrete per forza utilizzare una soluzione on-premise, quindi partire da un PC o da un server con fisicamente installato Windows 10 November Update o Windows Server 2016 Technical Preview 5.
  2. Si tratta di una funzionalità ancora in beta: ne è sconsigliato, perciò, l’utilizzo in ambienti di produzione.
  3. Ci sono una serie di limitazioni che si applicano alla virtual machine di partenza e che trovate riassunte alla voce Known Issues della documentazione su https://msdn.microsoft.com/en-us/virtualization/hyperv_on_windows/user_guide/nesting. Alcune funzionalità non supportate sono l’utilizzo della gestione dinamica della memoria o dei checkpoint.

Happy coding! O forse in questo caso meglio dire happy virtualization Smile