Virtualizzare disco fisico per avviare Linux in Windows con Hyper-V

Indice

Motivazioni

Recentemente ho comprato un nuovo portatile (Asus ZenBook UX450FDX), peccato che Asus è poco amica dei sistemi Linux ed Asus stessa ha dichiarato che non esistevano drivers ufficiali. Ho deciso di virtualizzare il disco fisico del PC vecchio ed avviare la vecchia Linux installata, dentro una macchina virtuale Hyper-V. Questo motore virtuale è disponibile su tutti i sistemi operativi Windows 10 (Pro, Education ed Enterprise). Valutando l'utilizzo che se ne vuole fare (del sistema Linux vecchio), si potrebbe valutare che le prestazioni offerte dai dispositivi virtuali sono sufficienti, mentre per le attività che necessitano di più prestazioni, si potrà valutare di eseguirle sul sistema Windows sfruttando i driver ad hoc, potenzialità e funzionalità che poi di fatto vengono usate anche nel sistema Linux virtualizzato. Per esempio la tastiera illuminata solo in Linux non funzionerebbe mentre nella Linux virtualizzata sì.
Di seguito i passi da seguire con vantaggi e svantaggi di questa soluzione.

Linux Hyper-V

 

1) Aggiornamento kernel vecchia Linux

Prima di partre con la clonazione è consigliabile aggiornare il kenel alla versione 4.x per almeno i seguenti due motivi:

  • il nuovo PC sarà troppo nuovo e differente rispetto al vecchio
  • probabilmente dopo il ripristino del bootloader al primo avvio si avrà il seguente errore:
    dracut-initqueue[]: Warning: Could not boot.

    Errore Dracut

Una possibile causa è che la versione del kernel installato è minore del 4.x che non supporta la virtualizzazione del discho di Hyper-V, come spiegato in questo articolo ). Se hai una CentOS ti consiglio di seguire questo altro tutorial per aggiornarlo.

2) Clonazione del disco

Ipotizzando di avere ancora il vecchio pc funzionante o comunque avere accesso al disco, avviare una distribuzione Linux (Es. GpartedLive distribition) ed usare il comando dd per convertire il disco in un file immagine

dd if=/dev/sda of=/media/dati/Linux.img

dove nell'esempio:

  • /dev/sda : è il disco da clonare del sistema vecchio
  • /media/dati/Linux.img : è il file immagine che verrà usato come disco nella nuova macchina virtuale ( VM )

Essendo di discrete dimensioni ( 256 GB ) ho preferito montare un disco esterno da poi usare sul PC nuovo per completare la migrazione. Da notare che bisogna clonare il disco intero (no partizione per partizione) in quanto le sole partizioni non si porterebbero dietro il settore di boot ( MBR - Master Boot Record ) del disco, soprattutto se NON usate UEFI ( Unified Extensible Firmware Interface ).

3) Conversione del file immgine in un formato "disco"

Il motore Hyper-V utilizza come disco un file in formato vhdx, è quindi necessario convertire il formato "raw" in formato "vhdx". Per poterlo convertire consiglio di installare lo strumento gratuito qemu. Successivamente nel nuovo sistema Windows eseguire con i privilegi da amministratore:

cmd
"qemu-img-win-x64-2_3_0\qemu-img.exe" convert E:\VM\Linux.img -O vhdx -o subformat=dynamic diskLinux.vhdx

in questo modo il nuovo file diskLinux.vhdx sarà quello da utilizzare nella macchina virtuale.

4) Ridurre il disco al minimo necessario

Portando l'esempio della Linux vecchia insieme ad un altro sistema operativo in un unico disco, con quindi almeno 3 partizioni inutili, ecco come fare per liberare spazio togliendole prima di usare il disco virtuale nella nuova VM. Personalmente ho liberato 110 GB .

disco vecchio virtuale

4.1) Ridurre alle partizioni necessarie

Creare quindi la macchina virtuale nuova con Hyper-V, in base al tipo di bootloader vecchio (che sarà da ripristinare) scegliere :

  • Generazione 1 se bootloader "vecchio" classico MBR
  • Generazione 2, altrimenti

Successivamente configurare di usare un disco esistente e sceglere il file immagine convertito precedentemente ( diskLinux.vhdx ). Prima di avviare la VM col sistema vecchio, nuovamente avviarla da una Linux Live che abbia uno strumento per gestire le partizioni come gparted, consiglio sempre GpartedLive (2) Clonazione del disco), per farlo potrai montare la ISO come disco esterno ( Supporti > Unità DVD > Inserisci Disco , selezionare la ISO ) .
Avviato gparted fare pulizia delle partizioni inutili e spostare quelle da usare all'inizio del disco in modo che lo spazio "non allocato" rimanga in fondo. Fare poche operazioni alla volta e confermarle / eseguirle di volta in volta. No preoccuparsi se si sbaglia qualcosa, si ha ancora il disco fisico da cui ripartire a facendo l'immagine si può ripartire dal punto : 2) Clonazione del disco .

disco vecchio virtuale dopo

4.2) Verifiche file /etc/fstab

Se le partizioni sono state solo spostate/ridimensionate e non ricreate, probabilmente il file /etc/fstab potrà rimanere invariato in quanto UUID (Universally Unique IDentifiers) della partizione è rimasta uguale.
In questo esempio nel sistema Linux vecchio c'erano due partizioni in più: una di dati (UUID=3260A2AB60A274EF) che ho preferito clonare a sua volta sul disco del PC nuovo ( attraverso lo strumento AOMEI Partition Assistant Standard Edition ) per usarla direttamente anche sul sistema nuovo Windows 10 e successivamente montata come cartella convisa (convisione Windows) per usarla nella VM "montata" nella stessa cartella di prima ( /media/dati ). La seconda partizione era del Windows vecchio ed avendola eliminata l'ho anche dovuta togliere dalle partizioni presenti del file di configurazione, per farlo montare la partizione del sistema Linux vecchio e variare il file /etc/fstab
Da:

UUID=3fa27ad6-26eb-4a85-857d-efbfaea12a79 /                       ext4    defaults        1 1
UUID=974cbaf2-a1ba-4806-943b-ed0a64d6fae0 /home                   ext4    defaults        1 2
UUID=7D9C7E5D66A3DB03 /media/dati          ntfs-3g    users,users,gid=100,uid=1000,umask=007,locale=it_IT.UTF-8 0 1
UUID=3260A2AB60A274EF /media/win7          ntfs-3g    users,users,gid=100,uid=1000,umask=027,locale=it_IT.UTF-8 0 1
UUID=4de39dd1-e008-49f9-88ad-99a168d488ab swap                    swap    defaults        0 0
none /dev/shm tmpfs rw,nosuid,nodev,noexec 0 0

A:

UUID=3fa27ad6-26eb-4a85-857d-efbfaea12a79 /                       ext4    defaults        1 1
UUID=974cbaf2-a1ba-4806-943b-ed0a64d6fae0 /home                   ext4    defaults        1 2
#UUID=7D9C7E5D66A3DB03 /media/dati          ntfs-3g    users,users,gid=100,uid=1000,umask=007,locale=it_IT.UTF-8 0 1
//BoymixWin/dati /media/dati	cifs	credentials=/root/credentialSMBWin,vers=3.0,iocharset=utf8,gid=100,uid=1000  0	1
#UUID=3260A2AB60A274EF /media/win7          ntfs-3g    users,users,gid=100,uid=1000,umask=027,locale=it_IT.UTF-8 0 1
UUID=4de39dd1-e008-49f9-88ad-99a168d488ab swap                    swap    defaults        0 0
none /dev/shm tmpfs rw,nosuid,nodev,noexec 0 0

disco vecchio virtuale dopo

4.3) Ridurre lo spazio del file "vhdx"

A VM spenta, si scoprirà che dopo aver eseguito i passi precedenti, il file "vhdx" rimane grosso ed invariato inoltre, ci sarà un secondo file con estensione "avhdx" enorme ( nell'esempio era di 20G ), creato in base alle operazioni fatte sul disco mentre la VM era accesa. É quindi necessario:

  • unire i due files: per farlo rimuovere i punti di ripristino che vengo creati manualmente o dal sistema. Se questa operazione il file "vhdx" rimane quello originale senza le modifiche
  • dalle impostazioni nella console di Hyper-V eseguire le seguenti "azioni" sul disco:
    • Riduci : per definire che il disco è più piccolo

      riduci disco vecchio virtuale

    • Compatta : per ridurre realmente il file

      riduci disco vecchio virtuale

5) Ripristinare il bootloader

In base alla tipologia di boot che si stava utilizzando sul sistema vecchio, UEFI (più recente) o MBR (più vecchio), o se comunque si sta usando GRUB, il consiglio è di usare strumenti come Super Grub 2 o simili, avviando un sistema esterno e rirpistinado il boot sul disco virtuale. Successivamente verrà avviata la VM col sistema Linux vecchio.
Se invece si utilizza una CentOS 7 nell'esempio seguito, si può usare direttamente la iso di installazione di CentOS, non essendo in questo contesto il tema centrale, consiglio di seguire questo tutorial.

riduci disco vecchio virtuale

6) Facilitarsi la vita in Hyper-V

Purtroppo al primo utilizzo alcune cose scontate, come il copia incolla dal sistema Windows alla VM oppure l'impostazione dell'IP statico della scheda di rete della macchina virtuale, non funzionano.
Ecco alcuni consigli e problemi riscontrati .

6.1) Impostazione della risoluzione scheda video VGA Hyper-V

Al primo accesso, ci si potrebbe trovare con una risoluzione ridotta, per variarla velocemente (Es. 1366x768), se si utilizza grub2, avviare la Bash Shell e con i massimi privilegi (da utente "root") eseguire :

grubby --update-kernel=ALL --args="video=hyperv_fb:1366x768"

al riavvio successivo si avrà la nuova risoluzione.

6.2) Configurare la scheda di rete della VM con IP fisso

Hyper-V permette di aggiungere dispositivi di rete, di default alla creazione della VM viene proposto un "default switch" che viene configurato condividendo il dispositivo di rete usato dal sistema che ospita la VM. In questo modo la rete all'interno della VM sarà completamente diversa ed il traffico attraverso il protocollo NAT (Network Address Translation) viene passato dalla rete della VM alla rete usata dalla macchina che la ospita.
Preferendo il mantenimeno della configurazione della Linux vecchia e far appartenere la VM alla stessa rete della macchina che la ospita è necessario configurare il dispositivo di rete come commutatore della scheda fisica della macchina che ospita la VM. Se mentre la si configura si ottiene l'errore :

commutatore virtuale Hyper-V wi-fi errore irreversibile

è necessario togliere la condivisione sul dispositivo fisico e poi successivamente aggiungere il commutatore esterno. Qualsiasi sia il dispositivo fisico (nell'esempio la WiFi del portatile) quella vista nella VM sarà una scheda di rete ethernet facilmente riconoscibile dal kernel Linux. Così facendo si potrà ripristinare l'IP fisso usato sulla Linux vecchia. Di fatto Hyper-V crea una scheda di rete nuova sul sistema che ospita la VM (Es. "vEthernet (Scheda WI-fi)" ).

vEthernet (Scheda WI-fi)

6.3) Connettersi in Remote Desktop Protocol alla VM Linux

Una cosa scontata come il copia incolla dal sistema ospitante alla VM o viceversa con la classica connessione di Hyper-V, non funziona. In verità per permettere l'iterazione tra sistema ospitante e VM , nel sistema della VM vengono installati da Hyper-V alcune servizi, e nonostante il loro avvio corretto che si può verificare col comando sotto indicato

$ ps -ef | grep hyper
root       757     1  0 06:55 ?        00:00:00 /usr/sbin/hypervvssd -n
root       903     1  0 06:55 ?        00:00:00 /usr/sbin/hypervkvpd -n

nella VM questa funzionalità non funziona.
Per aggirare il problema, e per avere anche altri vantaggi, come l'accesso da remoto alla VM da qualsiasi altro dispositivo in rete, si può installare il protocollo di "Desktop Remoto" inventato da Microsoft, per Linux chiamato XRDP ( X Windows System RDP, progetto open di RDP ).
Per installarlo ( nell'esempio per CentOS 7, ma i passi sono simili per agli altri OS ) consiglio la seguente guida.
Se dopo l'autenticazione riscontri il seguente avviso/errore

è richiesta l'autenticazione per creare un profilo colore

è un bug di CentOS ( https://bugzilla.redhat.com/show_bug.cgi?id=1149893 ), basterà creare il file seguente

/etc/polkit-1/rules.d/02-allow-colord.rules

polkit.addRule(function(action, subject) {
   if ((action.id == "org.freedesktop.color-manager.create-device" ||
        action.id == "org.freedesktop.color-manager.create-profile" ||
        action.id == "org.freedesktop.color-manager.delete-device" ||
        action.id == "org.freedesktop.color-manager.delete-profile" ||
        action.id == "org.freedesktop.color-manager.modify-device" ||
        action.id == "org.freedesktop.color-manager.modify-profile") &&
       subject.isInGroup("users")) {
      return polkit.Result.YES;
   }
});

successivamnete dare i permessi al gruppo di appartenenza dell'utente che fa accesso al sistema ( Es. users ) .
Ora la gestione del copia incolla di testo e files, della risoluzione di accesso alla VM, la condivisione dei dischi della macchina ospitante, è demandata alle opzioni avanzate del programma di desktop remoto usato e funziona perfettamente.

Configurazione RDP

6.4) Ora di sistema sbagliata

La decisione di virtualizzare, è stata presa anche per facilmente salvare lo stato della VM e riavviarla quando necessario dal punto di salvataggio. Probabilmente al riavvio l'ora di sistema è però ferma a quando ci si era fermati precedentemente. Scegliendo di connettersi in RDP come spiegato in precedenza, un trucco per ovviare a questo inconveniente potrebbe essere sincronizzare l'ora ad ogni login, di seguito i passi da seguire.

  1. Per impostare l'ora si consiglia di installare il noto software rdate, successivamente è necessario dare i permessi di esecuzione giusti del comando in quanto chiunque può leggere l'ora, ma per impostarla è necessario avere i diritti amministrativi. Per permettere a tutti gli utenti ( gruppo users ) di poterlo fare in fase di login, aggiungere la seguente riga nel file "sudores"

    /etc/sudoers
    #users can run rdate
    %users ALL=(ALL) NOPASSWD: /usr/bin/rdate
    
  2. Successivamente vanno modificati i files che vengono invocati in fase di login, o login con la connessione attiva, normalmente i files sono nella cartella /etc/xrdp/ mentre in CentOS sono in /usr/libexec/xrdp/ , creare quindi i seguent scripts:
    • reconnectwm.sh
      #!/bin/bash 
      
      #set date
      sudo rdate -s time.inrim.it
      
    • startwm-bash.sh
      #!/bin/bash -l
      . /usr/libexec/xrdp/startwm.sh
      
  3. Infine modificare startwm.sh alla fine del file prima del richiamo della funzione wm_start aggiungere :
    . /usr/libexec/xrdp/reconnectwm.sh
    wm_start
    exit 1
    

6.5) Problemi di RAM ( Random Access Memory )

Se non si configura opportunamente la VM può succedere che dopo un salvataggio, il riavvio successivo non venga fatto perchè non c'è abbastanza RAM nel sistema ospitante libera sufficiente per avviare anche la VM. In fase di salvataggio Hyper-V si salva anche la RAM utilizzata e di default alla creazione della VM il limite massimo è uguale alla quantità massima di RAM sulla macchina che ospita la VM ma se al secondo avvio si ha meno RAM libera di quella di quando si era fatto il salvataggio, la VM salvata non potrà partire. In questa situazione l'unica procedura per avviarla è la seguente

  • stoppare i processi che occumano maggiore RAM (che non compromettano il funzionamento di Windows) fino ad arrivare alla minima RAM richiesta. E' possibile individuarli da
    "Gestione attività" > "dettagli"
    Visualizza tutti i processi
    
  • avviare la VM e spegnerla per cambiare le configrazioni come sotto indicato

E' quindi buona norma cambiare il limite massimo della RAM della VM in modo da avere un buon margine con delle buone prestazioni. Nell'esempio con 16G di RAM nel sistema ospitante si è messo il limite a 8G in modo da averne altrettante per Windows, diversamente Hyper-V come già menzionato cercherà di occuparne il massimo possibile.

Configurazione RAM

6.6) Audio non si può aggiungere come periferica

Nuovamente come per altri dispositivi, da Hyper-V non è possibile aggiungere le perifiriche audio e l'unico modo per esempio per ascoltare musica dalla VM è connettersi nuovamente in RDP e condividere l'audio dalle impostazioni avanzate, come anche suggerito da Microsoft stessa.

Conclusioni

Scegliere la virtualizzazione con Hyper-V non è una strada facile, non è stata confrontata con altri motori ( VMWare oppure VirtualBox ) e diverse difficoltà sono state riscontrate, va comunque detto che una volta funzionante si sta rilevando una soluzione più comoda e funzionale del classico metodo di "dualboot" per poter usare due sistemi diversi come Linux e Windows nello stesso PC, basti solo pensare che ora per fare un backup della macchina basta farsi una copia del disco virtuale... Infine una grossa utilità è connettersi alla VM in RDP.