
L'utilizzo delle macchine virtuali su Linux in Hyper-V è un'attività decisamente meno confortevole rispetto a quella con le macchine Windows. Questo è dovuto al fatto che Hyper-V non è stato originariamente progettato per l'uso su desktop; non è possibile semplicemente installare il pacchetto di aggiunte per gli ospiti e avere un'accelerazione grafica funzionante, il copia e incolla, directory condivise e altre comodità della vita, come avviene in VirtualBox.
Hyper-V fornisce — ad esempio, gli ospiti possono utilizzare il servizio di shadow copy (VSS) dell'host, è possibile inviare un segnale di spegnimento agli ospiti, gli ospiti possono sincronizzare l'orario di sistema con l'host di virtualizzazione, e dall'host è possibile scambiare file con la macchina virtuale (Copy-VMFile in PowerShell). Per alcuni sistemi operativi guest, tra cui ovviamente Windows, è disponibile la modalità di sessione avanzata nell'applicazione Virtual Machine Connection (vmconnect.exe) che funziona tramite protocollo RDP e consente di passare all'interno della macchina virtuale dispositivi di archiviazione e stampanti, oltre a utilizzare il clipboard condiviso.
La modalità di sessione avanzata funziona già in Windows su Hyper-V immediatamente dopo l'installazione. Con gli ospiti Linux è necessario installare un server RDP che supporti vsock (uno spazio di indirizzi di rete virtuale speciale in Linux destinato alla comunicazione con l'hypervisor). Se per Ubuntu nell'applicazione VMCreate, inclusa con Hyper-V nelle versioni desktop di Windows, esiste un modello di macchina virtuale preparato in cui il server RDP funzionante con vsock è già preinstallato, per altre distribuzioni il tutto è meno chiaro — ad esempio, l'autore è riuscito ad attivare ESM su Fedora. Qui attiviamo la modalità di sessione avanzata per una macchina virtuale con Arch Linux.
Installazione dei servizi di integrazione
Qui è tutto più o meno semplice, dobbiamo solo installare il pacchetto hyperv dal repository community:
% sudo pacman -S hypervAttiveremo i servizi VSS, scambio e file:
% for i in {vss,fcopy,kvp}; do sudo systemctl enable hv_${i}_daemon.service; doneInstallazione di XRDP
Repository su GitHub fornisce script che automatizzano il processo di installazione e configurazione di XRDP, per Arch Linux e Ubuntu. Installeremo Git, se non è già installato, insieme al compilatore e ad altri software per build manuali, dopo di che cloneremo il repository:
% sudo pacman -S git base-devel
% git clone https://github.com/microsoft/linux-vm-tools.git
% cd linux-vm-tools/archAl momento della stesura di questo articolo, l'ultima versione di XRDP installabile tramite lo script makepkg.sh, proposto nel repository, è la 0.9.11, vsock://degli indirizzi è rotto, quindi sarà necessario installare XRDP da Git e il driver Xorg da AUR manualmente. Anche la patch a XRDP proposta in AUR è leggermente obsoleta, quindi sarà necessario modificare manualmente il PKGBUILD e la patch.
Cloniamo i repository con i PKGBUILD da AUR (solitamente questa procedura viene automatizzata con programmi come , ma l'autore ha eseguito tutta questa procedura su un sistema pulito):
% git clone https://aur.archlinux.org/xrdp-devel-git.git
% git clone https://aur.archlinux.org/xorgxrdp-devel-git.gitIniziamo installando XRDP. Apriamo il file PKGBUILD con un qualsiasi editor di testo.
Modifichiamo i parametri di compilazione. Il PKGBUILD per la compilazione di XRDP da Git non include il supporto per vsock durante la compilazione, quindi abilitiamolo manualmente:
build() {
cd $pkgname
./configure --prefix=/usr
--sysconfdir=/etc
--localstatedir=/var
--sbindir=/usr/bin
--with-systemdsystemdunitdir=/usr/lib/systemd/system
--enable-jpeg
--enable-tjpeg
--enable-fuse
--enable-opus
--enable-rfxcodec
--enable-mp3lame
- --enable-pixman
+ --enable-pixman
+ --enable-vsock
make V=0
}Nella patch arch-config.diff, che modifica le unità e gli script di avvio di XRDP per i percorsi dei file utilizzati in Arch Linux, è inclusa anche una patch allo script instfiles/xrdp.sh, che al momento della stesura dell'articolo dalla fornitura di XRDP, quindi sarà necessario modificare manualmente la patch:
[Install]
WantedBy=multi-user.target
-diff -up src/xrdp-devel-git/instfiles/xrdp.sh.orig src/xrdp-devel-git/instfiles/xrdp.sh
---- src/xrdp-devel-git/instfiles/xrdp.sh.orig 2017-08-30 00:27:28.000000000 -0600
-+++ src/xrdp-devel-git/instfiles/xrdp.sh 2017-08-30 00:28:00.000000000 -0600
-@@ -17,7 +17,7 @@
- # Description: starts xrdp
- ### END INIT INFO
-
--SBINDIR=/usr/local/sbin
-+SBINDIR=/usr/bin
- LOG=/dev/null
- CFGDIR=/etc/xrdp
-
diff -up src/xrdp-devel-git/sesman/startwm.sh.orig src/xrdp-devel-git/sesman/startwm.sh
--- src/xrdp-devel-git/sesman/startwm.sh.orig 2017-08-30 00:27:30.000000000 -0600Compiliamo e installiamo il pacchetto con il comando % makepkg --skipchecksums -si (la chiave --skipchecksums è necessaria per disabilitare il controllo dei checksum dei file sorgente, poiché li abbiamo modificati manualmente).
Passiamo alla directory xorgxrdp-devel-git, dopo di che semplicemente compiliamo il pacchetto con il comando % makepkg -si.
Passiamo alla directory linux-vm-tools/arch e avviamo lo script install-config.sh, che imposta le configurazioni di XRDP, PolicyKit e PAM:
% sudo ./install-config.shLo script imposta una configurazione obsoleta use_vsock, che viene ignorata dalla versione 0.9.11, quindi modifichiamo manualmente il file di configurazione /etc/xrdp/xrdp.ini :
; port=vsock://:
-port=3389
+port=vsock://-1:3389
; 'port' sopra dovrebbe essere connesso con vsock invece di tcp
; usalo solo con il numero da solo nel porto sopra
; è preferibile usare vsock://: sopra
-use_vsock=true
+;use_vsock=true
; regola se il socket di ascolto utilizza l'opzione socket tcp_nodelayAggiungiamo al file ~/.xinitrc avvio del proprio gestore di finestre / ambiente desktop preferito, che verrà eseguito all'avvio del server X:
% echo "exec i3" > ~/.xinitrcSpegni la macchina virtuale. Attiva il trasporto vsock per la macchina virtuale eseguendo il seguente comando in PowerShell come amministratore:
PS Admin > Set-VM -VMName NOME_MACCHINA -EnhancedSessionTransportType HvSocketRiaccendiamo la macchina virtuale.
Collegamento
Non appena il servizio XRDP si avvia dopo il boot, l'applicazione vmconnect lo rileverà e nel menu sarà disponibile la voce Visualizza -> Sessione Avanzata. Se selezioniamo questa voce, ci verrà chiesto di impostare la risoluzione dello schermo, e nella scheda Risorse Locali della finestra di dialogo aperta sarà possibile scegliere i dispositivi da inoltrare nella sessione RDP.


Colleghiamoci. Vederemo la finestra di accesso XRDP:

Inseriamo il nostro nome utente e la password.
Utilizzo
Il profitto di queste operazioni è evidente: la sessione RDP è molto più reattiva rispetto a quella con un display virtuale senza Sessione Avanzata. Le unità inoltrate nella VM tramite RDP sono disponibili nella directory ${HOME}/shared-drives:

Il clipboard funziona correttamente. Non è possibile inoltrare le stampanti, poiché non solo non è supportato, ma . Anche l'audio non funziona, ma per l'autore questo non era necessario. Per catturare combinazioni di tasti come Alt+Tab, è necessario estendere vmconnect a schermo intero.
Se per qualsiasi motivo si desidera utilizzare invece dell'applicazione vmconnect il client RDP integrato in Windows o, ad esempio, connettersi a questa macchina da un'altra macchina, sarà necessario modificare nel file /etc/xrdp/xrdp.ini port in tcp://:3389. Se la macchina virtuale è connessa a Default Switch e riceve le impostazioni di rete tramite DHCP, è possibile connettersi ad essa dall'host all'indirizzo nome_macchina.mshome.net. È possibile accedere a TTY solo dall'applicazione vmconnect, disattivando la modalità avanzata.
Fonti utilizzate:
- Segnalazioni di bug su GitHub: ,
Fonte: habr.com
